Java进阶:SpringBoot,2024年最新java全套视频教程

import java.util.Date;

public class User {

// id

private Long id;

// 用户名

private String userName;

// 密码

private String password;

// 姓名

private String name;

// 年龄

private Integer age;

// 性别,1男性,2女性

private Integer sex;

// 出生日期

private Date birthday;

// 创建时间

private Date created;

// 更新时间

private Date updated;

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

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;

}

public Integer getSex() {

return sex;

}

public void setSex(Integer sex) {

this.sex = sex;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public Date getCreated() {

return created;

}

public void setCreated(Date created) {

this.created = created;

}

public Date getUpdated() {

return updated;

}

public void setUpdated(Date updated) {

this.updated = updated;

}

public String getNote() {

return note;

}

public void setNote(String note) {

this.note = note;

}

// 备注

private String note;

}

5.1 Lombok


我们编写pojo时,经常需要编写构造函数和getter、setter方法,属性多的时候,就非常浪费时间,使用lombok插件可以解决这个问题:

  1. 在IDEA中安装lombok插件

在IDEA中安装lombok插件,不安装插件在IDEA中使用lombok的注解虽然编译能通过,但是源码会报错。所以为了让IDEA更好的辨别lombok注解则才安装插件。

在这里插入图片描述

  1. 添加lombok对应的依赖到项目pom.xml

需要在maven工程中的pom.xml文件引入依赖:

org.projectlombok

lombok

在这里插入图片描述

  1. 改造实体类使用lombok注解

然后可以在Bean上使用:

① @Data :自动提供getter和setter、hashCode、equals、toString等方法e

② @Getter:自动提供getter方法

③ @Setter:自动提供setter方法

④ @Slf4j:自动在bean中提供log变量,其实用的是slf4j的日志功能。

例如;在javabean上加@Data,那么就可以省去getter和setter等方法的编写,lombok插件会自动生成。

在这里插入图片描述

5.2 整合SpringMVC


虽然默认配置已经可以使用SpringMVC了,不过我们有时候需要进行自定义配置。

可以在application.yml文件中配置日志级别控制:

logging:

level:

com.itheima: debug

org.springframework: info

在这里插入图片描述

5.2.1 修改端口

查看SpringBoot的全局属性可知,端口通过以下方式配置:

修改 application.yml配置文件,添加如下配置:

映射端口

server:

port: 80

在这里插入图片描述

重启服务后测试:

在这里插入图片描述

5.2.2 访问静态资源

现在,我们的项目是一个jar工程,那么就没有webapp,我们的静态资源该放哪里呢?

回顾我们在上面看的源码,有一个叫做ResourceProperties的类,里面就定义了静态资源的默认查找路径:

在这里插入图片描述

默认的静态资源路径为:

  • classpath:/META-INF/resources/

  • classpath:/resources/

  • classpath:/static/

  • classpath:/public

只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理。

我们习惯会把静态资源放在classpath:/static/目录下。我们创建目录 static ,并且从 资料文件夹中复制itcast.giftest.js如下:在这里插入图片描述重启项目后测试:在这里插入图片描述

注意:如果访问图片时候没有显示;可以先将项目先clean再启动,或者创建 public、resources 文件夹,然后图片放置到public或resources中。

5.2.3 添加拦截器

拦截器也是我们经常需要使用的,在SpringBoot中该如何配置呢?

拦截器不是一个普通属性,而是一个类,所以就要用到java配置方式了。在SpringBoot官方文档中有这么一段说明:

If you want to keep Spring Boot MVC features and you want to add additional MVC configuration(interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc . If you wish to provide custom instances of RequestMappingHandlerMapping , RequestMappingHandlerAdapter , or ExceptionHandlerExceptionResolver , you can declare a WebMvcRegistrationsAdapter instance to provide such components.

If you want to take complete control of Spring MVC, you can add your own @Configuration annotated

with @EnableWebMvc.

总结:通过实现WebMvcConfigurer 并添加@Configuration 注解来实现自定义部分SpringMvc配置。

  1. 创建 heima-springboot\src\main\java\com\itheima\interceptor\MyInterceptor.java 拦截器,内容如下:

package com.itheima.interceptor;

import lombok.extern.slf4j.Slf4j;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@Slf4j

public class MyInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

Object handler) throws Exception {

log.debug(“这是MyInterceptor拦截器的preHandle方法”);

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response,

Object handler, ModelAndView modelAndView) throws Exception {

log.debug(“这是MyInterceptor拦截器的postHandle方法”);

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse

response, Object handler, Exception ex) throws Exception {

log.debug(“这是MyInterceptor拦截器的afterCompletion方法”);

}

}

在这里插入图片描述

  1. 定义配置类 heima-springboot\src\main\java\com\itheima\config\MvcConfig.java ,用于注册拦截

器,内容如下:

package com.itheima.config;

import com.itheima.interceptor.MyInterceptor;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration

public class MvcConfig implements WebMvcConfigurer {

/**

  • 将拦截器注册到spring ioc容器

  • @return myInterceptor

*/

@Bean

public MyInterceptor myInterceptor(){

return new MyInterceptor();

}

/**

  • 重写该方法;往拦截器链添加自定义拦截器

  • @param registry 拦截器链

*/

@Override

public void addInterceptors(InterceptorRegistry registry) {

//通过registry添加myInterceptor拦截器,并设置拦截器路径为 /*

registry.addInterceptor(myInterceptor()).addPathPatterns(“/*”);

}

}

在这里插入图片描述

  1. 结构如下:在这里插入图片描述

  2. 接下来访问http://localhost/hello 并查看日志:

在这里插入图片描述

5.3 整合jdbc和事务


spring中的jdbc连接和事务是配置中的重要一环,在SpringBoot中该如何处理呢?

答案是不需要处理,我们只要找到SpringBoot提供的启动器即可,在pom.xml文件中添加如下依赖:

org.springframework.boot

spring-boot-starter-jdbc

当然,不要忘了数据库驱动,SpringBoot并不知道我们用的什么数据库,这里我们选择MySQL;同样的在pom.xml文件中添加如下依赖:

mysql

mysql-connector-java

8.0.22

在这里插入图片描述

至于事务,SpringBoot中通过注解来控制。就是我们熟知的@Transactional使用的时候设置在对应的类或方法上即可。

创建heima-springboot\src\main\java\com\itheima\service\UserService.java业务类如下:

package com.itheima.service;

import com.itheima.pojo.User;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

@Service

public class UserService {

// 根据id查询

public User queryById(Long id) {

//根据id查询

return new User();

}

// 保存用户

@Transactional

public void saveUser(User user) {

System.out.println(“新增用户…”);

}

}

在这里插入图片描述

5.4 整合连接池


其实,在刚才引入jdbc启动器的时候,SpringBoot已经自动帮我们引入了一个连接池:在这里插入图片描述HikariCP应该是目前速度最快的连接池了,我们看看它与c3p0的对比:在这里插入图片描述

因此,我们只需要指定连接池参数即可;打开application.yml 添加修改配置如下:

spring:

datasource:

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql://localhost:3306/springboot_test

username: root

password: root

【注意】

把 JdbcConfig 类中的druid的配置删除或注释;

在这里插入图片描述在配置完hikari数据库连接池后的application.yml 文件如下:在这里插入图片描述

启动项目,访问 http://localhost/hello ;查看后台输出,一样可以在HelloController中获取到datasource。

在这里插入图片描述

5.5 整合MyBatis


5.5.1 MyBatis

  1. SpringBoot官方并没有提供Mybatis的启动器,不过Mybatis官网自己实现了。在项目的pom.xml 文件中加入如下依赖:

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.0.1

在这里插入图片描述

  1. 配置application.yml,常用配置如下:

mybatis配置

mybatis:

实体类别名包路径

type-aliases-package: com.itheima.pojo

映射文件路径

mapper-locations: classpath:mappers/*.xml

configuration:

控制台输出执行sql

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

  1. 配置Mapper扫描

需要注意,这里没有配置mapper接口扫描包,因此我们需要给每一个Mapper接口添加@Mapper 注解,才能被识别。

@Mapper

public interface UserMapper {

}

或者,我们也可以不加注解,而是在启动类上添加扫描包注解(推荐):

package com.itheima;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

/**

  • spring boot 工程都有一个启动引导类,这是工程的入口类

  • 并在引导类上添加@SpringBootApplication

*/

@SpringBootApplication

@MapperScan(“com.itheima.mapper”)

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

在这里插入图片描述

以下代码示例中,我们将采用@MapperScan扫描方式进行。

5.5.2 通用mapper

通用mapper:可以实现自动拼接sql语句;所有的mapper都不需要编写任何方法也就是不用编写sql语句。

  1. 通用Mapper的作者也为自己的插件编写了启动器,我们直接引入即可。在项目的pom.xml 文件中加入如下依赖:

tk.mybatis

mapper-spring-boot-starter

2.1.5

在这里插入图片描述

注意:一旦引入了通用Mapper的启动器,会覆盖Mybatis官方启动器的功能,因此需要移除对官方Mybatis启动器的依赖

  1. 编写UserMapper

无需任何配置就可以使用了。如果有特殊需要,可以到通用mapper官网查看

编写heima-springboot\src\main\java\com\itheima\mapper\UserMapper.java 如下:

package com.itheima.mapper;

import com.itheima.pojo.User;

import tk.mybatis.mapper.common.Mapper;

public interface UserMapper extends Mapper {

}

在这里插入图片描述

  1. 把启动类上的@MapperScan注解修改为通用mapper中自带的:引用tk开头的在这里插入图片描述在这里插入图片描述

  2. 在User实体类上加JPA注解

修改heima-springboot\src\main\java\com\itheima\pojo\User.jav 如下:

如果数据库字段名称和实体名称差别很大,需要用Column注解指定字段对应。

package com.itheima.pojo;

import lombok.Data;

import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Column;

import javax.persistence.Id;

import javax.persistence.Table;

import java.util.Date;

@Data

@Table(name = “tb_user”)

public class User {

@Id

// 主键回填

@KeySql(useGeneratedKeys = true)

private Long id;

// 如果数据库字段名称和实体名称差别很大,需要用Column注解指定

// @Column(name = “abc”)

private String userName;

private String password;

private String name;

private Integer age;

private Integer sex;

private Date birthday;

private Date created;

private Date updated;

private String note;

}

在这里插入图片描述

  1. UserService的代码进行简单改造

package com.itheima.service;

import com.itheima.mapper.UserMapper;

import com.itheima.pojo.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

@Service

public class UserService {

@Autowired

private UserMapper userMapper;

// 根据id查询

public User queryById(Long id) {

//根据id查询

//return new User();

return userMapper.selectByPrimaryKey(id);

}

// 保存用户

@Transactional

public void saveUser(User user) {

System.out.println("新增用户… ");

//选择性新增;如果属性为空则该属性不会出现在insert语句上

userMapper.insertSelective(user);

}

}

在这里插入图片描述

5.6 启动测试


HelloController进行简单改造:

package com.itheima.controller;

import com.itheima.pojo.User;

import com.itheima.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

@RestController

public class HelloController {

@Autowired

private DataSource dataSource;

@Value(“${itcast.url}”)

private String itcastUrl;

@Value(“${itheima.url}”)

private String itheimaUrl;

@Autowired

private UserService userService;

/**

  • 根据用户id查询用户

  • @param id 用户id

  • @return 用户

*/

@GetMapping(“/user/{id}”)

public User queryById(@PathVariable Long id){

return userService.queryById(id);

}

@GetMapping(“hello”)

public String hello(){

System.out.println(" itcastUrl = " + itcastUrl);

System.out.println(" itheimaUrl = " + itheimaUrl);

System.out.println(" DataSource = " + dataSource);

return “Hello, Spring Boot!”;

}

}

在这里插入图片描述

我们启动项目,查看:在这里插入图片描述

5.7 Junit测试


Ctrl+shift+t快速给一个类添加测试类

  1. 在springboot项目中如果要使用Junit进行单元测试,则需要添加如下的依赖:

org.springframework.boot

spring-boot-starter-test

在这里插入图片描述

  1. 在测试包下编写测试类

在测试类上面必须要添加 @SpringBootTest注解。

编写测试类heima-springboot\src\test\java\com\itheima\service\UserServiceTest.java

package com.itheima.service;

import com.itheima.pojo.User;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)

@SpringBootTest

public class UserServiceTest {

@Autowired

private UserService userService;

@Test

public void queryById() {

User user = userService.queryById(8L);

System.out.println(user);

}

@Test

public void saveUser() {

User user = new User();

user.setId(13L);

user.setAge(18);

user.setUsername(“kai”);

user.setPassword(“123”);

user.setBirthday(new Date());

userService.saveUser(user);

}

}

测试代码结构如:在这里插入图片描述

在Spring Boot项目中,如果要编写测试类,则必须要在类上面添加@SpringBootTest

5.8 整合Redis


redis五种数据类型:string、list、set、hash、sort set

  1. pom.xml文件中添加如下依赖;

org.springframework.boot

spring-boot-starter-data-redis

在这里插入图片描述

  1. 配置application.yml文件;

spring:

redis:

host: localhost

port: 6379

在这里插入图片描述

  1. 编写src\test\java\com\itheima\redis\RedisTest.java 测试代码;

package com.itheima.redis;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

import java.util.Set;

@RunWith(SpringRunner.class)

@SpringBootTest

public class RedisTest {

@Autowired

private RedisTemplate redisTemplate;

@Test

public void test(){

//string字符串

//redisTemplate.opsForValue().set(“str”, “heima”);

redisTemplate.boundValueOps(“str”).set(“heima”);

System.out.println("str = " + redisTemplate.opsForValue().get(“str”));

//hash散列

redisTemplate.boundHashOps(“h_key”).put(“name”, “黑马”);

redisTemplate.boundHashOps(“h_key”).put(“age”, 13);

//获取所有域对应的值

Set set = redisTemplate.boundHashOps(“h_key”).keys();

System.out.println(“hash散列所有的域:” + set);

List list = redisTemplate.boundHashOps(“h_key”).values();

System.out.println(“hash散列所有的域值:” + list);

//list列表

redisTemplate.boundListOps(“l_key”).leftPush(“c”);

redisTemplate.boundListOps(“l_key”).leftPush(“b”);

redisTemplate.boundListOps(“l_key”).leftPush(“a”);

list = redisTemplate.boundListOps(“l_key”).range(0, -1);

System.out.println(“列表的值:” + list);

//set集合

redisTemplate.boundSetOps(“set_key”).add(“a”, “b”, “c”);

set = redisTemplate.boundSetOps(“set_key”).members();

System.out.println(“集合的元素:” + set);

//sorted set有序集合

redisTemplate.boundZSetOps(“z_key”).add(“a”, 30);

redisTemplate.boundZSetOps(“z_key”).add(“b”, 20);

redisTemplate.boundZSetOps(“z_key”).add(“c”, 10);

set = redisTemplate.boundZSetOps(“z_key”).range(0, -1);

System.out.println(“有序集合的元素:” + set);

}

}

  1. 运行上述代码测试

在这里插入图片描述

6. Spring Boot项目部署

==============================================================================

6.1 项目打包


  1. 添加项目的pom.xml插件;在pom.xml要显式的加入插件spring-boot-maven-plugin,否则无法产生 jar 清单

文件,导致打出来的 jar 无法使用命令运行;

org.springframework.boot

spring-boot-maven-plugin

在这里插入图片描述

  1. 使用maven的命令package打包;在这里插入图片描述

在这里插入图片描述

之后在项目下的target目录中将有如下jar包:在这里插入图片描述

【注意】在查看打出的 jar 的时候,将发现 jar 包里面包含 jar 包;这样的包称为 fatJar(肥包)

6.2 运行


运行打出来的包;使用命令:java –jar 包全名 或者写一个 bat 文件,里面包含 java –jar 包全名;这样就可以双击启动应用。

如执行上述打出来的jar的命令为:

java -jar heima-springboot-1 1.0-SNAPSHOT.jar

在这里插入图片描述

测试则可使用浏览器访问:http://localhost/user/8

7. 附录—插件安装

======================================================================

在应用spring boot工程的时候;一般情况下都需要创建启动引导类Application.java和application.yml配置文件,而且内容都是一样的;为了便捷可以安装一个IDEA的插件 JBLSpringBootAppGen 在项目上右击之后可以自动生成启动引导类Application.java和application.yml配置文件。

7.1 安装插件


在这里插入图片描述

7.2 应用插件


在IDEA中任意一个maven项目或src目录上 右击,选择JBLSpringBootAppGen 即可。

在这里插入图片描述

在如下的界面中输入 启动引导类的名称并根据需要勾选是否要生成application.yml配置文件。

在这里插入图片描述

点击 OK 之后,在项目中将发现如下内容:

在这里插入图片描述

8. Spring Boot小结

============================================================================

1. Spring Boot概述


  1. Spring Boot是一个搭建基于spring工程的脚手架

  2. 简化配置、依赖管理

  3. 特点:快速搭建、内嵌应用服务器、自动配置、无代码生成、也没有xml配置

2. 快速入门


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

image

上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

image

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

dGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0thaVNhckg=,size_16,color_FFFFFF,t_70)

点击 OK 之后,在项目中将发现如下内容:

在这里插入图片描述

8. Spring Boot小结

============================================================================

1. Spring Boot概述


  1. Spring Boot是一个搭建基于spring工程的脚手架

  2. 简化配置、依赖管理

  3. 特点:快速搭建、内嵌应用服务器、自动配置、无代码生成、也没有xml配置

2. 快速入门


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-MqHhkU5f-1712736846995)]
[外链图片转存中…(img-ogxZ0L6k-1712736846995)]
[外链图片转存中…(img-OGXvso3l-1712736846996)]
[外链图片转存中…(img-PeQdlvPb-1712736846998)]
[外链图片转存中…(img-JtkbaZem-1712736846998)]
[外链图片转存中…(img-Wx7H7cQ6-1712736846998)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-q4phTbZf-1712736846999)]

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

[外链图片转存中…(img-NJLxUIu3-1712736846999)]

上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

[外链图片转存中…(img-ESEGSjkT-1712736846999)]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-EDby0v7z-1712736846999)]

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值