首页
API市场
每日免费
OneAPI
xAPI
易源定价
技术博客
易源易彩
帮助中心
控制台
登录/注册
技术博客
零基础入门:构建和部署你的首个SpringBoot工程
零基础入门:构建和部署你的首个SpringBoot工程
作者:
万维易源
2024-11-14
SpringBoot
MVC架构
MySQL
Navicat
### 摘要 本文旨在为零基础读者提供构建和部署超简易SpringBoot工程的图解指南。文章将简要介绍MVC架构模型,该模型将数据处理逻辑和数据库交互交由模型处理,视图负责展示用户界面,控制器则负责协调模型和视图之间的交互。这种分离策略使得代码更加模块化,便于维护和扩展。简而言之,MVC通过将业务逻辑、数据和用户界面分开管理,提高了代码的可读性和可维护性。 ### 关键词 SpringBoot, MVC架构, MySQL, Navicat, pom.xml ## 一、构建SpringBoot基础环境 ### 1.1 了解MVC架构及其在SpringBoot中的应用 在构建任何复杂的软件系统时,良好的架构设计是成功的关键。MVC(Model-View-Controller)架构模型就是这样一种经典的设计模式,它通过将应用程序的不同部分分离,使得代码更加模块化、易于维护和扩展。在SpringBoot中,MVC架构的应用尤为广泛,它不仅简化了开发流程,还提高了代码的可读性和可维护性。 **模型(Model)**:模型层负责处理数据和业务逻辑。在SpringBoot中,模型通常是由实体类和数据访问对象(DAO)组成,它们与数据库进行交互,执行数据的增删改查操作。 **视图(View)**:视图层负责展示用户界面。在Web应用中,视图通常是由HTML、CSS和JavaScript等前端技术实现的页面。SpringBoot支持多种视图技术,如Thymeleaf、Freemarker等,这些模板引擎可以帮助开发者快速生成动态页面。 **控制器(Controller)**:控制器层负责协调模型和视图之间的交互。在SpringBoot中,控制器通常是由带有`@Controller`注解的类实现,它们处理用户的请求,调用模型层的方法,并将结果传递给视图层进行展示。 通过这种分离策略,MVC架构使得每个部分都有明确的职责,从而降低了代码的耦合度,提高了系统的灵活性和可扩展性。对于初学者来说,理解MVC架构的基本概念是构建SpringBoot应用的第一步。 ### 1.2 安装并配置MySQL数据库环境 在开始构建SpringBoot应用之前,首先需要准备好数据库环境。MySQL是一个广泛使用的开源关系型数据库管理系统,它以其高性能、可靠性和易用性而著称。以下是安装和配置MySQL数据库的步骤: 1. **下载并安装MySQL**: - 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/),选择适合您操作系统的版本进行下载。 - 按照安装向导的提示完成安装过程。在安装过程中,记得设置root用户的密码,这将是您连接数据库时的凭证。 2. **启动MySQL服务**: - 在Windows系统中,可以通过“服务”管理器启动MySQL服务。 - 在Linux系统中,可以使用以下命令启动MySQL服务: ```bash sudo service mysql start ``` 3. **验证安装**: - 打开命令行工具,输入以下命令连接到MySQL服务器: ```bash mysql -u root -p ``` - 输入您在安装过程中设置的root用户密码,如果连接成功,说明MySQL已正确安装并运行。 4. **创建数据库**: - 连接到MySQL后,可以使用以下SQL语句创建一个新的数据库: ```sql CREATE DATABASE mydatabase; ``` - 确认数据库创建成功后,可以使用以下命令切换到新创建的数据库: ```sql USE mydatabase; ``` ### 1.3 使用Navicat Premium 16进行数据库操作实践 Navicat Premium 16 是一款功能强大的数据库管理和开发工具,它支持多种数据库系统,包括MySQL、PostgreSQL、SQLite等。使用Navicat Premium 16,您可以更方便地进行数据库操作,如建库建表、数据导入导出等。以下是使用Navicat Premium 16进行数据库操作的步骤: 1. **安装Navicat Premium 16**: - 访问Navicat官方网站(https://www.navicat.com/),下载并安装Navicat Premium 16。 - 安装完成后,启动Navicat Premium 16。 2. **连接MySQL数据库**: - 在Navicat主界面中,点击“新建连接”按钮。 - 选择“MySQL”作为连接类型,填写连接名称、主机名(通常是localhost)、端口号(默认为3306)、用户名(root)和密码。 - 点击“测试连接”按钮,确保连接成功后,点击“确定”保存连接。 3. **创建数据库和表**: - 在左侧的连接列表中,找到并展开您刚刚创建的MySQL连接。 - 右键点击“数据库”,选择“新建数据库”,输入数据库名称(如mydatabase),点击“确定”。 - 右键点击新创建的数据库,选择“新建表”,在弹出的窗口中定义表的结构,包括字段名称、数据类型和约束条件。 - 完成表结构定义后,点击“确定”保存表。 4. **数据操作**: - 在Navicat中,您可以使用图形界面或SQL编辑器进行数据的插入、查询、更新和删除操作。 - 例如,使用SQL编辑器插入一条记录: ```sql INSERT INTO mytable (column1, column2) VALUES ('value1', 'value2'); ``` 通过以上步骤,您可以轻松地使用Navicat Premium 16进行数据库操作,为后续的SpringBoot项目开发打下坚实的基础。希望这些详细的步骤能够帮助您顺利地完成数据库环境的搭建和操作。 ## 二、SpringBoot项目创建与配置 ### 2.1 创建SpringBoot项目的基本步骤 在完成了数据库环境的搭建之后,接下来我们将进入SpringBoot项目的创建阶段。SpringBoot以其简洁的配置和强大的功能,成为了现代Web应用开发的首选框架。以下是创建SpringBoot项目的详细步骤: 1. **选择开发工具**: - 推荐使用IntelliJ IDEA或Eclipse等主流IDE,这些工具提供了丰富的插件和模板,可以显著提高开发效率。 - 以IntelliJ IDEA为例,打开IDEA,选择“File” -> “New” -> “Project”。 2. **选择Spring Initializr**: - 在新建项目对话框中,选择“Spring Initializr”。这是Spring官方提供的项目初始化工具,可以帮助我们快速生成项目结构。 - 确保选择了正确的Java版本(建议使用Java 8及以上版本)。 3. **配置项目基本信息**: - 填写项目的基本信息,如Group(通常是公司或组织的域名倒序)、Artifact(项目名称)、Name(项目显示名称)、Description(项目描述)和Package name(包名)。 - 选择项目存储路径,点击“Next”继续。 4. **选择依赖项**: - 在依赖项选择页面,搜索并添加所需的依赖项。对于本项目,我们需要以下依赖: - Spring Web:用于构建Web应用。 - Spring Data JPA:用于简化数据库操作。 - MySQL Driver:用于连接MySQL数据库。 - Thymeleaf:用于生成动态HTML页面。 - 选择完依赖项后,点击“Next”继续。 5. **生成项目**: - 最后一步,点击“Finish”生成项目。IDEA会自动下载所需的依赖项并生成项目结构。 - 生成完成后,项目结构将包含src/main/java、src/main/resources等目录,以及pom.xml文件。 通过以上步骤,您已经成功创建了一个基本的SpringBoot项目。接下来,我们将进一步配置项目的依赖项,以确保项目能够顺利运行。 ### 2.2 配置pom.xml文件以避免常见错误 pom.xml文件是Maven项目的配置文件,它包含了项目的依赖项、构建配置等信息。正确配置pom.xml文件是确保项目顺利运行的关键。以下是一些常见的配置错误及解决方法: 1. **依赖项版本冲突**: - 在多模块项目中,不同模块可能依赖于不同版本的同一个库,导致版本冲突。为了避免这种情况,可以在pom.xml文件中使用`<dependencyManagement>`标签统一管理依赖项的版本。 - 示例: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.5.4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 2. **缺少必要的依赖项**: - 确保项目中包含了所有必要的依赖项。例如,如果您使用了Spring Data JPA,但忘记添加MySQL驱动,项目将无法正常连接数据库。 - 示例: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> ``` 3. **配置文件路径错误**: - 确保application.properties或application.yml文件位于src/main/resources目录下,并且配置正确。 - 示例: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=yourpassword spring.jpa.hibernate.ddl-auto=update ``` 通过以上配置,您可以避免常见的依赖项和配置错误,确保项目能够顺利运行。 ### 2.3 使用aliyun脚手架智能生成数据 在实际开发中,手动编写大量的数据初始化代码既耗时又容易出错。为了提高开发效率,我们可以使用aliyun脚手架来智能生成数据。以下是如何使用aliyun脚手架生成数据的步骤: 1. **安装aliyun脚手架**: - 访问aliyun脚手架的GitHub仓库(https://github.com/aliyun/aliyun-spring-boot-starter),按照文档中的说明进行安装。 - 如果您使用的是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> ``` 2. **配置aliyun脚手架**: - 在application.properties或application.yml文件中,添加aliyun脚手架的相关配置。 - 示例: ```properties aliyun.data.generator.enabled=true aliyun.data.generator.package-name=com.example.demo aliyun.data.generator.output-dir=src/main/java ``` 3. **定义数据生成规则**: - 在项目中创建一个配置类,使用`@DataGenerator`注解定义数据生成规则。 - 示例: ```java @DataGenerator public class DataGeneratorConfig { @Table(name = "mytable") public static class MyTable { @Column(name = "column1") private String column1; @Column(name = "column2") private String column2; } } ``` 4. **生成数据**: - 运行项目,aliyun脚手架将根据定义的规则自动生成数据,并将其插入到数据库中。 - 您可以在控制台中查看生成的数据,确保数据生成正确。 通过使用aliyun脚手架,您可以大大减少手动编写数据初始化代码的工作量,提高开发效率。希望这些步骤能够帮助您顺利完成SpringBoot项目的构建和数据生成。 ## 三、项目部署与测试 ### 3.1 部署SpringBoot应用到服务器 在完成了SpringBoot项目的开发和测试之后,下一步就是将应用部署到生产环境中。部署过程虽然看似简单,但每一个细节都至关重要,因为它直接关系到应用的稳定性和性能。以下是部署SpringBoot应用到服务器的详细步骤: 1. **选择合适的服务器**: - 对于初学者,可以选择一些云服务提供商,如阿里云、腾讯云或AWS。这些平台提供了丰富的资源和灵活的配置选项,可以根据应用的需求选择合适的服务器配置。 - 例如,阿里云的ECS(Elastic Compute Service)是一个不错的选择,它提供了多种实例类型,从入门级到高性能实例应有尽有。 2. **安装必要的软件**: - 登录到您的服务器,确保已经安装了Java运行环境。可以使用以下命令检查Java是否已安装: ```bash java -version ``` - 如果未安装,可以使用以下命令安装OpenJDK: ```bash sudo apt-get update sudo apt-get install openjdk-11-jdk ``` 3. **上传项目文件**: - 将本地的SpringBoot项目打包成JAR文件。在项目根目录下运行以下命令: ```bash mvn clean package ``` - 将生成的JAR文件上传到服务器。可以使用SCP(Secure Copy Protocol)命令进行文件传输: ```bash scp target/your-app.jar user@your-server-ip:/path/to/destination ``` 4. **启动应用**: - 登录到服务器,导航到JAR文件所在的目录,使用以下命令启动应用: ```bash java -jar your-app.jar ``` - 为了确保应用在后台持续运行,可以使用nohup命令: ```bash nohup java -jar your-app.jar & ``` 5. **配置防火墙**: - 确保服务器的防火墙允许外部访问应用的端口。例如,如果应用监听8080端口,可以使用以下命令开放该端口: ```bash sudo ufw allow 8080 ``` 通过以上步骤,您可以将SpringBoot应用成功部署到服务器上,确保其在生产环境中稳定运行。 ### 3.2 进行单元测试和集成测试 测试是软件开发过程中不可或缺的一环,它有助于发现和修复潜在的问题,提高应用的质量和可靠性。SpringBoot提供了丰富的测试支持,使得单元测试和集成测试变得更加简单和高效。以下是进行单元测试和集成测试的详细步骤: 1. **编写单元测试**: - 单元测试主要用于验证单个方法或类的功能是否正确。在SpringBoot中,可以使用JUnit和Mockito进行单元测试。 - 例如,假设有一个Service类,可以编写如下单元测试: ```java import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertEquals; public class MyServiceTest { @Mock private MyRepository myRepository; @InjectMocks private MyService myService; @Test public void testMyMethod() { // 模拟数据 Mockito.when(myRepository.findById(1L)).thenReturn(Optional.of(new MyEntity())); // 调用方法 MyEntity result = myService.getMethod(1L); // 断言结果 assertEquals("expectedValue", result.getValue()); } } ``` 2. **编写集成测试**: - 集成测试主要用于验证多个组件之间的交互是否正确。在SpringBoot中,可以使用SpringBootTest注解进行集成测试。 - 例如,假设有一个Controller类,可以编写如下集成测试: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest public class MyControllerTest { @Autowired private MockMvc mockMvc; @Test public void testMyEndpoint() throws Exception { mockMvc.perform(get("/api/myendpoint")) .andExpect(status().isOk()) .andExpect(content().string("expectedResponse")); } } ``` 3. **运行测试**: - 在IDE中,可以直接运行测试类。也可以使用Maven命令运行所有测试: ```bash mvn test ``` 通过编写和运行单元测试和集成测试,您可以确保应用的各个部分都能正常工作,提高应用的可靠性和稳定性。 ### 3.3 性能优化与异常处理 在应用上线后,性能优化和异常处理是保证用户体验和系统稳定性的关键。SpringBoot提供了多种工具和机制,帮助开发者进行性能优化和异常处理。以下是性能优化和异常处理的一些最佳实践: 1. **性能优化**: - **数据库优化**:合理设计数据库表结构,使用索引提高查询效率。例如,对于频繁查询的字段,可以创建索引: ```sql CREATE INDEX idx_column1 ON mytable(column1); ``` - **缓存机制**:使用缓存可以显著提高应用的响应速度。SpringBoot支持多种缓存方案,如Redis、Caffeine等。例如,使用Caffeine缓存: ```java import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class MyService { @Cacheable(value = "myCache") public MyEntity getEntity(Long id) { return myRepository.findById(id).orElse(null); } } ``` - **异步处理**:对于耗时的操作,可以使用异步处理机制,避免阻塞主线程。例如,使用Spring的`@Async`注解: ```java import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service public class MyService { @Async public void performLongTask() { // 耗时操作 } } ``` 2. **异常处理**: - **全局异常处理**:使用`@ControllerAdvice`注解创建全局异常处理器,捕获并处理所有未被捕获的异常。例如: ```java import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } ``` - **日志记录**:使用日志记录工具(如Logback、Log4j2)记录异常信息,便于问题排查。例如,在application.properties中配置日志级别: ```properties logging.level.root=INFO logging.level.com.example=DEBUG ``` 通过以上性能优化和异常处理措施,您可以确保应用在高负载情况下依然保持高性能和高可用性,为用户提供更好的体验。希望这些详细的步骤和最佳实践能够帮助您顺利完成SpringBoot应用的部署、测试和优化。 ## 四、进阶技巧与实践 ### 4.1 深入理解SpringBoot的工作原理 SpringBoot的核心理念在于“约定优于配置”,这一理念极大地简化了Spring应用的初始配置。SpringBoot通过一系列默认配置和自动配置机制,使得开发者可以快速启动和运行应用,而无需过多关注底层细节。然而,深入了解SpringBoot的工作原理,可以帮助我们在遇到复杂问题时,更加从容地应对。 **自动配置**:SpringBoot的自动配置机制是其最吸引人的特性之一。当我们在项目中引入某个依赖时,SpringBoot会自动检测并配置相应的组件。例如,当我们引入`spring-boot-starter-web`依赖时,SpringBoot会自动配置Tomcat作为嵌入式服务器,并启用Spring MVC。这种自动配置不仅减少了配置文件的冗余,还提高了开发效率。 **启动过程**:SpringBoot应用的启动过程可以分为几个关键步骤。首先,`SpringApplication`类负责初始化Spring应用上下文。接着,`SpringApplication.run()`方法会加载配置文件,解析命令行参数,并启动嵌入式服务器。在整个启动过程中,SpringBoot会自动扫描并注册所有带有`@Component`注解的类,包括控制器、服务和存储库。 **依赖注入**:SpringBoot继承了Spring框架的强大依赖注入功能。通过`@Autowired`注解,我们可以轻松地将依赖注入到需要的地方。SpringBoot的依赖注入机制不仅简化了代码,还提高了代码的可测试性和可维护性。 ### 4.2 掌握SpringBoot的扩展性与定制化 尽管SpringBoot提供了许多默认配置,但在实际开发中,我们往往需要对应用进行定制化和扩展。SpringBoot提供了多种方式,使我们能够灵活地调整和扩展应用。 **自定义配置**:SpringBoot允许我们通过`application.properties`或`application.yml`文件自定义配置。例如,我们可以配置数据库连接、缓存策略、日志级别等。此外,SpringBoot还支持多环境配置,通过不同的配置文件(如`application-dev.yml`、`application-prod.yml`)来管理不同环境下的配置。 **自定义starter**:SpringBoot的starter机制使得我们可以轻松地引入第三方库。如果我们需要使用某个特定的功能,但没有现成的starter,可以自己创建一个。自定义starter通常包含一组默认配置和自动配置类,使得其他开发者可以方便地引入和使用。 **事件监听**:SpringBoot提供了事件监听机制,允许我们在应用生命周期的各个阶段执行自定义逻辑。例如,我们可以在应用启动时执行初始化操作,或者在应用关闭时执行清理操作。通过实现`ApplicationListener`接口,我们可以监听并处理各种应用事件。 **自定义注解**:SpringBoot支持自定义注解,通过元注解和组合注解,我们可以创建自己的注解,以简化代码和提高可读性。例如,我们可以创建一个`@MyService`注解,用于标记服务类,并在内部使用`@Service`注解。 ### 4.3 案例分享:从零到一的SpringBoot项目 为了更好地理解SpringBoot的使用,让我们通过一个具体的案例,从零开始构建一个简单的SpringBoot项目。假设我们要开发一个简单的博客系统,包括用户管理、文章发布和评论功能。 **项目初始化**: 1. **创建项目**:使用Spring Initializr创建一个新的SpringBoot项目,选择必要的依赖项,如Spring Web、Spring Data JPA、MySQL Driver和Thymeleaf。 2. **配置数据库**:在`application.properties`文件中配置MySQL数据库连接信息。 ```properties spring.datasource.url=jdbc:mysql://localhost:3306/blogdb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=yourpassword spring.jpa.hibernate.ddl-auto=update ``` **实体类和存储库**: 1. **定义实体类**:创建用户、文章和评论的实体类,并使用JPA注解映射数据库表。 ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // Getters and Setters } @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String content; @ManyToOne private User author; // Getters and Setters } @Entity public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String content; @ManyToOne private Post post; @ManyToOne private User author; // Getters and Setters } ``` 2. **创建存储库**:使用Spring Data JPA创建用户、文章和评论的存储库接口。 ```java public interface UserRepository extends JpaRepository<User, Long> { } public interface PostRepository extends JpaRepository<Post, Long> { } public interface CommentRepository extends JpaRepository<Comment, Long> { } ``` **服务层**: 1. **创建服务类**:定义用户、文章和评论的服务类,实现业务逻辑。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; public User createUser(User user) { return userRepository.save(user); } public List<User> getAllUsers() { return userRepository.findAll(); } } @Service public class PostService { @Autowired private PostRepository postRepository; public Post createPost(Post post) { return postRepository.save(post); } public List<Post> getAllPosts() { return postRepository.findAll(); } } @Service public class CommentService { @Autowired private CommentRepository commentRepository; public Comment createComment(Comment comment) { return commentRepository.save(comment); } public List<Comment> getAllComments() { return commentRepository.findAll(); } } ``` **控制器层**: 1. **创建控制器类**:定义用户、文章和评论的控制器类,处理HTTP请求。 ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @PostMapping public User createUser(@RequestBody User user) { return userService.createUser(user); } @GetMapping public List<User> getAllUsers() { return userService.getAllUsers(); } } @RestController @RequestMapping("/posts") public class PostController { @Autowired private PostService postService; @PostMapping public Post createPost(@RequestBody Post post) { return postService.createPost(post); } @GetMapping public List<Post> getAllPosts() { return postService.getAllPosts(); } } @RestController @RequestMapping("/comments") public class CommentController { @Autowired private CommentService commentService; @PostMapping public Comment createComment(@RequestBody Comment comment) { return commentService.createComment(comment); } @GetMapping public List<Comment> getAllComments() { return commentService.getAllComments(); } } ``` 通过以上步骤,我们成功地从零开始构建了一个简单的SpringBoot项目。这个项目涵盖了用户管理、文章发布和评论功能,展示了SpringBoot在实际开发中的强大功能和灵活性。希望这个案例能够帮助初学者更好地理解和掌握SpringBoot的使用。 ## 五、总结 本文为零基础读者提供了构建和部署超简易SpringBoot工程的图解指南。通过详细介绍MVC架构模型,我们解释了如何将数据处理逻辑、用户界面和控制器分离,从而提高代码的模块化、可读性和可维护性。在基本环境准备部分,我们指导读者如何使用MySQL数据库进行建库建表操作,并推荐使用Navicat Premium 16进行数据库管理。接着,我们介绍了如何创建SpringBoot项目,配置pom.xml文件以避免常见错误,并使用aliyun脚手架智能生成数据。最后,我们详细讲解了如何将SpringBoot应用部署到服务器,进行单元测试和集成测试,以及性能优化和异常处理的最佳实践。通过这些步骤,读者可以顺利地从零开始构建和部署一个功能完善的SpringBoot应用。希望本文能够帮助初学者快速上手SpringBoot,开启他们的开发之旅。
最新资讯
解析'Agent'概念:揭开其在Windsurf团队中的真正含义
加载文章中...
客服热线
客服热线请拨打
400-998-8033
客服QQ
联系微信
客服微信
商务微信
意见反馈