[Java]SpringMVC 学习笔记(动力节点王鹤王妈妈2020)(三)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: [Java]SpringMVC 学习笔记(动力节点王鹤王妈妈2020)(三)

绝对路径和相对路径

  • 绝对路径:带有协议名称、主机IP以及端口号的地址
  • 相对地址:没有协议、主机IP以及端口号开头的地址,相对地址不能独立使用,必须有一个参考地址,通过参考地址+相对地址才能指定资源

对于前端

  • 对于前端,如果地址不以/开头,如:1.html,则该请求的相当于./1.html,即向服务器请求当前访问目录下的1.html资源
  • 相当于相对路径
  • 如当前访问的地址为 http://localhost:8080/springmvc/index.jsp1.html 相当于 ./1.html,等于 http://localhost:8080/springmvc/1.html
  • 对于前端,如果地址以/开头,如:/1.html,则该请求的相当于向服务器请求服务器根目录下的1.html资源
  • 相当于绝对路径
  • 如当前访问的地址为 http://localhost:8080/springmvc/index.jsp/1.html 相当于http://localhost:8080/1.html

对于后端

  • 对于后端,如果地址以/开头,则开头的/相当于当前项目的 webapp 目录
  • 相当于绝对路径
  • 如当前服务器所在的地址为 http://localhost:8080/springmvc/list,在服务器要进行请求转发到 /1.html,则转发的地址相当于 http://localhost:8080/wabapp/1.html
  • 项目部署之后 wabapp 目录就相当于项目的根目录,项目的根目录为 springmvc
@RequestMapping(value = {"/list"})
public ModelAndView list() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/1.html");
    return modelAndView;
}

  • 对于后端,如果地址不以 / 开头,则相当于相对路径,相对当前所在目录下寻找资源,与 ./ 效果相同
@RequestMapping(value = {"/list"})
public ModelAndView list() {
    ModelAndView modelAndView = new ModelAndView();
    // 请求访问的地址(当前该方法对应的地址)http://localhost:8080/springmvc/list
    // 1.html <=> ./1.html 
    // 当前所在目录为 http://localhost:8080/springmvc/
    // 对于项目部署之后webapp项目就是项目的根目录
    // 当前所在目录相当于 http://localhost:8080/webapp/
    // 所以 http://localhost:8080/springmvc/./1.html 
    // <=> http://localhost:8080/webapp/1.html
    modelAndView.setViewName("1.html");
    return modelAndView;
}

@RequestMapping(value = {"/list"})
public ModelAndView list() {
    ModelAndView modelAndView = new ModelAndView();
    // static/html/hello.html <=> ./static/html/hello.html
    // http://localhost:8080/sprinmvc/list
    // <=> http://localhost:8080/webapp/static/html/hello.html
    modelAndView.setViewName("static/html/hello.html");
    return modelAndView;
}

@RequestMapping(value = {"/user/aaa/list"})
public ModelAndView list() {
    ModelAndView modelAndView = new ModelAndView();
    // http://localhost:8080/springmvc/user/aaa/list
    // ../user.html 回退一层目录
    // http://localhost:8080/springmvc/user/aaa/../user.html
    // <=> http://localhost:8080/springmvc/user/aaa/user.html
    // <=> http://localhost:8080/webapp/user/aaa/user.html
    modelAndView.setViewName("../user.html");
    return modelAndView;
}

项目路径访问

动态获取web项目名 HttpServletRequest.getContextPath()

<!-- ${pageContext.request.contextPath} 动态获取web项目名 -->
<a href="${pageContext.request.contextPath}/static/html/hello.html">
    ${pageContext.request.contextPath}/static/html/hello.html"
</a>

base 标签设置 html 页面访问地址的基地址

  • base 标签设置的是所有 html 页面访问地址的基地址
  • 使用了base标签之后,html页面中没有以/开头的地址,都会以base标签中设置的地址为参考地址
<%--
  Created by IntelliJ IDEA.
  User: cw
  Date: 2023-05-24
  Time: 12:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="http://localhost:8080/${pageContext.request.contextPath}/">
</head>
<body>
<h2>Hello World!</h2>
<a href="1.html">跳转链接:1.html</a><br/>
<a href="2.html">跳转链接:2.html</a><br/>
<a href="./3.html">跳转链接:./3.html</a><br/>
<a href="4.html">跳转链接:4.html</a><br/>
<a href="static/html/hello.html">
    static/html/hello.html"
</a>
</body>
</html>

动态获取请求基地址

<%
    String basePath = request.getScheme() + "://" +
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
%>
// request.getScheme() 获取请求的协议
// request.getServerName() 获取服务器IP
// request.getServerPort() 获取端口号
// request.getContextPath() 获取web项目名

SSM 整合

整合开发思路

  • SSM:SpringMVC + Spring + MyBatis
  • SpringMVC:视图层,界面层,负责接收请求,显示处理结果
  • Spring:业务层,负责管理Service、Dao、工具类等对象
  • MyBatis:持久层,负责数据库的访问
  • 请求的处理过程:用户发起请求,由SpringMVC接收用户请求,调用Spring中的Service对象进行相应的业务处理,如果需要涉及数据库,则由Service调用MyBatis进行数据库数据访问,MyBatis将查询的数据交给Service进行业务处理,Service处理完成后将处理结果交给SpringMVC,最后由SpringMVC将结果返回给用户
  • SSM也叫SSI,因为IBatis是MyBatis的前身
  • 整合中有两个容器
  • SpringMVC:负责管理Controller控制器对象
  • Spring:负责管理Service、Dao、工具类等对象
  • 我们进行整合,就需要将使用的对象交给合适的容器进行管理,Controller控制器对象和web相关的对象交给SpringMVC,Service、Dao、工具类等对象交给Spring
  • Spring容器与SpringMVC容器之间,有已经确定好的关系,SpringMVC容器是Spring容器的子容器,子容器可以访问父容器,在子容器中的Controller可以访问父容器中的Service对象
  • 所以我们不需要构建两个容器之间的关系,我们只需要将使用的对象放到相应的容器中即可

数据库准备

create database ssm;
use ssm;
create table t_student(
    id int primary key auto_increment,
    name varchar(30),
    age int
);

创建项目

  • 使用Maven骨架创建web项目

引入依赖

  • 需要引入的依赖:SSM三个框架的依赖,MySQL驱动依赖,Druid连接池依赖,Jackson依赖,JSP依赖,Servlet依赖
<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
  <!-- servlet 依赖 -->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
  <!-- jsp依赖 -->
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2.1-b03</version>
    <scope>provided</scope>
  </dependency>
  <!-- SpringMVC依赖 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.5.RELEASE</version>
  </dependency>
  <!-- 事务相关的依赖 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.2.5.RELEASE</version>
  </dependency>
  <!-- Spring 内置的JDBC框架 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.5.RELEASE</version>
  </dependency>
  <!-- Jackson 依赖 -->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.0</version>
  </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
  </dependency>
  <!-- Spring 整合 MyBatis 依赖 -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.1</version>
  </dependency>
  <!-- MyBatis 依赖 -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.1</version>
  </dependency>
  <!-- 数据库连接驱动依赖 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
  </dependency>
  <!-- 德鲁伊连接池依赖 -->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.12</version>
  </dependency>
</dependencies>

引入插件

<build>
  <resources>
    <!--配置打包构建时识别资源文件所在的目录,将资源文件一起打包-->
    <resource>
      <directory>src/main/java</directory><!--所在的目录-->
      <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>false</filtering>
    </resource>
  </resources>
  <plugins>
    <!--编译插件-->
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.1</version>
      <configuration>
        <!--源码和打包后使用的JDK都为8-->
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
  </plugins>
</build>

创建 resources 和 java 目录

创建配置文件

  • 在resources目录下新建conf目录,用于存放配置文件

SpringMVC 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- springmvc 配置文件,用于声明 controller 和其他 web 相关的对象 -->
</beans>

Spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- spring 配置文件,创建Service、Dao等对象 -->
</beans>

数据库属性配置文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/dbtest
jdbc.username=root
jdbc.password=123123

MyBatis 配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- 指定别名 -->
  <typeAliases>
    <!-- 实体类的别名,指定包名,自动为包下的所有实体类取别名 -->
    <package name="cw.springmvc.study.pojo"/>
  </typeAliases>
  <mappers>
    <!-- 指定SqlMapper文件所在的包,SqlMapper文件的文件名和所在的包必须和接口一样 -->
    <package name="cw.springmvc.study.dao"/>
  </mappers>
</configuration>

配置文件 web.xml

配置注册 DispatchServlet

  • 创建SpringMVC容器对象,读取SpringMVC配置文件,创建Controller对象
  • 创建 DispatchServlet,接收用户请求
<!-- 注册中央调度器 -->
<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 配置 SpringMVC 配置文件 -->
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:conf/dispatcherServlet.xml</param-value>
  </init-param>
  <!-- tomcat 启动时就创建该对象 -->
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

配置注册 Spring 监听器 ContextLoaderListener

  • 创建Spring容器对象,读取Spring配置文件,创建Service、Dao等对象
<!-- 注册 spring 监听器 -->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <!--spring配置文件-->
  <param-value>classpath:conf/applicationContext.xml</param-value>
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
  • 监听容器的创建等事件,SpringMVC容器为Spring容器的子容器,SpringMVC容器Spring容器创建会触发监听器读取Spring配置文件,创建Service、Dao对象放置Spring容器中

配置注册字符集过滤器

  • 配置字符集过滤器,设置请求和响应数据的编码
  • 解决POST请求乱码问题
<!-- 注册字符集过滤器 -->
<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceRequestEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>forceResponseEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <!-- 所有请求都要经过该过滤器 -->
  <url-pattern>/*</url-pattern>
</filter-mapping>

创建包 package

  • controller
  • service
  • dao 或 mapper
  • pojo 或 bean 或 domain

编写 SpringMVC 配置文件

controller 组件扫描器

<!-- controller 组件扫描器 -->
<context:component-scan base-package="cw.springmvc.study.controller"/>

视图解析器

<!-- 内部资源视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <!-- 前缀 -->
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <!-- 后缀 -->
  <property name="suffix" value=".jsp"/>
</bean>

注解驱动

<!-- 注解驱动 -->
<!--
  1. 使处理方法的返回值响应给客户端,处理ajax请求
  2. 解决静态资源与@RequestMapping冲突问题
-->
<mvc:annotation-driven/>

编写 Spring 配置文件

  • 整合之后,Dao相关类的对象放在Spring容器中管理,所以MyBatis数据库等相关配置写在Spring配置文件中

声明数据源

<!-- 从类根路径下加载连接数据库配置属性 -->
<context:property-placeholder location="classpath:conf/jdbc.properties"/>
<!-- 数据源 druid -->
<!-- init-method 初始化方法;destroy-method 销毁方法 -->
<bean 
    id="dataSource" 
    class="com.alibaba.druid.pool.DruidDataSource"
    init-method="init"
    destroy-method="close"
>
  <property name="driverClassName" value="${jdbc.driver}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

配置 SqlSessionFactoryBean

  • 使用MyBatis操作数据库需要通过SqlSessionFactory对象来获取与数据库之间的会话对象
  • 配置SqlSessionFactoryBean,其实就是在进行MyBatis的相关配置
<!-- SqlSessionFactoryBean对象 -->
<!-- 在spring容器中注册SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <!-- 数据源 -->
  <property name="dataSource" ref="dataSource"/>
  <!-- MyBatis核心配置文件 -->
  <property name="configLocation" value="classpath:conf/mybatis-config.xml"/>
</bean>

MyBatis 组件扫描器

<!-- 声明MyBatis的扫描器 -->
<!-- 
  我们需要使用底层自动生成Mapper接口的代理类对象
  声明MyBatis的Mapper扫描器,会自动扫描Mapper接口创建代理类对象
  并放到Spring容器中
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <!-- SqlSessionFactoryBean对象的id,使用SqlSessionFactoryBean对象是哪个 -->
  <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  <!-- Mapper接口所在的包 -->
  <property name="basePackage" value="cw.springmvc.study.dao"/>
</bean>

service 组件扫描器

<!-- service 组件扫描器 -->
<context:component-scan base-package="cw.springmvc.study.service"/>

事务配置

<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <!-- 数据源 -->
  <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启事务的注解驱动 -->
<tx:annotation-driven transaction-manager="txManager"/>

配置 <mvc:resources/> 标签处理中央调度器路径为 /

  • 在 springmvc 配置文件中,配置 <mvc:resources/> 标签
<!-- 配置静态资源访问 -->
<mvc:resources mapping="/static/**" location="/static/"/>
  • 创建静态资源目录

程序代码

pojo

  • 实体类:Student
package cw.springmvc.study.pojo;
/**
 * ClassName: Student
 * Package: cw.springmvc.study.pojo
 * Description:
 *
 * @Author tcw
 * @Create 2023-05-28 15:54
 * @Version 1.0
 */
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    public Student() {
    }
    public Student(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
17
分享
相关文章
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
70 5
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
62 12
酷阿鲸森林农场:Java 区块链系统中的 P2P 区块同步与节点自动加入机制
本文介绍了基于 Java 的去中心化区块链电商系统设计与实现,重点探讨了 P2P 网络在酷阿鲸森林农场项目中的应用。通过节点自动发现、区块广播同步及链校验功能,系统实现了无需中心服务器的点对点网络架构。文章详细解析了核心代码逻辑,包括 P2P 服务端监听、客户端广播新区块及节点列表自动获取等环节,并提出了消息签名验证、WebSocket 替代 Socket 等优化方向。该系统不仅适用于农业电商,还可扩展至教育、物流等领域,构建可信数据链条。
【Java全栈学习笔记-U1-day01】Java介绍
本笔记整理了Java学习的基础内容,涵盖程序理解、Java语言特性、JDK安装与配置、Java程序开发工具及编写步骤。重点介绍了Java程序的基本结构、编译和运行过程,以及输出语句的使用。通过实例演示了IDEA创建Java程序的方法,并强调了编码规范和注意事项。适合初学者复习和交流学习。 主要内容: 1. 理解程序:计算机组成、程序定义。 2. 简介:Java语言特点、技术平台、JDK作用。 3. 编写Java程序:编写、编译、运行步骤,基本结构。 4. 输出语句 5. DEA使用:新建工程、保存位置、文件介绍、新建类。 6. 扩展:注释、代码规范、大小写敏感、缩进等。
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
158 0
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
|
5月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
294 60
【Java并发】【线程池】带你从0-1入门线程池

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问