Golang 基于 archive/zip 包实现文件

这里写自定义目录标题

    • 摘要
    • 引言
    • Go语言简介
    • archive/zip 包概述:
    • 环境准备
    • 基础概念:
      • 压缩的基本概念:
      • 解压缩的基本概念:
      • ZIP格式的特点:
      • ZIP文件的组成:
      • 使用ZIP的优点:
    • 使用 archive/zip 包进行文件压缩
      • 步骤 1: 引入必要的包
      • 步骤 2: 创建ZIP归档
      • 步骤3:设置压缩级别
      • 步骤 4: 添加文件到ZIP归档
      • 步骤 5: 检查错误并关闭zip.Writer
      • 完整示例代码
    • 使用 archive/zip 包进行文件解压缩
      • 步骤 1: 引入必要的包
      • 步骤 2: 打开ZIP归档文件
      • 步骤 3: 遍历ZIP归档中的所有文件
      • 步骤 4: 检查错误
      • 完整示例代码
    • 总结
      • 关键点总结
    • 参考资料
    • 呼吁行动

摘要

本文介绍了使用Go语言archive/zip包实现文件压缩与解压缩的方法。

  • 通过详细步骤和代码示例,展示了如何高效地压缩数据,节省存储空间,并提高传输效率。
  • 同时,探讨了性能优化和错误处理,为Go开发者提供了实用的压缩解决方案。

引言

在信息爆炸的今天,我们每天都在生成和处理大量的数据和文件。无论是企业内部的文档管理,还是个人的日常资料整理,一个高效、可靠的文件管理工具都是提高生产力的关键。文件批量下载功能,作为文件管理工具中的一个核心组件,能够让用户在有限的时间内快速获取所需文件,从而节省时间,提高工作效率。

然而,开发一个功能全面、用户友好的文件批量下载功能并非易事。它需要考虑到文件的组织结构、下载速度、错误处理以及用户界面的直观性等多种因素。本文将深入探讨如何在Go语言环境下,利用其强大的标准库和第三方库,开发出一个高效、稳定且易于使用的文件批量下载功能。

Go语言简介

Go语言,又称为Golang,是由谷歌开发的一种静态类型、编译型编程语言。以下是Go语言的一些主要特点和优势:

  1. 简洁性:Go语言的设计哲学是简单易学,语法简洁,使得代码易于编写和维护。
  2. 高性能:Go是编译型语言,编译后的程序运行速度快,接近C语言的性能。
  3. 并发支持:Go内置了对并发的支持,使用goroutine和channel可以轻松实现并发编程,而无需复杂的线程管理。
  4. 内存管理:Go拥有自动垃圾回收机制,简化了内存管理,减少了内存泄漏的风险。
  5. 跨平台编译:Go支持跨平台编译,可以在多种操作系统上编译和运行,包括Windows、Linux、macOS等。
  6. 标准库丰富:Go拥有一个功能强大的标准库,涵盖了网络编程、数据处理、加密算法等多个方面。
  7. 工具链完善:Go提供了一套完善的工具链,包括格式化工具gofmt、文档生成工具godoc、测试工具等。
  8. 社区活跃:Go语言由谷歌支持,拥有一个活跃的开发者社区,不断有新的库和框架被开发出来。
  9. 部署简单:Go编译后的程序是一个独立的可执行文件,不需要额外的运行时环境,简化了部署过程。
  10. 安全性:Go语言的设计注重安全性,例如通过内置的race detector工具来检测数据竞争问题。
  11. 兼容性:Go语言支持接口和类型系统,使得编写可扩展和可维护的代码变得更加容易。
  12. 错误处理:Go语言的错误处理机制鼓励显式处理错误,提高了程序的健壮性。

这些特点和优势使得Go语言在云计算、微服务架构、网络编程和系统编程等领域非常受欢迎。

archive/zip 包概述:

archive/zip 是 Go 语言标准库中的一个包,它提供了用于创建和读取 ZIP 归档文件的功能。ZIP 归档是一种广泛使用的压缩文件格式,它允许将多个文件和目录组合成一个单一的文件,并通常用于数据压缩和传输。

以下是 archive/zip 包的作用和它在 Go 语言中的位置的简要解释:

  1. 作用

    • 创建 ZIP 文件:可以将多个文件写入到一个新的 ZIP 归档中。
    • 读取 ZIP 文件:可以打开一个 ZIP 归档并读取其中的文件。
    • 文件压缩:在将文件添加到 ZIP 归档时,可以选择压缩它们以减少文件大小。
    • 文件解压缩:可以从 ZIP 归档中提取文件,并恢复它们的原始状态。
  2. 位置

    • archive/zip 包位于 Go 语言的标准库中,这意味着它随 Go 语言的安装而自动提供,无需额外安装或下载。
  3. 使用场景

    • 文件备份:将多个文件打包成 ZIP 格式,便于存储和传输。
    • 数据分发:将应用程序的数据或资源文件打包,方便分发给用户。
    • 归档旧文件:将不再频繁访问的文件压缩归档,节省存储空间。
  4. API 设计

    • 提供了简单的 API 来添加文件到 ZIP 归档,包括对文件的读取和写入。
    • 支持设置 ZIP 文件的注释和单个文件的注释。
    • 支持自定义压缩级别,以平衡压缩率和压缩速度。
  5. 与其他包的关联

    • 通常与 osiopath/filepath 等其他标准库包一起使用,以处理文件的路径、读取和写入操作。
  6. 易用性

    • 由于是标准库的一部分,archive/zip 包的 API 设计简洁直观,易于理解和使用。
  7. 社区支持

    • 作为 Go 语言的标准库之一,archive/zip 包得到了广泛的社区支持和维护,确保了其稳定性和可靠性。

通过 archive/zip 包,Go 语言开发者可以轻松地在他们的应用程序中实现文件压缩和归档的功能,无需依赖外部的压缩工具或库。

环境准备

对于使用Go语言和archive/zip包进行文件压缩的最小环境准备,以下内容是必需的:

  1. Go语言环境
    安装最新稳定版本的Go语言编译器和运行时环境。可以从Go语言官方网站下载安装包。

  2. 代码编辑器
    选择一个合适的代码编辑器或集成开发环境(IDE),如Visual Studio Code、GoLand、Atom等,它们支持Go语言的语法高亮、代码补全、错误检测等功能。

  3. 终端或命令提示符
    用于执行Go命令,如go mod init初始化模块、go build编译程序、go run运行程序等。

  4. 操作系统
    Go支持Windows、macOS、Linux等多种操作系统,根据你的开发需求选择合适的操作系统。

  5. Go Modules

    • 从Go 1.11版本开始,Go引入了模块支持,用于管理项目依赖。可以通过go mod命令来管理。
  6. 标准库文档

    • 访问Go语言的官方文档,特别是archive/zip包的文档,以便了解如何使用该包。

这些是进行Go语言开发和使用archive/zip包进行文件压缩所需的最基本的环境和工具。其他如版本控制工具、测试工具、构建工具等,虽然对开发过程很有帮助,但在最小化配置中不是必需的。

基础概念:

压缩和解压缩是数据存储和传输中常见的技术,它们可以有效地减少文件的体积,节省磁盘空间,加快数据传输速度。以下是压缩和解压缩的基本概念以及ZIP格式的特点:

压缩的基本概念:

  • 定义:压缩是将数据转换成更小体积的过程,通常用于减少文件大小,便于存储或传输。
  • 算法:压缩算法分为无损压缩和有损压缩。无损压缩允许完整恢复原始数据,而有损压缩则在压缩过程中可能会丢失部分数据,但通常用于图像和音频文件。
  • 类型:常见的无损压缩算法包括LZ77、LZ78、Deflate等。

解压缩的基本概念:

  • 定义:解压缩是将压缩后的数据恢复到原始大小的过程。
  • 目的:解压缩用于恢复压缩文件的原始内容,以便使用或进一步处理。

ZIP格式的特点:

  • 归档格式:ZIP是一种流行的归档文件格式,可以将多个文件和目录组织到一个单一的文件中。
  • 压缩:ZIP文件通常使用Deflate算法进行压缩,这是一种广泛使用的无损压缩算法。
  • 跨平台:ZIP格式被广泛支持,可以在多种操作系统和设备上使用。
  • 元数据保持:ZIP文件可以保持文件的元数据,如文件名、目录结构、时间戳等。
  • 加密:ZIP格式支持对文件进行加密,提供额外的安全性。
  • 注释:ZIP文件可以包含全局注释,以及每个文件的单独注释。
  • 多卷支持:ZIP文件可以分割成多个卷,适用于大文件的存储和传输。

ZIP文件的组成:

  • 中央目录:包含文件的元数据和压缩信息。
  • 文件头:每个文件在ZIP归档中的起始位置都有一个文件头,包含文件的基本信息。
  • 压缩数据:实际的压缩数据块。
  • 尾部:包含中央目录的结束记录,指示归档的结束。

使用ZIP的优点:

  • 兼容性:几乎所有现代操作系统都内置了对ZIP文件的支持。
  • 易用性:用户可以使用各种工具轻松创建和解压ZIP文件。
  • 效率:ZIP压缩算法在压缩效率和速度之间提供了良好的平衡。

理解压缩和解压缩的基本概念以及ZIP格式的特点,对于使用Go语言的archive/zip包进行文件压缩和解压操作非常重要。这有助于开发者在实现文件压缩功能时做出合理的设计决策。

使用 archive/zip 包进行文件压缩

以下是使用Go语言的archive/zip包来压缩文件的详细步骤和代码示例:

步骤 1: 引入必要的包

import (
    "archive/zip"
    "io"
    "os"
    "path/filepath"
)

步骤 2: 创建ZIP归档

// 创建一个新的ZIP归档文件
zipFile, err := os.Create("example.zip")
if err != nil {
    panic(err)
}
defer zipFile.Close()

// 创建一个zip.Writer
w := zip.NewWriter(zipFile)
defer w.Close()

步骤3:设置压缩级别

// 设置压缩级别,可选值有:
// zip.Store    (0) 存储模式,不进行压缩
// zip.Deflate  (-1) 默认压缩方法,通常提供较好的压缩率
// 其他值介于(-1, 9)之间,9为最高压缩率,但速度较慢
w.SetLevel(zip.Deflate) // 或者使用其他压缩级别

步骤 4: 添加文件到ZIP归档

// 遍历文件夹中的所有文件
err = filepath.Walk("path/to/directory", func(path string, info os.FileInfo, err error) error {
    if err != nil {
        return err
    }
    
    // 忽略目录
    if info.IsDir() {
        return nil
    }

    // 打开文件
    file, err := os.Open(path)
    if err != nil {
        return err
    }
    defer file.Close()

    // 为文件创建一个header
    header, err := zip.FileInfoHeader(info)
    if err != nil {
        return err
    }

    // 将文件路径设置为相对于给定目录的路径
    header.Name = filepath.ToSlash(path[len("path/to/directory"):])

    // 创建一个writer
    writer, err := w.CreateHeader(header)
    if err != nil {
        return err
    }

    // 将文件内容写入到zip归档中
    _, err = io.Copy(writer, file)
    if err != nil {
        return err
    }

    return nil
})
if err != nil {
    panic(err)
}

步骤 5: 检查错误并关闭zip.Writer

// 检查zip.Writer是否有错误
if err := w.Close(); err != nil {
    panic(err)
}

完整示例代码

package main

import (
    "archive/zip"
    "io"
    "os"
    "path/filepath"
)

func main() {
    // 要压缩的目录路径
    directoryPath := "path/to/directory"
    // 输出的zip文件名
    outputZipPath := "example.zip"

    // 创建ZIP文件
    zipFile, err := os.Create(outputZipPath)
    if err != nil {
        panic(err)
    }
    defer zipFile.Close()

    // 创建zip.Writer
    w := zip.NewWriter(zipFile)
    defer func() {
        if err := w.Close(); err != nil {
           panic(err)
        }
    }()
 	// 设置压缩级别
    w.SetLevel(zip.Deflate) // 使用Deflate压缩方法
    // 遍历目录
    err = filepath.Walk(directoryPath, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        if info.IsDir() {
            return nil
        }

        file, err := os.Open(path)
        if err != nil {
            return err
        }
        defer file.Close()

        header, err := zip.FileInfoHeader(info)
        if err != nil {
            return err
        }

        // 计算相对路径
        header.Name, err = filepath.Rel(directoryPath, path)
        if err != nil {
            return err
        }

        header.Name = filepath.ToSlash(header.Name)

        writer, err := w.CreateHeader(header)
        if err != nil {
            return err
        }

        _, err = io.Copy(writer, file)
        return err
    })
    
    if err != nil {
        panic(err)
    }
}

请注意,这个示例代码将指定目录下的所有文件添加到ZIP归档中,包括子目录中的文件。filepath.Walk函数用于遍历目录,zip.FileInfoHeader用于创建文件的header,io.Copy用于将文件内容写入ZIP归档。最后,我们需要检查并关闭zip.Writer以确保所有数据都被写入。

使用 archive/zip 包进行文件解压缩

以下是使用Go语言的archive/zip包来解压缩ZIP文件的详细步骤和代码示例:

步骤 1: 引入必要的包

import (
    "archive/zip"
    "io"
    "os"
    "path/filepath"
)

步骤 2: 打开ZIP归档文件

// 打开ZIP文件
zipFile, err := zip.OpenReader("example.zip")
if err != nil {
    panic(err)
}
defer zipFile.Close()

步骤 3: 遍历ZIP归档中的所有文件

// 遍历ZIP归档中的所有文件
for _, f := range zipFile.File {
    // 解析文件名
    filename, err := f.FileInfo().Name()
    if err != nil {
        panic(err)
    }

    // 根据文件名判断是目录还是文件
    if f.FileInfo().IsDir() {
        // 如果是目录,创建目录
        dirname := filepath.Join("destination_directory", filename)
        err = os.MkdirAll(dirname, f.FileInfo().Mode())
        if err != nil {
            panic(err)
        }
    } else {
        // 如果是文件,创建文件并解压
        fileToWrite, err := os.OpenFile(filepath.Join("destination_directory", filename), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.FileInfo().Mode())
        if err != nil {
            panic(err)
        }
        defer fileToWrite.Close()

        // 从ZIP归档中读取文件内容
        rc, err := f.Open()
        if err != nil {
            panic(err)
        }
        defer rc.Close()

        // 将内容写入到新文件
        _, err = io.Copy(fileToWrite, rc)
        if err != nil {
            panic(err)
        }
    }
}

步骤 4: 检查错误

// 检查并处理可能的错误
if err := zipFile.Close(); err != nil {
    panic(err)
}

完整示例代码

package main

import (
    "archive/zip"
    "io"
    "os"
    "path/filepath"
)

func main() {
    // ZIP文件路径
    zipFilePath := "example.zip"
    // 解压到的目录
    destDirectory := "destination_directory"

    // 打开ZIP文件
    zipFile, err := zip.OpenReader(zipFilePath)
    if err != nil {
        panic(err)
    }
    defer zipFile.Close()

    // 确保目标目录存在
    err = os.MkdirAll(destDirectory, 0755)
    if err != nil {
        panic(err)
    }

    // 解压ZIP归档中的所有文件
    for _, f := range zipFile.File {
        filename := filepath.Join(destDirectory, f.FileInfo().Name())

        // 如果是目录,则创建目录
        if f.FileInfo().IsDir() {
            err := os.MkdirAll(filename, f.FileInfo().Mode())
            if err != nil {
                panic(err)
            }
        } else {
            // 如果是文件,则解压文件
            fileToWrite, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.FileInfo().Mode())
            if err != nil {
                panic(err)
            }
            defer fileToWrite.Close()

            rc, err := f.Open()
            if err != nil {
                panic(err)
            }
            defer rc.Close()

            _, err = io.Copy(fileToWrite, rc)
            if err != nil {
                panic(err)
            }
        }
    }

    // 检查并关闭ZIP文件
    if err := zipFile.Close(); err != nil {
        panic(err)
    }
}

这个示例代码展示了如何打开一个ZIP文件,遍历其中的所有文件和目录,并将它们解压到指定的目录。注意,我们使用了os.O_CREATEos.O_TRUNC标志来创建新文件或截断已存在的文件。io.Copy用于将ZIP归档中的文件内容写入到解压后的文件中。最后,我们检查并关闭了ZIP文件以确保释放资源。

总结

使用Go语言的标准库archive/zip进行文件的压缩和解压缩涉及到几个关键点,以下是对这些关键点的总结:

关键点总结

  1. 包引入

    • 导入archive/zip包以及其他可能需要的包,如osiopath/filepath
  2. 创建ZIP归档

    • 使用zip.Createzip.NewWriter创建一个新的ZIP归档文件。
  3. 添加文件

    • 通过遍历文件系统,使用zip.Writer.CreateHeader为每个文件创建一个header,并用io.Copy将文件内容写入ZIP归档。
  4. 设置压缩级别

    • 通过zip.Writer.SetLevel方法设置压缩级别,选择不同的压缩算法和级别。
  5. 错误处理

    • 检查每一步操作是否有错误发生,并进行相应的错误处理。
  6. 关闭资源

    • 完成操作后,调用zip.Writer.Close来关闭ZIP归档,确保所有数据都被写入。
  7. 读取ZIP归档

    • 使用zip.OpenReader打开一个ZIP归档,并遍历其内容。
  8. 解压文件

    • 对于ZIP归档中的每个文件,使用io.Copy将内容解压到指定路径。
  9. 并发处理(高级):

    • 利用Go的并发特性,通过goroutines并行处理多个文件的压缩或解压任务。
  10. 性能优化

    • 考虑I/O操作、CPU使用率、内存使用等因素,优化压缩和解压的性能。

参考资料

以下是关于Go语言的archive/zip包进行文件压缩和解压缩的参考资料索引编号:

  1. Golang 学习笔记(五)- archive/zip 实现压缩及解压
  2. Go 语言文件操作:读取压缩文件
  3. archive/zip - Go 语言标准库 - Go 语言 - API参考文档
  4. zip package - archive/zip - Go Packages

这些资料提供了对archive/zip包的使用方法、主要方法介绍、使用示例以及一些高级用法的详细说明。

呼吁行动

  • 鼓励亲自动手尝试示例代码。实践是学习编程的最佳方式。复制代码到您的编辑器中,尝试运行它们,并观察结果。
  • 不要害怕修改代码。尝试更改参数或逻辑,看看它们如何影响压缩和解压缩的过程和结果。
  • 如果在实践过程中遇到任何问题,不妨将它们提出来。您可以在技术论坛、社区或者博客文章下方的评论区提出您的问题。

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

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

相关文章

行业洞察 | 2024应用程序安全领域现状报告

在信息爆炸的时代,我们每天都在使用各种应用,从社交娱乐到工作学习,应用已经成为我们生活中不可或缺的一部分。然而,你是否知道,在这些便捷的背后,隐藏着巨大的安全风险? 近年来,应用…

Build a Large Language Model (From Scratch)附录D(gpt-4o翻译版)

来源:https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

Windows系统安装SSH服务结合内网穿透配置公网地址远程ssh连接

前言 在当今的数字化转型时代,远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于 Windows 用户而言,SSH(Secure Shell)协议提供了一种安全、高效的远程访问和命令执行方式。SSH 不仅提供了加密的通信通道,…

单片机IO

一、简单GPIO口 保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。 当引脚电压高于VDD时,上方的二极管导通,电压被钳位在VDD0.7V; 当引脚电压低于VSS时,下方的二极管导通,防止不…

设计模型 - 学习笔记

学习参考: https://blog.csdn.net/m0_65346405/article/details/136994128 《系统分析师教程》 《设计模式之禅》 一. 设计模式的5大原则 1. 单一职责原则 一个类应该只有一个变化因子。 就是说,一个类要变化,比如增加功能,那么引…

Elasticsearch 8.x 存储有无压缩?能压缩到多少?

1、认知前提 Elasticsearch 支持压缩,压缩方式默认为:LZ4 压缩算法。 具体参见: The default value compresses stored data with LZ4 compression, but this can be set to best_compression which uses DEFLATE for a higher compression r…

mybatis mapper.xml 比较运算符(大于|小于|等于)的写法: 转义和<![CDATA[]]>

文章目录 引言I 使用xml 原生转义的方式进行转义II 使用 <![CDATA[ 内容 ]]>引言 应用场景:查询时间范围 背景:在 *.xml 中使用常规的 < > = <= >= 会与xml的语法存在冲突 <![CDATA[]]> 比 转义符 来的繁琐 <![CDATA[]]> 表示xml解析器忽略…

Linux内网端口转公网端口映射

由于服务商做安全演练&#xff0c;把原先服务器内网的端口映射到外网端口全都关闭了&#xff0c;每次维护服务器特别麻烦&#xff0c;像数据库查询如果用原生的mysql 去连接&#xff0c;查询返回的结果乱了&#xff0c;非常不方便。 查了服务还是可以正常访问部分外网的&#x…

mongodb在windows环境安装部署

一、mongodb 1.释义 MongoDB 是一种开源的文档型 NoSQL 数据库管理系统&#xff0c;使用 C 编写&#xff0c;旨在实现高性能、高可靠性和易扩展性。MongoDB 采用了面向文档的数据模型&#xff0c;数据以 JSON 风格的 BSON&#xff08;Binary JSON&#xff09;文档存储&#x…

Unity射击游戏开发教程:(29)躲避敌人的子弹射击

在这篇文章中,我将介绍如何创建一个可以使玩家火力无效的敌人。创建的行为如下...... 当玩家向敌人开火时,敌人会向左或向右移动。向左或向右的移动是随机选择的,并在一段时间后停止敌人的移动。如果敌人移出屏幕,它就会绕到另一边。将一个精灵拖到画布上,将其缩小以匹配游…

mdb转gdb实现过程介绍(2)三种方式实现GDB数据库的读、写,并将实现方式与ArcGIS环境共存配置

一、内容提示 通过解析mdb地理数据库&#xff0c;获取了图层之间的组织结构、空间参考、表字段属性等信息。 下一步&#xff0c;就是将数据输出到GDB中。 下面详细介绍python3.9版本&#xff0c;读写GDB数据的方法&#xff1a; &#xff08;1&#xff09;使用ArcPy创建GDB、读写…

【MySQL基础篇】函数及约束

1、函数 函数是指一段可以直接被另一段程序程序调用的程序或代码。 函数 - 字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用的几个如下&#xff1a; 函数功能CONCAT(S1,S2,...,Sn)字符串拼接&#xff0c;将S1,S2,...,Sn拼接成一个字符串LOWER(str)将字符串str全部…

STM32第十二课:ADC检测烟雾浓度(MQ2)

文章目录 需求一、MQ-2 气体传感器特点应用电路及引脚 二、实现流程1.开时钟&#xff0c;分频&#xff0c;配IO2.配置ADC的工作模式3.配置通道4.复位&#xff0c;AD校准5.数值的获取 需求实现总结 需求 使用ADC将MQ2模块检测到的烟雾浓度模拟量转化为数字量。 最后&#xff0c…

【ElementPlus源码】Button 按钮

文章目录 准备工作属性方法模板使用到的hooksuse-propuseDeprecated 看源码时候做的笔记。 准备工作 本地开发 | Element Plus (element-plus.org) 文档与源码对应&#xff1a;docs/examples/button 组件源码位置&#xff1a; packages/components/button/src 属性 定义在 …

C++面试宝典30题丨第一题:开灯

专栏导读 见得题目越多&#xff0c;考试时抽中的概率也越大。每一题都有详细的解答思路和独有的视频讲解。 本文收录于&#xff1a;C面试宝典&#xff08;送视频讲解&#xff09; ☆☆☆购买专栏后&#xff0c;请加微信会私发讲解视频&#xff01; 题目描述 一条名叫Mango的街…

图书管理系统(持久化存储数据以及增添新功能)

目录 一、数据库表设计 二、引入MyBatis 和MySQL 驱动依赖 三、配置数据库 & 日志 四、Model创建 五、枚举类 常量类用户登录 六、用户登录 七、添加图书 八、图书列表 九、修改图书 十、删除图书 十一、批量删除 十二、强制登录 十三、前端代码 &#xff0…

使用 HBuilder X 进行 uniapp 小程序开发遇到的问题合集

文章目录 背景介绍问题集锦1. 在 HBuilderX 点击浏览器运行时&#xff0c;报 uni-app vue3编译器下载失败 安装错误2.在 HBuilderX 点击微信小程序运行时&#xff0c;报 微信开发者工具打开项目失败&#xff0c;请参阅启动日志错误 背景介绍 HBuilder X 版本&#xff1a;HBui…

餐饮界的新传奇:沃可趣员工社区,让品牌关怀在指尖流淌

咖啡师与顾客发生肢体冲突、员工用咖啡粉泼顾客……某精品咖啡一天爆出两个大瓜&#xff01; 很快有网友指出咖啡店员工长期遭受重压&#xff0c;与品牌之间存在根本矛盾。 同样做餐饮的老牌快餐&#xff0c;门店密度与之不相上下&#xff0c;却很少发生这样的暴雷。 不仅因…

六.核心动画 - 特殊图层①

引言 本专栏到目前为止已经介绍了CALayer&#xff0c;了解了它的绘画和动画功能。但是Core Animation图层不仅仅能够用于图片和颜色&#xff0c;本篇博客就来介绍一下一些CALayer的子类特殊图层&#xff0c;来进一步扩展Core Animation的绘图能力。 特殊图层 Core Animation…

Vue实现金钱输入框组件自动带千位逗号

新建PriceInput.vue <template><div id"bord"><el-inputv-model"inputValue"v-bind"$attrs":maxlength"maxlength"input"handleInput"focus"handleFocus"blur"handleBlur"change"h…