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

asp.net core webapi中的数据注解与数据验证

在这一课中,主要讲解了如何在 Web API 中使用数据注解(Data Annotations)和进行数据验证,以确保请求数据的有效性和完整性。

在 Web API 中,数据验证是确保客户端传递的数据符合业务规则和格式要求的关键步骤。数据注解提供了一种简洁的方式来对模型进行验证,无需编写额外的验证逻辑。

一、什么是数据注解(Data Annotations)?

数据注解是 .NET 提供的一种用于模型属性的元数据标注方式。它通过在模型类的属性上应用特定的特性(Attribute)来定义验证规则。数据注解通常用于验证用户输入、控制数据存储格式、设置显示格式等。

常用的数据注解包括:

  • Required:表示该字段是必填的。
  • StringLength:限制字符串的最大长度或最小长度。
  • Range:指定数值字段的允许范围。
  • EmailAddress:验证电子邮件地址的格式。
  • RegularExpression:验证输入是否匹配特定的正则表达式。
  • Compare:验证两个字段的值是否相等(例如密码确认)。
  • CreditCard:验证信用卡号的格式。
  • Url:验证 URL 的格式。
  • Phone:验证电话号码格式。

二、Web API中的数据验证流程

  1. 定义数据模型:创建一个包含数据注解的模型类,模型类通常用于表示请求体(Request Body)中的数据。

  2. 使用数据注解:在模型类的属性上应用不同的数据注解特性,指定验证规则。

  3. 在控制器中接收数据:在 Web API 控制器中接收这些模型对象作为方法参数。

  4. 验证请求数据:当 Web API 接收到请求时,自动执行数据验证。如果数据无效,API 会返回错误响应,指明哪个字段的值无效。

  5. 自定义验证(可选):除了使用内建的数据注解,还可以实现自定义验证特性或使用 Fluent Validation 等第三方库。

三、使用数据注解进行验证

1. 定义一个数据模型

假设我们要创建一个用户注册的 Web API,其中包含用户的姓名、电子邮件、密码和年龄等字段。我们可以定义一个模型类,并在其中使用数据注解来验证输入数据。

using System.ComponentModel.DataAnnotations;public class RegisterModel
{[Required(ErrorMessage = "姓名是必填项")][StringLength(50, ErrorMessage = "姓名的长度不能超过50个字符")]public string Name { get; set; }[Required(ErrorMessage = "电子邮件是必填项")][EmailAddress(ErrorMessage = "无效的电子邮件格式")]public string Email { get; set; }[Required(ErrorMessage = "密码是必填项")][StringLength(100, MinimumLength = 6, ErrorMessage = "密码长度必须在6到100个字符之间")]public string Password { get; set; }[Range(18, 100, ErrorMessage = "年龄必须在18到100岁之间")]public int Age { get; set; }
}

在上面的代码中,RegisterModel 类定义了用户注册所需的数据字段:

  • Name:必填,且最大长度不能超过 50 个字符。
  • Email:必填,并且需要符合电子邮件格式。
  • Password:必填,且长度需要在 6 到 100 个字符之间。
  • Age:必须是 18 到 100 之间的整数。
2. 在控制器中使用模型

接下来,在 Web API 控制器中,使用 RegisterModel 作为请求参数:

using Microsoft.AspNetCore.Mvc;[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{[HttpPost("register")]public IActionResult Register([FromBody] RegisterModel model){if (!ModelState.IsValid){return BadRequest(ModelState);  // 返回验证失败的详细信息}// 如果数据有效,执行注册逻辑return Ok("注册成功");}
}

UserControllerRegister 方法中,我们将 RegisterModel 作为请求体参数。如果传递的数据无效,ModelState.IsValid 会返回 false,此时我们使用 BadRequest(ModelState) 返回所有验证失败的详细信息。

3. 返回验证错误信息

如果请求数据无效,API 会返回类似以下的响应,指明哪些字段未通过验证:

{"name": ["姓名是必填项"],"email": ["无效的电子邮件格式"],"password": ["密码长度必须在6到100个字符之间"],"age": ["年龄必须在18到100岁之间"]
}

四、常见数据注解的使用示例

1. Required — 必填验证
[Required(ErrorMessage = "用户名是必填项")]
public string Username { get; set; }
2. StringLength — 字符串长度限制
[StringLength(50, MinimumLength = 5, ErrorMessage = "用户名长度必须在5到50个字符之间")]
public string Username { get; set; }
3. EmailAddress — 验证电子邮件格式
[EmailAddress(ErrorMessage = "请输入有效的电子邮件地址")]
public string Email { get; set; }
4. Range — 数值范围限制
[Range(18, 100, ErrorMessage = "年龄必须在18到100岁之间")]
public int Age { get; set; }
5. RegularExpression — 正则表达式验证
[RegularExpression(@"^\d{3}-\d{2}-\d{4}$", ErrorMessage = "无效的社会安全号格式")]
public string SSN { get; set; }

五、使用 Fluent Validation 进行复杂验证

除了数据注解,Fluent Validation 是一个流行的第三方库,它提供了更灵活的验证功能。使用 Fluent Validation,你可以通过更具可读性的语法进行复杂的验证。

using FluentValidation;public class RegisterModelValidator : AbstractValidator<RegisterModel>
{public RegisterModelValidator(){RuleFor(x => x.Name).NotEmpty().WithMessage("姓名不能为空").Length(1, 50);RuleFor(x => x.Email).NotEmpty().EmailAddress().WithMessage("无效的电子邮件");RuleFor(x => x.Password).NotEmpty().Length(6, 100).WithMessage("密码长度必须在6到100个字符之间");RuleFor(x => x.Age).InclusiveBetween(18, 100).WithMessage("年龄必须在18到100岁之间");}
}

Fluent Validation 提供了更加灵活和可配置的验证机制,适用于复杂的验证场景。

六、总结

在 Web API 中使用数据注解和数据验证是一种简单而有效的方式,用于确保客户端传递的请求数据符合要求。通过数据注解,我们能够轻松定义字段的验证规则,如必填、长度、范围、格式等。在实际开发中,结合数据注解和合适的错误处理,可以提高 API 的健壮性,确保应用的正确性和安全性。

相关文章:

asp.net core webapi中的数据注解与数据验证

在这一课中&#xff0c;主要讲解了如何在 Web API 中使用数据注解&#xff08;Data Annotations&#xff09;和进行数据验证&#xff0c;以确保请求数据的有效性和完整性。 在 Web API 中&#xff0c;数据验证是确保客户端传递的数据符合业务规则和格式要求的关键步骤。数据注…...

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…...

uniapp 微信小程序 自定义日历组件

效果图 功能&#xff1a;可以记录当天是否有某些任务或者某些记录 具体使用&#xff1a; 子组件代码 <template><view class"Accumulate"><view class"bx"><view class"bxx"><view class"plank"><…...

云架构Web端的工业MES系统设计之区分工业过程

云架构Web端的工业MES系统设计之区分工业过程 在当今数字化浪潮席卷全球的背景下,制造业作为国家经济发展的重要支柱产业,正面临着前所未有的机遇与挑战。市场需求的快速变化、客户个性化定制要求的日益提高以及全球竞争的愈发激烈,都促使制造企业必须寻求更加高效、智能的生产…...

Harbor 仓库部署(docker-compose 部署方式)

一、 安装的前提条件 硬件 资源 最低 推荐 cpu2C4C内存4G8G硬盘40G160G 软件 软件 版本 描述 dockerv17.0.6-ce 安装参考官方文档 Install Docker Engine | Docker Documentation docker-composev1.18.0 安装参考官方文档 Overview | Docker Documentation Openssllatest…...

机器学习基础-支持向量机SVM

目录 基本概念和定义 1. 超平面&#xff08;Hyperplane&#xff09; 2. 支持向量&#xff08;Support Vectors&#xff09; 3. 线性可分 4. 边界 SVM算法基本思想和分类 基本思想 间隔最大化 间隔&#xff08;Margin&#xff09; 软边距 SVM 核函数的概念 基本概念…...

卸载wps后word图标没有变成白纸恢复

这几天下载了个wps教育版&#xff0c;后头用完了删了 用习惯的2019图标 给兄弟我干没了&#xff1f;&#xff1f;&#xff1f; 其他老哥说什么卸载关联重新下 &#xff0c;而且还要什么撤销保存原来的备份什么&#xff0c;兄弟也是不得不怂了 后头就发现了这个半宝藏博主&…...

mongodb==安装prisma连接

官网下载mongodb,解压安装 Download MongoDB Community Server | MongoDB 修改bin/mongod.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storage:dbPat…...

python代码实现了一个金融数据处理和分析的功能,主要围绕国债期货及相关指数数据展开

# 忽略某些模块的提示信息 import warnings warnings.filterwarnings("ignore") # 在全局配置中添加RQData账号信息 import rqdatac as rq from typing import List import pandas as pd import numpy as np import re from datetime import datetime, timedelta,tim…...

声音是如何产生的

一、音频概述 RTMP中一般音频采用aac编码&#xff0c;采样率为44100HZ, 每帧1024采样&#xff0c;帧率43&#xff0c;23.2ms一帧 RTC中一般音频采用opus编码&#xff0c;采样率为48000HZ&#xff0c;每帧480采样&#xff0c;帧率100&#xff0c;10ms一帧 通道数&#xff08;c…...

Matlab回归预测大合集(不定期更新)-188

截至2025-1-2更新 1.BP神经网络多元回归预测&#xff08;多输入单输出&#xff09; 2.RBF神经网络多元回归预测&#xff08;多输入单输出&#xff09; 3.RF随机森林多元回归预测&#xff08;多输入单输出&#xff09; 4.CNN卷积神经网络多元回归预测&#xff08;多输入单输…...

CUDA编程【7】 线程束

文章目录 线程束和线程块线程束线程块 线程束的分化问题线程束分化&#xff08;Warp Divergence&#xff09;线程束分化的执行机制如何避免线程束的分化 线程束和线程块 线程束 线程束是SM中基本的执行单元当一个网格被启动&#xff08;即一个核函数被启动&#xff09;&#…...

nodejs:nodejs的技巧有哪些(2)

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者构建高性能的网络应用。 1. 使用异步编程&#xff0c;利用 async/await 来处理异步操作&#xff0c;使代码更清晰、易读。 const fetchData async () > { const data await getDataFrom…...

构建数字化校园:定义与意义

随着信息技术的快速发展&#xff0c;"数字化校园"这一概念逐渐成为教育领域内热议的话题。数字化校园是指利用先进的信息技术手段&#xff0c;如互联网、大数据、云计算等&#xff0c;对学校的教学、科研、管理和服务等方面进行全面升级和优化的过程。它不仅改变了传…...

LabVIEW语言学习过程是什么?

学习LabVIEW语言的过程可以分为几个阶段&#xff0c;每个阶段的重点内容逐步加深&#xff0c;帮助你从入门到精通。以下是一个简洁的学习过程&#xff1a; ​ 1. 基础入门阶段 理解图形化编程&#xff1a;LabVIEW是一种图形化编程语言&#xff0c;与传统的文本编程语言不同&am…...

阿里云 人工智能与机器学习

阿里云的 人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09; 服务为企业提供了全面的AI解决方案&#xff0c;帮助用户在多个行业实现数据智能化&#xff0c;提升决策效率&#xff0c;推动业务创新。阿里云通过先进的技术和丰富的工具&#xff0c;支持用…...

NUTTX移植到STM32

STM32移植NUTTX 1. Ubuntu下搭建开发环境1.1 先决条件1.2 下载 NuttX1.3 使用Make 进行编译1.4 烧录运行 2.通过NUTTX点亮LED2.1 部署操作系统2.2 修改配置文件2.3 编译运行程序 开发板&#xff1a;DshanMCUF407 官方开发文档&#xff1a;安装 — NuttX latest 文档 参考文档&…...

.NET 9.0 WebApi 发布到 IIS 详细步骤

微软表示&#xff0c;.NET 9 是迄今为止性能最高的 .NET 版本&#xff0c;对运行时、工作负载和语言方面进行了 1,000 多项与性能相关的改进&#xff0c;并采用了更高效的算法来生成更好的代码。 .NET 9 是 .NET 8 的继任者&#xff0c;特别侧重于云原生应用和性能。 作为标准期…...

麒麟 kylin v10 server 升级openssh 9.9p1

准备升级工作 yum install gcc make perl zlib zlib-devel pam pam-devel备份原有的ssh目录&#xff0c;以备后用 cp -r /etc/ssh /etc/ssh.bak cp /etc/pam.d/sshd /etc/pam.d/sshd.before cp /etc/ssh/sshd_config /etc/ssh/sshd_config.before解压源码压缩包 tar -zxf o…...

ollama+FastAPI部署后端大模型调用接口

ollamaFastAPI部署后端大模型调用接口 记录一下开源大模型的后端调用接口过程 一、ollama下载及运行 1. ollama安装 ollama是一个本地部署开源大模型的软件&#xff0c;可以运行llama、gemma、qwen等国内外开源大模型&#xff0c;也可以部署自己训练的大模型 ollama国内地…...

设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析

策略模式&#xff08;Strategy Pattern&#xff09;核心思想是将算法的实现从使用该算法的类中分离出来&#xff0c;作为独立的对象&#xff0c;通过接口来定义算法家族&#xff0c;这样就可以很容易地改变或扩展算法。通过这种方式&#xff0c;可以避免在客户端代码中使用大量…...

2025资源从哪里来!

方案规划告诉你资源最好的答案&#xff1f; 方案一、如果你不知道啥资源可以到这里面找到初步的答案&#xff1f; 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 在这个网站你可以找到你对应的专业-对应的路线-对应的资源-对应的百度网盘里面全是免费的资源------------------惊喜不&…...

Alist-Sync-Web 网盘自动同步,网盘备份相互备份

Alist-Sync-Web 一个基于 Web 界面的 Alist 存储同步工具&#xff0c;支持多任务管理、定时同步、差异处理等功能。 如果好用&#xff0c;请Star&#xff01;非常感谢&#xff01; GitHub Gitee DockerHub 功能特点 &#x1f4f1; 美观的 Web 管理界面&#x1f504; 支持多任…...

【FlutterDart】 listView.builder例子二(14 /100)

上效果图 上代码&#xff1a; import package:flutter/material.dart;class ListRoles extends StatelessWidget {ListRoles({super.key});final List<String> entries <String>[, -, *, /];final List<int> colorCodes <int>[600, 500, 100, 50];o…...

《shared_ptr源码剖析》

【shared_ptr导读】上一节&#xff0c;我们为大家介绍了unique_ptr的底层原理和实现。相对于unique_ptr&#xff0c;shared_ptr也是被大家广泛使用的智能指针&#xff0c;shared_ptr内部的原理是怎样的&#xff1f;shared_ptr是多线程安全的吗&#xff1f; 本文将以Centos标准库…...

关于markdown实现页面跳转(调查测试:csdn(博客编写效果、发布效果)、typroa中md转pdf的使用情况)

一-方法介绍 [点击跳转到标题0](#1) <a href"#2">正文2</a>### <span id"2">标题0</span>二、跳转测试区 点击跳转到标题0 正文2 三、测试结果 场景MDspan-可标题写博客时候&#xff0c;右侧显示区效果可以发布博客的效果可以…...

入门级容器技术解析:Docker和K8s的区别与关系

目录 &#x1f3af;学习小目标&#xff1a; 关于容器 传统物理机&#x1f5a5;️ 虚拟机&#x1f4bb; 为什么使用容器技术呢&#xff1f;&#x1f914; 容器技术&#x1f943; Docker—容器化平台 K8s(Kubernetes)—容器编排系统​ Docker和K8s有什么关系和区别&#…...

《Rust权威指南》学习笔记(五)

高级特性 1.在Rust中&#xff0c;unsafe是一种允许绕过Rust的安全性保证的机制&#xff0c;用于执行一些Rust默认情况下不允许的操作。unsafe存在的原因是&#xff1a;unsafe 允许执行某些可能被 Rust 的安全性检查阻止的操作&#xff0c;从而可以进行性能优化&#xff0c;如手…...

数据库软考历年上午真题与答案解析(2018-2024)

本题考查计算机总线相关知识。 总线&#xff08;Bus&#xff09;是计算机各种功能部件之间传送信息的公共通信干线&#xff0c;它是由导线组成的传输线束。 根据总线连接设备范围的不同&#xff0c; 分为&#xff1a;1.片内总线&#xff1a;芯片内部的总线&#xff1b; 2.系统…...

HTML5 文件上传(File Upload)详解

HTML5 文件上传&#xff08;File Upload&#xff09;详解 HTML5 提供了强大的文件上传功能&#xff0c;允许用户通过网页选择文件并上传到服务器。以下是关于文件上传控件的详细说明。 1. 基本的文件上传控件 使用 <input> 标签的 type"file" 属性可以创建一…...

构建属于你的七牛云文件上传工具:Qiniu Uploader 详解(从 0 到 1 实现)

GitHub 仓库地址&#xff1a;https://github.com/hahala2333/qiniu-upload &#x1f4da; 简介 在现代 Web 开发中&#xff0c;静态资源的上传和管理是不可避免的需求。为了简化将本地资源上传到七牛云存储的过程&#xff0c;我们构建了 Qiniu Uploader 工具。它具备灵活的配置…...

Spring Boot 项目中集成 Kafka-03

在 Spring Boot 项目中集成 Kafka 有多种方式&#xff0c;适应不同的应用场景和需求。以下将详细介绍几种常用的集成方法&#xff0c;包括&#xff1a; 使用 Spring Kafka (KafkaTemplate 和 KafkaListener)使用 Spring Cloud Stream 与 Kafka Binder使用 Spring for Apache K…...

如何在2025年创建一个网站:使用US Domain Center和WordPress的终极指南

在本指南中&#xff0c;我们将向你展示如何正确地使用US Domain Center和WordPress创建一个网站。无论你是要启动一个个人博客&#xff0c;还是一个在线商店&#xff0c;我们都会提供简单易懂的步骤指导。无需技术技能 — — 只需按照我们的简单步骤操作&#xff0c;你就能在今…...

LLM 训练中存储哪些矩阵:权重矩阵,梯度矩阵,优化器状态

LLM 训练中存储哪些矩阵 目录 LLM 训练中存储哪些矩阵深度学习中梯度和优化器是什么在 LLM 训练中通常会存储以下矩阵: 权重矩阵:这是模型的核心组成部分。例如在基于 Transformer 架构的 LLM 中,每一层的多头注意力机制和前馈神经网络都会有相应的权重矩阵。以 BERT 模型为…...

【JVM】总结篇之对象内存布局 执行引擎

文章目录 对象内存布局对象的实例化对象的内存布局对象的方问定位 执行引擎 对象内存布局 对象的实例化 new对象流程&#xff1f;&#xff08;龙湖地产&#xff09; 对象创建方法&#xff0c;对象的内存分配。&#xff08;360安全&#xff09; 1.判断对象对应的类是否加载、链…...

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型 目录 机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型1 过拟合和欠拟合1.1 过拟合1.2 欠拟合 2 正则化惩罚2.1 概念2.2 函数2.3 正则化种类 3 K折交叉验证3.1 概念3.2 图片理解3.3 函数导入3.4 参数理解 4 训练模型K折交…...

【图像处理】OpenCv + Python 实现 Photoshop 中的色彩平衡功能

前言 这是使用 python 和 OpenCv 实现的 Photoshop 中色彩平衡功能的代码&#xff0c;可以设置阴影&#xff0c;高光和中间调的色调参数来调整图片的色彩平衡。 参考文章二也有 python 版本的代码实现&#xff0c;虽然中间调的部分貌似没有实现&#xff0c;但是理论部分讲解还…...

基于vue框架的的校园快递管理系统x0xm0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,校园跑腿,快递代取,代取进度,评价信息 开题报告内容 基于Vue框架的校园快递管理系统开题报告 一、研究背景与意义 随着电子商务的蓬勃发展&#xff0c;校园快递业务急剧增长&#xff0c;成为校园生活中不可或缺的一部分。然而&a…...

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…...

智能体(Agent)如何具备自我决策能力的机理与实现方法

一、智能体自我决策能力的机理 从人工智能和控制理论的角度看&#xff0c;智能体能够“自我决策”的核心在于其 “感知–认知–行动” 的循环过程&#xff0c;以及在此过程中引入自主学习与自主优化的机制。经过优化与补充&#xff0c;智能体具备自我决策能力的机理可以分解为…...

Redis 数据库源码分析

Redis 数据库源码分析 我们都知道Redis是一个 <key,value> 的键值数据库&#xff0c;其实也就是一个 Map。如果让我来实现这样一个 Map&#xff0c;我肯定是用数组&#xff0c;当一个 key 来的时候&#xff0c;首先进行 hash 运算&#xff0c;接着对数据的 length 取余&…...

vue3 css实现文字输出带光标显示,文字输出完毕,光标消失的效果

Vue实现过程如下&#xff1a; <template><div ><p ref"dom_element" class"typing" :class"{over_fill: record_input_over}"></p></div> </template> <script setup> import {onMounted, ref} from…...

【Leetcode】731. 我的日程安排表 II

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 实现一个程序来存放你的日程安排。如果要添加的时间内不会导致三重预订时&#xff0c;则可以存储这个新的日程安排。 当三个日程安排有一些时间上的交叉时&#xff08;例如三个日程…...

浅谈棋牌游戏开发流程四:核心业务逻辑(二)——房间匹配与对局流程

一、前言&#xff1a;让玩家轻松坐上“牌桌” 在上一篇文章中&#xff0c;我们深入探讨了用户系统与登录流程&#xff0c;了解了如何让“陌生人”转变为游戏中的“正式玩家”。接下来&#xff0c;我们将迈向游戏的核心环节——房间匹配与对局流程。这是玩家实际参与游戏、互动…...

大学生HTML5期末作业 Web前端网页制作 html5+css3+js html+css网页设计 美食 美食模版2个页面

大学生HTML5期末作业 Web前端网页制作 html5css3js htmlcss网页设计 美食 美食模版2个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修…...

Java100道面试题

1.JVM内存结构 1. 方法区&#xff08;Method Area&#xff09; 方法区是JVM内存结构的一部分&#xff0c;用于存放类的相关信息&#xff0c;包括&#xff1a; 类的结构&#xff08;字段、方法、常量池等&#xff09;。字段和方法的描述&#xff0c;如名称、类型、访问修饰符…...

MySQL 日志简介

总览 MySQL Server 有以下⼏种⽇志&#xff0c;可以记录服务器正在发⽣的活动。 ⽇志类型⽇志信息 ⼀般查询⽇志 (General query log) 已建⽴的客⼾端连接和从客⼾端接收到的语句 错误⽇志 (Error log) mysqld在启动、运⾏或停⽌时遇到的问题 慢查询⽇志 (Slow query log) 执⾏…...

ubuntu清理磁盘

ubuntu清理磁盘脚本&#xff1a; #&#xff01;/bin/bash#shell脚本用#作注释行,但是第一行的#&#xff01;/bin/bash例外sudo apt-get clean sudo rm -rf /tmp/* sudo rm -rf /var/cache/*cd /var/log/ sudo du -h -d 1 rm -rf ./*cd ~/.cache sudo du -h -d 1 rm -rf ./*apt…...

鸿蒙APP之从开发到发布的一点心得

引言&#xff1a; 做鸿蒙开发大概有1年左右时间了&#xff0c;从最开始的看官方文档、看B站视频&#xff0c;到后来成功发布两款个人APP&#xff08;房贷计算极简版、时简时钟 轻喷&#xff0c;谢谢&#xff09;。简单描述一下里边遇到的坑以及一些经历吧。 学习鸿蒙开发 个…...

C++二十三种设计模式之享元模式

C二十三种设计模式之享元模式 一、组成二、特点三、目的四、缺点五、示例代码 一、组成 抽象享元类&#xff1a;声明操作方法。 具体享元类&#xff1a;使用内部数据和外部数据来实现操作方法。 享元管理者类&#xff1a;创建和管理具体享元对象。 二、特点 1、创建享元对象…...