三、【数据建模篇】:用 Django Models 构建测试平台核心数据
【数据建模篇】:用 Django Models 构建测试平台核心数据
- 前言
- 我们要设计哪些核心数据?
- 准备工作:创建 Django App
- 开始设计数据模型 (Models)
- 1. 通用基础模型 (可选但推荐)
- 2. 项目模型 (Project)
- 3. 模块模型 (Module)
- 4. 测试用例模型 (TestCase)
- 生成和应用数据库迁移
- 在 Django Admin 中查看和管理数据 (可选的快速验证)
- 总结
前言
- 在上一篇,我们成功搭建了 Django 和 Vue3 的开发环境,就像给我们的“建筑工地”通了水电一样。今天,我们要开始真正的“建筑设计”了——为我们的测试平台设计数据模型。
- 什么是数据模型?简单来说,数据模型就是我们测试平台需要存储和管理的信息的蓝图。比如,一个测试平台肯定要有“项目”、“测试用例”、“测试报告”这些东西,数据模型就是用来精确定义这些“东西”包含哪些信息(比如项目名称、用例步骤、报告结果等),以及它们之间是如何关联的。
- 在 Django 中,我们使用 Models 来定义数据模型。你只需要用 Python 代码来描述你的数据结构,Django 会自动帮你处理与数据库交互的复杂细节(比如创建数据库表)。
我们要设计哪些核心数据?
一个基础的测试平台,通常会包含以下核心数据:
- 项目 (Project):管理不同的测试项目。
- 模块 (Module):项目下的功能模块,用于组织测试用例。
- 测试用例 (TestCase):具体的测试点,包含一系列操作步骤。
- 测试步骤 (TestStep):测试用例中的单个操作,如访问URL、点击按钮、校验结果等(为了简化入门,我们初期可以将步骤内置于用例中,后续可拆分)。
- 测试配置 (EnvironmentConfig / TestConfig):用于存储不同测试环境的配置信息,如URL、账户等 (初期简化,可放在项目中或后续添加)。
- 测试执行记录 (TestRun / ExecutionRecord):记录每一次测试任务的执行情况。
- 测试报告 (TestReport):汇总展示某次测试执行的结果。
为了让小白更容易上手,我们先从最核心的 项目 (Project)、模块 (Module) 和 测试用例 (TestCase) 开始设计,并逐步完善。
准备工作:创建 Django App
在 Django 中,项目通常由多个 App 组成,每个 App 负责一部分独立的功能。我们将创建一个名为 api
的 App 来存放我们测试平台后端的核心逻辑,包括数据模型。
-
激活 Python 虚拟环境:
- 打开Terminal:
- Windows:
venv\Scripts\activate
- macOS/Linux:
source venv/bin/activate
- Windows:
- 打开Terminal:
-
创建 Django 项目:
虽然我们之前安装了 Django,但还没有正式创建一个 Django 项目。一个 Django 项目是配置和多个应用的集合。
在test-platform
目录下 (确保(venv)
已激活),执行:django-admin startproject backend .
注意命令最后的那个点
.
,它表示在当前目录 (test-platform
) 下创建 Django 项目文件,而不是再新建一个同名子目录。执行后,你的
test-platform
目录结构如下图所示:这里的
backend
文件夹是 Django 项目的配置目录,settings.py
是项目配置文件,而manage.py
是Django 项目管理脚本工具,我们将频繁使用它。 -
创建 Django App:
现在,使用manage.py
来创建我们的api
应用。确保你在test-platform
根目录下。python manage.py startapp api
执行后,
test-platform
目录下会新增一个api
文件夹:
我们将在models.py
这里定义数据模型。 -
注册 App:
创建了 App 之后,还需要告诉 Django 项目它的存在。打开test-platform/backend/settings.py
文件,找到INSTALLED_APPS
列表,在列表末尾添加我们的api
应用:
# test-platform/backend/settings.pyINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework', # 我们之前安装了DRF,在这里也注册上'api', # 添加我们新建的 app ]
记得保存文件。
开始设计数据模型 (Models)
现在,打开 test-platform/api/models.py
文件。这个文件初始只有一些注释。我们将在这里用 Python 类来定义我们的数据模型。
1. 通用基础模型 (可选但推荐)
为了代码复用和统一管理创建时间、更新时间等通用字段,我们可以先定义一个基础模型。
# test-platform/api/models.py
from django.db import modelsclass BaseModel(models.Model):"""公共模型,可添加创建时间/更新时间/逻辑删除等通用字段"""name = models.CharField(max_length=100, unique=True, verbose_name="名称")description = models.TextField(null=True, blank=True, verbose_name="描述")create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")class Meta:abstract = True # 设置为抽象基类,不会在数据库中创建表ordering = ['-create_time'] # 默认按创建时间倒序def __str__(self):return self.name
models.Model
: 所有 Django 模型都继承自它。name = models.CharField(...)
: 定义一个字符类型字段,max_length
是最大长度,unique=True
表示名称不能重复,verbose_name
是在 Django admin 后台显示的友好名称。description = models.TextField(...)
: 定义一个文本类型字段,null=True
表示数据库中可以为空,blank=True
表示在表单中可以不填。create_time = models.DateTimeField(auto_now_add=True, ...)
: 日期时间字段,auto_now_add=True
表示在对象第一次创建时自动设置为当前时间。update_time = models.DateTimeField(auto_now=True, ...)
: 日期时间字段,auto_now=True
表示在对象每次保存时自动更新为当前时间。class Meta
: 用于定义模型的元数据。abstract = True
: 表示BaseModel
是一个抽象基类。它本身不会被创建成数据库表,而是用来被其他模型继承,从而共享这些通用字段。ordering = ['-create_time']
: 指定查询此模型的对象时,默认按创建时间降序排列 (最新的在前面)。
__str__(self)
: 定义当打印模型实例时,返回的内容。这里我们返回其名称。
2. 项目模型 (Project)
一个测试项目是我们组织测试的顶层单位。
# test-platform/api/models.py
# (继续在同一个文件中添加,BaseModel定义之后)class Project(BaseModel): # 继承自我们定义的 BaseModel"""项目表"""# name 和 description 字段已从 BaseModel 继承# create_time 和 update_time 字段已从 BaseModel 继承# 可以添加项目特有的字段,例如:#负责人owner = models.CharField(max_length=50, null=True, blank=True, verbose_name="负责人")#项目状态:0-规划中,1-进行中,2-已完成,3-搁置status = models.PositiveSmallIntegerField(default=1, verbose_name="项目状态", help_text="0:规划中, 1:进行中, 2:已完成, 3:搁置")class Meta:verbose_name = "项目" # 单数形式的友好名称verbose_name_plural = "项目列表" # 复数形式的友好名称ordering = ['-create_time'] # 也可以在这里覆盖或添加排序规则# __str__ 方法已从 BaseModel 继承
我们让 Project
模型继承了 BaseModel
,所以它自动拥有了 name
, description
, create_time
, update_time
字段。我们又添加了 owner
和 status
两个项目特有的字段。
3. 模块模型 (Module)
模块通常属于某个项目,用于对测试用例进行分类。
# test-platform/api/models.py
# (继续在同一个文件中添加)class Module(BaseModel):"""模块表"""# name 和 description 字段已从 BaseModel 继承# create_time 和 update_time 字段已从 BaseModel 继承project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name="所属项目", related_name="modules")# 'Project':关联到 Project 模型。# on_delete=models.CASCADE:级联删除。当其所属的 Project 被删除时,这个 Module 也会被自动删除。# verbose_name:友好名称。# related_name="modules":这允许我们从一个 Project 实例通过 `project_instance.modules.all()` 来获取其下所有的 Module 实例。class Meta:verbose_name = "模块"verbose_name_plural = "模块列表"# 同一个项目下的模块名不能重复unique_together = ('project', 'name') # project 和 name 组合起来必须唯一# __str__ 方法已从 BaseModel 继承,可以考虑重写以包含项目信息def __str__(self):return f"{self.project.name} - {self.name}"
这里最重要的是 project = models.ForeignKey(Project, ...)
,它定义了一个外键关系。这意味着一个模块必须属于一个项目。
4. 测试用例模型 (TestCase)
测试用例是测试的核心,它属于某个模块。
# test-platform/api/models.py
# (继续在同一个文件中添加)class TestCase(BaseModel):"""测试用例表"""# name 和 description 字段已从 BaseModel 继承# create_time 和 update_time 字段已从 BaseModel 继承module = models.ForeignKey(Module, on_delete=models.CASCADE, verbose_name="所属模块", related_name="testcases")# 用例级别: P0, P1, P2, P3priority_choices = [('P0', 'P0 - 最高'),('P1', 'P1 - 高'),('P2', 'P2 - 中'),('P3', 'P3 - 低'),]priority = models.CharField(max_length=2, choices=priority_choices, default='P1', verbose_name="优先级")# 前置条件precondition = models.TextField(null=True, blank=True, verbose_name="前置条件")# 测试步骤 (初期简化,直接存在用例中,可以用JSON格式或特定文本格式)# 更好的做法是单独创建一个 TestStep 模型,并与 TestCase 建立一对多关系steps_text = models.TextField(verbose_name="测试步骤 (文本描述)")# 预期结果expected_result = models.TextField(verbose_name="预期结果")# 用例类型:例如 功能测试,接口测试,UI测试 (初期可以简单点,后续扩展)case_type_choices = [('functional', '功能测试'),('api', '接口测试'),('ui', 'UI测试'),]case_type = models.CharField(max_length=20, choices=case_type_choices, default='functional', verbose_name="用例类型")# 维护人maintainer = models.CharField(max_length=50, null=True, blank=True, verbose_name="维护人")class Meta:verbose_name = "测试用例"verbose_name_plural = "测试用例列表"# 同一个模块下的用例名不能重复unique_together = ('module', 'name')# __str__ 方法已从 BaseModel 继承,可以考虑重写def __str__(self):return f"{self.module.project.name} - {self.module.name} - {self.name}"
priority = models.CharField(..., choices=priority_choices, ...)
:choices
参数允许你定义一个下拉选择列表。steps_text
: 我们暂时用一个大的文本字段来存储测试步骤,这对于入门比较简单。在更复杂的系统中,你可能会创建一个单独的TestStep
模型,并让一个TestCase
关联多个TestStep
。
生成和应用数据库迁移
模型定义好了,但数据库还不知道这些。我们需要告诉 Django 根据我们的模型定义来创建或修改数据库表结构。这个过程叫做数据库迁移 (Migrations)。
-
生成迁移文件:
在终端中 (确保在test-platform
目录下,并且(venv)
已激活),运行:python manage.py makemigrations api
你会看到以下输出:
如果你的模型定义没有语法错误,Django 会检查
api/models.py
文件的改动,并在api/migrations/
目录下生成一个新的迁移文件,0001_initial.py
。这个文件描述了如何创建Project
,Module
,TestCase
表。 -
应用迁移到数据库:
迁移文件生成后,运行以下命令将这些更改应用到数据库(Django 默认使用 SQLite 文件数据库,它会在你项目根目录下自动创建一个db.sqlite3
文件):python manage.py migrate
你会看到以下输出,表示你的数据库表已经根据模型成功创建了!
验证数据库表 (可选,但推荐)
我们可以使用 SQLite 的浏览器工具(比如 DB Browser for SQLite)打开项目根目录下的 db.sqlite3
文件,查看是否生成了表,以及它们的列结构是否符合定义。
在 Django Admin 中查看和管理数据 (可选的快速验证)
Django 自带一个强大的后台管理界面 (Django Admin),我们可以用它来快速查看和添加数据,验证模型是否工作正常。
-
创建超级用户:
你需要一个管理员账号来登录 Django Admin。在终端运行:
python manage.py createsuperuser
按照提示输入用户名、邮箱(可以随便填一个格式正确的)、密码。
-
注册模型到 Admin:
打开test-platform/api/admin.py
文件,将我们的模型注册进去:
# test-platform/api/admin.py from django.contrib import admin from .models import Project, Module, TestCase # 导入你的模型# 注册模型到 admin 站点 admin.site.register(Project) admin.site.register(Module) admin.site.register(TestCase)
-
启动开发服务器:
python manage.py runserver
默认情况下,服务器会运行在
http://127.0.0.1:8000/
。
访问http://127.0.0.1:8000/
,安装成功如下图所示:
-
访问 Admin 界面:
在浏览器中打开http://127.0.0.1:8000/admin/
。
使用你刚才创建的超级用户账号登录。
登录后,你能看到 “API” 部分,下面列出了 “模块列表”, “测试用例列表”, “项目列表”。你可以点击它们,尝试添加一些测试数据。
通过 Django Admin 添加几条数据,验证下模型之间的关系是否按预期工作。比如:
-
创建一个项目 “电商平台测试”。
-
在 “电商平台测试” 项目下创建一个模块 “用户登录模块”。
-
在 “用户登录模块” 下创建一个测试用例 “TC001_正确用户名密码登录”,再输入测试步骤和预期结果。
总结
你已经成功为测试平台设计了核心的数据模型,并学会了以下内容:
- ✅ 在 Django 中创建 App。
- ✅ 使用 Python 类定义 Django Models (Project, Module, TestCase)。
- ✅ 理解了字段类型、外键关系 (
ForeignKey
)、元数据 (class Meta
) 的基本用法。 - ✅ 生成并应用了数据库迁移 (
makemigrations
,migrate
)。 - ✅ 通过 Django Admin 快速验证了模型。
在下一篇文章中,我们将基于这些模型,开始使用 Django REST Framework (DRF) 来创建后端 API 接口,让前端能够通过网络来读取和操作这些数据。
相关文章:
三、【数据建模篇】:用 Django Models 构建测试平台核心数据
【数据建模篇】:用 Django Models 构建测试平台核心数据 前言我们要设计哪些核心数据?准备工作:创建 Django App开始设计数据模型 (Models)1. 通用基础模型 (可选但推荐)2. 项目模型 (Project)3. 模块模型 (Module)4. 测试用例模型 (TestCase…...
Mac如何允许安装任何来源软件?
打开系统偏好设置-安全性与隐私,点击右下角的解锁按钮,选择允许从任何来源。 如果没有这一选项,请到打开终端,输入命令行:sudo spctl --master-disable, 输入命令后回车,输入电脑的开机密码后回车。 返回“…...
云原生主要架构模式
云原生(Cloud Native)是一种利用云计算的优势来构建和运行可扩展、弹性和高效应用程序的方法。它不仅仅是技术的集合,更是一种架构和设计理念。本文将围绕你提出的几部分,深入探讨云原生主要的架构模式,帮助你理解如何利用这些模式构建现代化的应用。 1. 服务化架构模式(…...
Neon数据库:让Postgres更智能的选择!
Neon:革新的Serverless PostgreSQL解决方案 在当今快速发展的技术世界,数据库的效率和灵活性成为众多开发者关注的重中之重。Neon,以其独特的serverless架构,正引领着这一变革。本文将深入探讨Neon的独特构架、应用场景以及具体的…...
《Metasploit框架核心模块解析与安全防护实践》
目录 一、框架模块化设计与安全验证价值 1. 漏洞验证模块(Exploit Modules) 2. 安全评估模块(Auxiliary Modules) 3. 安全响应模块(Post-Exploitation) 4. 载荷安全…...
C#:多线程Task使用
一.Task与Thread Task是架构在Thread之上的,也就是说任务最终还是要抛给线程去执行。Task跟Thread不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。…...
Nginx笔记
一、概述 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个电子邮件代理服务器。正向代理服务的是客户端(比如VPN),反向代理服务的是服务端。Nginx是多进程的,有一个Master进程控制多个Worke…...
小米便签源码部署流程
一、准备环境 1. 安装必要工具 Android Studio:最新稳定版(需支持 Kotlin 和 Jetpack Compose)。 JDK:建议 JDK 11 或更高(通过 sdkman 或 brew 安装)。 Git:用于克隆源码。 2. 配置国内镜像源&…...
DAY 30 超大力王爱学Python
知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 步骤 1:创建项目结构 …...
左右边界策略
这是一套完整的交易逻辑策略,涵盖了从函数定义、指标计算、信号生成到资金和仓位管理、加仓和减仓逻辑、以及止损和止盈逻辑的各个方面。 以下对该交易系统进行详细分析: 交易逻辑思路 1. 函数定义 - DZSell 和 DZBuy 函数:这两个函数用于计算卖出和买入的价格区间。它…...
iOS苹果和Android安卓测试APP应用程序的区别差异
在当今这个移动互联网时代,iOS和Android作为两大主流操作系统,它们在测试应用程序时存在哪些差异呢?这不仅是一个技术问题,也是一个市场策略问题。让我们从一个实际案例开始探讨。 假设我们有一个新的社交应用需要在iOS和Android…...
【Python装饰器深潜】从语法糖到元编程的艺术
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…...
Kubernetes中微服务JVM监控与自动发现的解决方案
以下是针对 Kubernetes 中微服务 JVM 监控与自动发现的解决方案,结合 Prometheus 的动态发现机制和 Spring Boot 的监控能力,解决 Pod IP 动态变化和当前微服务监控数据暴露匿名随意访问的安全问题。 一、微服务端配置(Spring Boot 微服务) 1. 依赖配置(pom.xml) <…...
mapbox进阶,纯前端geojson转shape,并将shape相关文件压缩成zip压缩包并下载
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式二、🍀纯前端geojson转…...
Oracle ASM Rebalance Power 了解
Oracle ASM Rebalance Power 了解 基本概念 ASM (Automatic Storage Management) 的 Rebalance Power 参数控制磁盘组重新平衡操作的速度和资源使用。当添加、删除或调整 ASM 磁盘时,ASM 会自动执行重新平衡操作来重新分布数据。 ASM_POWER_LIMIT 参数 作用 控…...
sqlite的拼接字段的方法(sqlite没有convert函数)
我在sqlserver 操作方式: /// <summary>///获取当前门店工资列表/// </summary>/// <param name"wheres">其他条件</param>/// <param name"ThisMendian">当前门店</param>/// <param name"IsNotU…...
深入解析 OpenManus:开源 AI 智能体框架的技术原理与实践
深入解析 OpenManus:开源 AI 智能体框架的技术原理与本地部署指南 在当今人工智能快速发展的时代,智能体(Agent)技术正逐渐成为推动自动化和智能化的关键力量。OpenManus,由 MetaGPT 团队开发的开源 AI 智能体框架&am…...
[面试精选] 0001. 两数之和
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 1. 两数之和 - 力扣(LeetCode) 2. 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个…...
CAP分布式理论
CAP分布式理论 文章目录 CAP分布式理论事务本地事务定义适用场景优点缺点 分布式事务一、分布式事务的定义二、分布式事务的标准与 CAP 理论的关系1. CAP 理论的核心内容2. CAP 理论对分布式事务的指导意义3. 分布式事务的其他关键标 三、总结:CAP 理论与分布式事务…...
如何管理和优化内核参数
Linux 系统中的内核参数(Kernel Parameters)对系统的性能、安全性和稳定性有很大影响。通过调整内核参数,可以优化系统性能、增强网络能力、调整内存管理等。管理和优化内核参数通常涉及以下几个步骤: 1. 查看当前内核参数 在 L…...
sgRNA的靶基因基因组如何获得? for 下游的 T7E1验证
愿武艺晴小朋友一定得每天都开心! 1)在基因组,靶标区域上下游,设计引物(以Zfp532基因为例): a. NCBI(Home - Gene - NCBI)Gene 页面上输入:Zfp532。 b. 在新…...
人工智能+:职业价值的重构与技能升级
当“人工智能”成为产业升级的标配时,一个令人振奋的就业图景正在展开——不是简单的岗位替代,而是职业价值的重新定义。这场变革的核心在于,AI并非抢走工作机会,而是创造了人类与技术协作的全新工作范式。理解这一范式转换的逻辑…...
【前端开发】Uniapp日期时间选择器:实现分钟动态步长设置
技术栈 Uniapp Vue3 uView年份显示前后一年,分钟动态设置间隔 效果图 主体显示 <view class"uni-row selector" click"openPicker"><uni-icons color"#c0c4cc" type"calendar" size"22"></uni-…...
目标检测DN-DETR(2022)详细解读
文章目录 gt labels 和gt boxes加噪query的构造attention maskIS(InStability)指标 在DAB-Detr的基础上,进一步分析了Detr收敛速度慢的原因:二分图匹配的不稳定性(也就是说它的目标在频繁地切换,特别是在训…...
榕壹云上门家政系统:基于Spring Boot+MySQL+UniApp的全能解决方案
一、项目背景:家政服务行业的数字化升级需求 随着城市化进程加快,居民对上门家政服务的需求持续增长。传统家政行业存在服务效率低、信息不透明、管理成本高的问题,亟需通过数字化工具实现服务标准化、流程自动化。榕壹云上门家政系统应运而…...
目标检测DINO-DETR(2023)详细解读
文章目录 对比去噪训练混合查询选择look forward twice 论文全称为:DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 提出了三个新的方法: 首先,为了改进一对一的匹配效果,提出了一种对比去噪训练方法…...
LLM笔记(十)vLLM(1)PagedAttention论文笔记
文章目录 PagedAttention论文笔记论文摘要概览1. 引言问题背景提出的解决方案主要贡献和成果 2. 背景2.1 基于Transformer的大语言模型2.2 LLM服务与自回归生成2.3 LLM的批处理技术 3. LLM服务中的内存挑战3.1 现有系统中的内存管理 4. 方法: PagedAttention 和 vLLMvLLM 系统概…...
5.20 note
不用if else实现递归 原代码 class Solution { public: int mechanicalAccumulator(int target) { if (target 0) return 0; // 终止条件:基准情况 return target mechanicalAccumulator(target - 1); // 递归累加 } }; 变形 class Solution { public: int…...
vuejs处理后端返回数字类型精度丢失问题
标题问题描述 后端返回数据有5.00和3.30这种数据,但是前端展示的时候返回对应分别为5和3.0,小数点后0都丢失了。 接口返回数据展示network-Response: 接口返回数据展示network-Preview: 错误数据效果展示 发现问题 浏览器接口…...
指令烧录ORIN NANO操作系统
1 概述 模组为ORIN NANO 4GB版本 Ubuntu系统为18.04虚拟机 说明:刷机过程会有重新连接USB的操作,烧写过程需要注意虚拟机提示,官方不建议使用虚拟机,建议直接使用ubuntu操作系统的机器。 2 下载烧录所需文件 进入到下载网址&am…...
每日算法刷题Day11 5.20:leetcode不定长滑动窗口求最长/最大6道题,结束不定长滑动窗口求最长/最大,用时1h20min
6. 1695.删除子数组的最大得分(中等) 1695. 删除子数组的最大得分 - 力扣(LeetCode) 思想 1.给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组**。**删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子…...
List介绍
什么是List 在集合框架中,List是一个接口,继承自Collection Collection也是一个接口,该接口中规范了后序容器中常用的一些方法 Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下࿱…...
List更简洁的编码构建
List的链式构建需求 jdk1.8,编码时需要手动构建一个List 传统List构建方式 - 声明列表,依次添加元素; - 利用Arrays.asList方法声明并添加元素 //1 先声明创建 List<String> createList new ArrayList<>();//2 逐个添加元素 c…...
Java 单元测试框架比较:JUnit、TestNG 哪个更适合你?
Java 单元测试框架比较:JUnit、TestNG 哪个更适合你? 在 Java 开发领域,单元测试是保证代码质量的重要环节。而选择一个合适的单元测试框架,对于提升测试效率和代码可靠性至关重要。本文将深入比较 JUnit 和 TestNG 这两个主流的…...
变频器如何通过Profibus DP主站转Modbus RTU/TCP接入到上位机
变频器如何通过Profibus DP主站转Modbus RTU/TCP接入到上位机 在工业自动化领域,Profibus DP和Modbus RTU是两种常见的通信协议。Profibus DP广泛应用于工厂自动化,而Modbus RTU则常用于串行通信。当需要将支持Profibus DP的设备(如变频器&a…...
ElasticSearch性能优化
ES基础概念介绍: 索引:类似于MySQL中的表,它是具有相同特征的一个数据集。文档:格式为JSON格式,类似于MySQL中的一条数据,它是数据存储的基本数据单元,每一条文档都有一个唯一的ID。查询&#x…...
pom.xml中的runtime
在 Maven 的 pom.xml 文件中,<scope> 元素可以指定依赖项的作用范围,而 runtime 是其中的一个作用范围值。以下是 runtime 作用范围的含义: 定义:runtime 作用范围表示该依赖项在编译时不需要,但在运行时需要。…...
第一章走进java世界
第一章 走进 java 世界 1.1 java 语言的特点(小面经) 使用简单、高效 去掉了 C 和 C++中的指针和多重继承技术通过垃圾自动回收机制简化了程序内存管理对于数据类型在不同字长的计算机上实现统一字节数占用完全面向对象 抽象、封装、继承、多态自动内存管理(Auto Garbage C…...
tigase源码学习笔记-事件总线EventBus
前言 最近看到了一些tigase关于异步事件解耦的地方的设计,做一个笔记记录一下。什么是事件总线,我自己对于事件总线的理解是,事件总线是一个对事件(Event)进行集中处理的基于发布订阅模式的一种处理机制。个人拙见&am…...
GO语言学习(六)
GO语言学习(六) 各位支持我的友友们我们现在不知不觉的已经进入第六期了,在上一期我们学习了一些简单的HTTP相关知识,还带大家基本的了解了web的深层原理及实现过程,相信大家应该都有自己的收获了,现在我就带领大家学习一下本期的…...
25.5.20学习总结
做题思路 数列分段 Section IIhttps://www.luogu.com.cn/problem/P1182正如题目所说,我们需要得到一个最小的最大段的值,可能有人将注意力放在分段上,事实上,我们更多的应该关注结果。这是一道二分答案的题,你可以先确…...
山东大学软件学院项目实训-基于大模型的模拟面试系统-Vditor编辑器上传图片
Vditor编辑器图片上传功能 使用Vditor进行图片上传时,会返回图片在后端的相对路径,这在前端是无法进行显示的(如下图) 于是为了将图片正常显示,我采取了和头像上传一样的解决方案,使用阿里云图床进行存储…...
在 Kotlin 中,什么是内联函数?有什么作用?
在 Kotlin 中,内联函数是一种通过 inline 关键字声明的函数,其主要目的是优化高阶函数(即以函数作为参数或返回值的函数)的性能。 内联函数的函数体会在编译时直接插入到调用处,从而避免函数调用的开销,并…...
leetcode hot100:四、解题思路大全:滑动窗口(无重复字符的最长子串、找到字符串中所有字母异位词)、子串(和为k的子数组、)
滑动窗口 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 思路 滑动窗口哈希表。 从左到右遍历字符串,以当前字符的下标为右边界,并不断试图往左扩宽左边界。滑动窗口内维护的就是当前字符下标…...
JAVA EE(进阶)_HTML
思如云烟,行若磐石。 ——陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:JAVA EE(进阶)_进阶的开端-CSDN博客 1.HTML HTML(HyperText Mark…...
【[特殊字符] Vue 3 实现动态加载子组件并缓存状态完整指南】
文章目录 🧩 Vue 3 实现动态加载子组件并缓存状态完整指南💡 需求背景🎯 最终实现效果效果图 🛠️ 技术栈🧱 文件结构示例🔧 实现流程详解1. 定义组件映射关系2. 子组件定义并暴露方法3. 父组件逻辑处理✅ …...
从零开始的抽奖系统创作(2)
我们接着进行抽奖系统的完善。 前面我们完成了 1.结构初始化(统一结果返回之类的,还有包的分类) 2.加密(基于Hutool进行的对称与非对称加密) 3.用户注册 接下来我们先完善一下结构(统一异常处理&#…...
【计算机方向海外优质会议推荐】第二届图像处理、机器学习与模式识别国际学术会议(IPMLP 2025)
重要信息 大会官网:www.ipmlp.net 会议主页【点击参会/投稿/了解会议详情】:第二届图像处理、机器学习与模式识别国际学术会议(IPMLP 2025)_艾思科蓝_学术一站式服务平台 截稿时间:详见官网 接受/拒稿通知:投稿后1…...
进程之IPC通信二
4.共享内存 共享内存是进程间通信一种方式,多个进程共享一段内存,“ 共享内存 ”。由于多个进程共享了同一段内 存,这个段内存既是你的也是我的。也就是你往这个内存里面写入数据,实际上就相当于往我的内存里 面写入数据。比起其…...
打造高效数据处理利器:用Python实现Excel文件智能合并工具
有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析。今天,我想分享一个使用Python开发的小工具,它可以帮助我们轻松实现Excel文件的智能合并。C:\pythoncode\new\xlsx_merger.…...