Springboot 整合 Java DL4J 实现企业门禁人脸识别系统
🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。


Spring Boot 整合 Deeplearning4j 实现企业门禁人脸识别系统
一、引言
在当今数字化时代,企业对于安全性和效率的要求越来越高。传统的门禁系统如钥匙、密码等存在易丢失、易被破解等问题。而人脸识别技术作为一种非接触式、高效、准确的身份验证方式,正逐渐成为企业门禁系统的首选。本文将详细介绍如何使用 Spring Boot 整合 Java Deeplearning4j 实现一个企业门禁人脸识别系统,通过识别员工面部特征实现快速身份验证,提高安全性和通行效率。
二、神经网络选择
本案例中我们选择使用卷积神经网络(Convolutional Neural Network,CNN)来实现人脸识别。CNN 是一种专门用于处理图像数据的神经网络,具有以下优点:
- 能够自动提取图像的特征,减少了人工特征提取的工作量。
- 对图像的平移、旋转、缩放等具有一定的不变性,提高了识别的准确性。
- 可以处理大规模的图像数据,适用于企业门禁系统中可能出现的大量员工面部图像。
选择理由:
- 人脸识别是一个复杂的任务,需要对图像中的面部特征进行准确的提取和识别。
CNN能够自动学习图像的特征,并且在图像识别领域取得了非常好的效果。 - 企业门禁系统需要快速准确地识别员工的面部特征,以提高通行效率。
CNN可以在较短的时间内对图像进行处理,满足企业门禁系统的实时性要求。 - 随着深度学习技术的不断发展,
CNN的性能不断提高,并且有很多成熟的开源框架和工具可以使用,如Deeplearning4j,使得开发人脸识别系统变得更加容易。
三、数据集格式
- 数据集来源:我们可以使用公开的人脸识别数据集,如
Labeled Faces in the Wild(LFW)数据集,也可以自己收集企业员工的面部图像构建数据集。 - 数据集格式:数据集通常以图像文件的形式存储,每个图像文件对应一个员工的面部图像。图像文件可以是 JPEG、PNG 等常见的图像格式。为了方便管理和使用数据集,我们可以将图像文件按照员工的编号或姓名进行命名,并将其存储在一个特定的目录中。例如,我们可以创建一个名为“
dataset”的目录,然后在该目录下创建多个子目录,每个子目录对应一个员工,子目录中的图像文件即为该员工的面部图像。 - 数据集表格示例:
| 员工编号 | 员工姓名 | 图像文件路径 |
|---|---|---|
| 001 | 张三 | dataset/001/face1.jpg |
| 001 | 张三 | dataset/001/face2.jpg |
| 002 | 李四 | dataset/002/face1.jpg |
| 002 | 李四 | dataset/002/face2.jpg |
四、技术介绍
- Spring Boot:
Spring Boot是一个基于 Spring 框架的快速开发框架,它简化了 Spring 应用的开发过程,使得开发者可以更加专注于业务逻辑的实现。在本案例中,我们使用 Spring Boot 来构建企业门禁系统的后端服务,实现人脸识别的业务逻辑。 - Deeplearning4j:
Deeplearning4j是一个基于 Java 的深度学习框架,它支持多种神经网络模型,如 CNN、循环神经网络(Recurrent Neural Network,RNN)等。在本案例中,我们使用 Deeplearning4j 来训练和部署人脸识别模型。 - 图像预处理:在进行人脸识别之前,我们需要对图像进行预处理,包括图像的缩放、裁剪、归一化等操作,以提高模型的识别准确性。
- 模型训练:使用 Deeplearning4j 提供的 API,我们可以构建和训练人脸识别模型。在训练过程中,我们需要将数据集分为训练集和测试集,使用训练集对模型进行训练,使用测试集对模型的性能进行评估。
- 模型部署:训练好的模型可以部署到企业门禁系统中,实现人脸识别的功能。在部署过程中,我们需要将模型转换为适合在生产环境中运行的格式,并使用 Spring Boot 提供的 RESTful API 将模型暴露给前端应用。
五、相关Maven 依赖
在使用 Spring Boot 整合 Deeplearning4j 实现企业门禁人脸识别系统时,我们需要添加以下 Maven 依赖:
<dependency><groupId>org.deeplearning4j</groupId><artifactId>deeplearning4j-core</artifactId><version>1.0.0-beta7</version>
</dependency>
<dependency><groupId>org.deeplearning4j</groupId><artifactId>deeplearning4j-nn</artifactId><version>1.0.0-beta7</version>
</dependency>
<dependency><groupId>org.deeplearning4j</groupId><artifactId>deeplearning4j-ui</artifactId><version>1.0.0-beta7</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
六、代码示例
6.1 图像预处理
import org.deeplearning4j.nn.graph.ComputationGraph;
import org.deeplearning4j.nn.modelimport.keras.KerasModelImport;
import org.deeplearning4j.nn.transferlearning.FineTuneConfiguration;
import org.deeplearning4j.nn.transferlearning.TransferLearning;
import org.deeplearning4j.zoo.ZooModel;
import org.deeplearning4j.zoo.model.VGG16;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
import org.nd4j.linalg.factory.Nd4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class ImagePreprocessor {private static final Logger logger = LoggerFactory.getLogger(ImagePreprocessor.class);public static double[] preprocessImage(String imagePath) {try {BufferedImage image = ImageIO.read(new File(imagePath));int width = 224;int height = 224;BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);resizedImage.getGraphics().drawImage(image, 0, 0, width, height, null);double[] pixels = new double[width * height * 3];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {int argb = resizedImage.getRGB(x, y);int r = (argb >> 16) & 0xff;int g = (argb >> 8) & 0xff;int b = argb & 0xff;pixels[y * width * 3 + x * 3] = r / 255.0;pixels[y * width * 3 + x * 3 + 1] = g / 255.0;pixels[y * width * 3 + x * 3 + 2] = b / 255.0;}}DataNormalization scaler = new ImagePreProcessingScaler(0, 1);scaler.transform(Nd4j.create(pixels));return pixels;} catch (IOException e) {logger.error("Error preprocessing image: {}", e.getMessage());return null;}}
}
这段代码实现了对图像的预处理功能,包括图像的缩放、归一化等操作。首先,我们使用ImageIO读取图像文件,并将其缩放到指定的大小。然后,我们将图像的像素值转换为double类型,并进行归一化处理,使得像素值在 0 到 1 之间。
6.2 模型训练
import org.deeplearning4j.nn.graph.ComputationGraph;
import org.deeplearning4j.nn.modelimport.keras.KerasModelImport;
import org.deeplearning4j.nn.transferlearning.FineTuneConfiguration;
import org.deeplearning4j.nn.transferlearning.TransferLearning;
import org.deeplearning4j.zoo.ZooModel;
import org.deeplearning4j.zoo.model.VGG16;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
import org.nd4j.linalg.factory.Nd4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class FaceRecognitionTrainer {private static final Logger logger = LoggerFactory.getLogger(FaceRecognitionTrainer.class);public static ComputationGraph trainModel(String datasetPath, int numClasses) {try {// 加载预训练的 VGG16 模型ZooModel zooModel = VGG16.builder().build();ComputationGraph vgg16 = (ComputationGraph) zooModel.initPretrained();// 设置微调配置FineTuneConfiguration fineTuneConf = new FineTuneConfiguration.Builder().updater("sgd").learningRate(0.001).seed(123).build();// 进行迁移学习ComputationGraph model = new TransferLearning.GraphBuilder(vgg16).fineTuneConfiguration(fineTuneConf).setFeatureExtractor("fc2").removeVertexKeepConnections("predictions").addLayer("predictions",org.deeplearning4j.nn.conf.layers.OutputLayer.builder().nIn(4096).nOut(numClasses).activation("softmax").build()).build();// 加载数据集List<double[]> images = new ArrayList<>();List<Integer> labels = new ArrayList<>();File datasetDir = new File(datasetPath);for (File employeeDir : datasetDir.listFiles()) {int label = Integer.parseInt(employeeDir.getName());for (File imageFile : employeeDir.listFiles()) {double[] pixels = ImagePreprocessor.preprocessImage(imageFile.getAbsolutePath());if (pixels!= null) {images.add(pixels);labels.add(label);}}}// 创建数据集迭代器DataSetIterator iterator = new FaceRecognitionDataSetIterator(images, labels);// 训练模型model.fit(iterator);return model;} catch (Exception e) {logger.error("Error training model: {}", e.getMessage());return null;}}
}
这段代码实现了对人脸识别模型的训练功能。首先,我们加载预训练的 VGG16 模型,并设置微调配置。然后,我们使用迁移学习的方法,将预训练的模型进行微调,以适应人脸识别的任务。接着,我们加载数据集,并创建数据集迭代器。最后,我们使用迭代器对模型进行训练。
6.3 模型部署
import org.deeplearning4j.nn.graph.ComputationGraph;
import org.deeplearning4j.zoo.ZooModel;
import org.deeplearning4j.zoo.model.VGG16;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.factory.Nd4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@SpringBootApplication
@RestController
public class FaceRecognitionApplication {private static final Logger logger = LoggerFactory.getLogger(FaceRecognitionApplication.class);private ComputationGraph model;public static void main(String[] args) {SpringApplication.run(FaceRecognitionApplication.class, args);}@PostMapping("/recognize")public ResponseEntity<String> recognizeFace(@RequestParam("image") MultipartFile imageFile) {try {// 加载模型(如果尚未加载)if (model == null) {model = FaceRecognitionTrainer.trainModel("dataset", 10);}// 保存上传的图像文件File tempFile = File.createTempFile("temp", ".jpg");imageFile.transferTo(tempFile);// 预处理图像double[] pixels = ImagePreprocessor.preprocessImage(tempFile.getAbsolutePath());// 进行人脸识别int prediction = predictFace(pixels);// 返回识别结果return new ResponseEntity<>("Recognized face as employee " + prediction, HttpStatus.OK);} catch (IOException e) {logger.error("Error recognizing face: {}", e.getMessage());return new ResponseEntity<>("Error recognizing face", HttpStatus.INTERNAL_SERVER_ERROR);}}private int predictFace(double[] pixels) {double[] output = model.outputSingle(pixels);int prediction = Nd4j.argMax(output).getInt(0);return prediction;}
}
这段代码实现了将训练好的人脸识别模型部署为一个 RESTful API 的功能。我们使用 Spring Boot 构建了一个后端服务,并在服务中加载训练好的模型。当接收到前端应用上传的图像文件时,我们对图像进行预处理,并使用模型进行人脸识别。最后,我们将识别结果返回给前端应用。
七、单元测试
7.1 图像预处理测试
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;public class ImagePreprocessorTest {@Testpublic void testPreprocessImage() {double[] pixels = ImagePreprocessor.preprocessImage("test.jpg");assertNotNull(pixels);}
}
这段代码对图像预处理功能进行了单元测试。我们使用一个测试图像文件,并调用ImagePreprocessor.preprocessImage方法对图像进行预处理。然后,我们检查返回的像素数组是否不为空。
7.2 模型训练测试
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;public class FaceRecognitionTrainerTest {@Testpublic void testTrainModel() {ComputationGraph model = FaceRecognitionTrainer.trainModel("dataset", 10);assertNotNull(model);}
}
这段代码对模型训练功能进行了单元测试。我们使用一个测试数据集,并调用FaceRecognitionTrainer.trainModel方法对模型进行训练。然后,我们检查返回的模型是否不为空。
7.3 模型部署测试
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile;
import java.io.FileInputStream;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertEquals;@SpringBootTest
public class FaceRecognitionApplicationTest {@Testpublic void testRecognizeFace() throws IOException {FaceRecognitionApplication application = new FaceRecognitionApplication();FileInputStream fis = new FileInputStream("test.jpg");MockMultipartFile imageFile = new MockMultipartFile("image", "test.jpg", "image/jpeg", fis);ResponseEntity<String> response = application.recognizeFace(imageFile);assertEquals(HttpStatus.OK, response.getStatusCode());}
}
这段代码对模型部署功能进行了单元测试。我们使用一个测试图像文件,并模拟前端应用上传图像文件的请求。然后,我们检查返回的响应状态码是否为 200(OK)。
八、预期输出
- 图像预处理:经过图像预处理后,图像的像素值应该在 0 到 1 之间,并且图像的大小应该符合模型的输入要求。
- 模型训练:在模型训练过程中,我们可以观察到模型的损失函数和准确率的变化情况。随着训练的进行,损失函数应该逐渐减小,准确率应该逐渐提高。
- 模型部署:当我们上传一张员工的面部图像时,后端服务应该能够快速准确地识别出该员工的身份,并返回相应的识别结果。
九、参考资料文献
- Deeplearning4j 官方文档
- Spring Boot 官方文档
- 卷积神经网络介绍
- 人脸识别技术介绍
相关文章:
Springboot 整合 Java DL4J 实现企业门禁人脸识别系统
🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…...
SSTI模板注入+CTF实例
参考文章: 一文了解SSTI和所有常见payload 以flask模板为例-腾讯云开发者社区-腾讯云 (tencent.com) python-flask模块注入(SSTI) - ctrl_TT豆 - 博客园 (cnblogs.com) ssti详解与例题以及绕过payload大全_ssti绕过空格-CSDN博客 1. SSTI(模板注入&…...
iPhone 16 Pro 拆解揭秘:设计改进与维修便利性
苹果最新推出的iPhone 16系列在许多方面都进行了更新和改进,而这次我们要聚焦的是其中的高端型号——iPhone 16 Pro。 这款手机不仅在性能上有所提升,在内部构造上也带来了不少变化,让我们一起来看看这些细节吧。 更容易进入的内部结构 对于…...
Java项目实战II养老||基于Java+Spring Boot+MySQL的社区智慧养老监护管理平台设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着老龄化…...
利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)
利用FnOS搭建虚拟云桌面,并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面,并搭建前端开发环境(一) 上一章安装了飞牛FnOS系统,界面如下,这一张配置前端…...
【Python】Qwen-VL-7B box
VLLM-Qwen2-VL-7B-Instruct import cv2# 读取图像 image_path haibaoA.png # 替换为图像的路径 image cv2.imread(image_path)# 定义框的坐标 (x1, y1) 是左上角,(x2, y2) 是右下角 x1, y1 200, 550 # 左上角坐标 x2, y2 799, 750 # 右下角坐标 h, w image.…...
echarts按需引入解决项目大小问题
背景: 按需加载缩减项目大小,提升项目性能和可用性 实现: 创建echarts.js main.js进行配置 页面中引用 效果 全量导入 按需加载:...
天气预报echarts
如上图,可以切换温度,降水量,风力风向和空气质量 <template><el-radio-group v-model"selectedData" change"updateChart"><el-radio-button label"temperature">温度</el-radio-butto…...
Kafka-初识
一、Kafka是什么? Kafka是一个高度可扩展、弹性、容错和安全的分布式流处理平台,由服务器和客户端组成,通过高性能TCP网络协议进行通信。它可以像消息队列一样生产和消费数据。可以部署在裸机硬件、虚拟机和容器上,也可以部署在本…...
Redis的主要的特性和优势 ?
Redis 的主要特性 内存存储:Redis 将数据存储在内存中,这使得读写操作非常快速。它还支持将数据持久化到磁盘,以防止数据丢失。 丰富的数据结构:Redis 不仅支持简单的字符串键值对,还支持更复杂的数据结构,…...
yolov5-7.0模型DNN加载函数及参数详解(重要)
yolov5-7.0模型DNN加载函数及参数详解(重要) 引言yolov5(v7.0)1,yolov5.h(加载对应模型里面的相关参数要更改)2,main主程序(1)加载网络(2)检测推理࿰…...
StringEntity 用于将字符串内容作为 HTTP 请求实体(请求体)
StringEntity 类是 Apache HttpClient 库中的一个类,它用于将字符串内容作为 HTTP 请求实体(请求体)。这个类非常适合用于发送 JSON、XML 或其他需要以字符串形式发送的数据。以下是 StringEntity 类的一些常用方法和代码案例: …...
校园系统校园小程序 论坛校园圈系统失物招领、闲置二手、跑腿外卖等校园圈子系统应该具备有哪些功能
针对校园系统、校园小程序、论坛校园圈系统以及失物招领、闲置二手、跑腿外卖等具体功能,一个综合性的校园圈子系统应该具备以下主要功能: 前后端源码查看 一、基础功能 用户注册与登录 提供用户注册和登录功能,支持学生身份验证、手机号验…...
[AWS云]kafka调用和创建
背景:因为因为公司的项目需要使用AWS的kafka,但是在创建和使用过程中都遇到了一些报错和麻烦,毕竟老外的东西,和阿里云、华为使用起来还是不一样。 一、创建(创建的配置过程就略了,就是配置一下可用区、型号࿰…...
查看 Excel 应用程序中已打开的 Excel 文件的完整路径
要查看 Excel 应用程序中已打开的 Excel 文件的完整路径(全路径),你可以通过以下几种方法获取具体路径,尤其是在 VSTO 应用程序中。 方法1:使用 VSTO Excel 外接程序代码 在 VSTO 外接程序代码中,您可以直接…...
学习 RocketMQ 单机部署、消息发送、消息接收
文章目录 RocketMQ 介绍为什么要使用 MQ ?RocketMQ 与其他产品对比vs Kafkavs RabbitMQvs ActiveMQ RocketMQ 重要概念部署 Namesrver、Broker、Dashboard快速入门消息生产者消息消费者 消费模式简单消息1)同步发送2)异步发送3)单…...
【计算机网络】CDN
CDN(Content Delivery Network,内容分发网络)是一种分布式的服务器网络,旨在通过将内容缓存到多个地理位置的服务器上,加速内容的分发和传递。CDN 的主要目的是减少用户访问网站时的延迟,提升用户体验&…...
数据结构:插入排序
1.插入排序 此排序如打扑克牌一样;每次抓牌,把扑克从前向后扒拉;找到合适的位置插入进去—所以叫插入排序; 时间复杂度:O(N^2) int arr[10] { 9,8,7,6,5,4,3,2,1,0 };//数据太多就不好写了 …...
Nginx反向代理配置与负载均衡配置
简介:整理自黑马程序员苍穹外卖的第11节 nginx是什么? nginx的好处 nginx反向代理配置方式 nginx负载均衡的配置方式 nginx负责均衡策略...
axios 前端与 Django 后端的 POST 交互
背景 自己在写一些油猴脚本,前端需要用 JS,后端是自己的服务,是用 Python 的 Django 框架完成的。 油猴脚本中需要通过 POST 方法,向后端传一些数据,所以前端我用的是 axios 库,后端需要用 Django 处理 P…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
