IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Boot 第一章 快速入门 -> 正文阅读

[Java知识库]Spring Boot 第一章 快速入门

Spring Boot快速入门

Spring Boot 是一个快速开发框架,可以迅速搭建出一套基于 Spring 框架体系的应用,是 Spring Cloud 的基础。

Spring Boot 开启了各种自动装配,从而简化代码的开发,不需要编写各种配置文件,只需要引入相关依赖就可以迅速搭建一个应用。

特点

1、不需要 web.xml

2、不需要 springmvc.xml

3、不需要 tomcat,Spring Boot 内嵌了 tomcat

4、不需要配置 JSON 解析,支持 REST 架构

5、个性化配置非常简单

如何使用

1、创建 Maven 工程,导入相关依赖。

<!-- 继承父包 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.7.RELEASE</version>
</parent>

<dependencies>
  <!-- web启动jar -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.6</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

2、创建 Student 实体类

package com.southwind.entity;

import lombok.Data;

@Data
public class Student {
    private long id;
    private String name;
    private int age;
}

3、StudentRepository

package com.southwind.repository;

import com.southwind.entity.Student;

import java.util.Collection;

public interface StudentRepository {
    public Collection<Student> findAll();
    public Student findById(long id);
    public void saveOrUpdate(Student student);
    public void deleteById(long id);
}

4、StudentRepositoryImpl

package com.southwind.repository.impl;

import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@Repository
public class StudentRepositoryImpl implements StudentRepository {

    private static Map<Long,Student> studentMap;

    static{
        studentMap = new HashMap<>();
        studentMap.put(1L,new Student(1L,"张三",22));
        studentMap.put(2L,new Student(2L,"李四",23));
        studentMap.put(3L,new Student(3L,"王五",24));
    }

    @Override
    public Collection<Student> findAll() {
        return studentMap.values();
    }

    @Override
    public Student findById(long id) {
        return studentMap.get(id);
    }

    @Override
    public void saveOrUpdate(Student student) {
        studentMap.put(student.getId(),student);
    }

    @Override
    public void deleteById(long id) {
        studentMap.remove(id);
    }
}

5、StudentHandler

package com.southwind.controller;

import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Collection;

@RestController
@RequestMapping("/student")
public class StudentHandler {

    @Autowired
    private StudentRepository studentRepository;

    @GetMapping("/findAll")
    public Collection<Student> findAll(){
        return studentRepository.findAll();
    }

    @GetMapping("/findById/{id}")
    public Student findById(@PathVariable("id") long id){
        return studentRepository.findById(id);
    }

    @PostMapping("/save")
    public void save(@RequestBody Student student){
        studentRepository.saveOrUpdate(student);
    }

    @PutMapping("/update")
    public void update(@RequestBody Student student){
        studentRepository.saveOrUpdate(student);
    }

    @DeleteMapping("/deleteById/{id}")
    public void deleteById(@PathVariable("id") long id){
        studentRepository.deleteById(id);
    }
}

6、application.yml

server:
  port: 9090

7、启动类

package com.southwind;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

@SpringBootApplication 表示当前类是 Spring Boot 的入口,Application 类的存放位置必须是其他相关业务类的存放位置的父级。

静态资源处理

spring boot默认加载文件的路径是:(这里加载的目录是resources下的)

/META-INF/resources/
/resources/
/static/
/public/

访问外部资源编写配置文件添加
@Configuration
public class SimpleWebAppConfigurer extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/Audio/**")
                .addResourceLocations("file:E:/Java Project/bookwebsite/Audio/");
        super.addResourceHandlers(registry);
    }
}
内部静态资源在resources下的
@Configurationpublic class SimpleWebAppConfigurer extends WebMvcConfigurationSupport {    @Override    public void addResourceHandlers(ResourceHandlerRegistry registry) {        registry.addResourceHandler("/Audio/**")                .addResourceLocations("calsspath:/Audio");        super.addResourceHandlers(registry);    }}

Spring Boot 整合 JSP

  • pom.xml
<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.0.7.RELEASE</version></parent><dependencies>  <!-- web -->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <!-- 整合JSP -->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-tomcat</artifactId>  </dependency>  <dependency>    <groupId>org.apache.tomcat.embed</groupId>    <artifactId>tomcat-embed-jasper</artifactId>  </dependency>  <!-- JSTL -->  <dependency>    <groupId>jstl</groupId>    <artifactId>jstl</artifactId>    <version>1.2</version>  </dependency>  <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.6</version>    <scope>provided</scope>  </dependency></dependencies>
  • 创建配置文件 application.yml
server:  port: 8181spring:  mvc:    view:      prefix: /      suffix: .jsp
  • 创建 Handler
package com.southwind.controller;import com.southwind.entity.Student;import com.southwind.repository.StudentRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("/hello")public class HelloHandler {    @Autowired    private StudentRepository studentRepository;    @GetMapping("/index")    public ModelAndView index(){        ModelAndView modelAndView = new ModelAndView();        modelAndView.setViewName("index");        modelAndView.addObject("list",studentRepository.findAll());        return modelAndView;    }    @GetMapping("/deleteById/{id}")    public String deleteById(@PathVariable("id") long id){        studentRepository.deleteById(id);        return "redirect:/hello/index";    }    @PostMapping("/save")    public String save(Student student){        studentRepository.saveOrUpdate(student);        return "redirect:/hello/index";    }    @PostMapping("/update")    public String update(Student student){        studentRepository.saveOrUpdate(student);        return "redirect:/hello/index";    }    @GetMapping("/findById/{id}")    public ModelAndView findById(@PathVariable("id") long id){        ModelAndView modelAndView = new ModelAndView();        modelAndView.setViewName("update");        modelAndView.addObject("student",studentRepository.findById(id));        return modelAndView;    }}
  • JSP
<%--  Created by IntelliJ IDEA.  User: southwind  Date: 2019-03-21  Time: 12:02  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page isELIgnored="false" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head>    <title>Title</title></head><body>    <h1>学生信息</h1>    <table>        <tr>            <th>学生编号</th>            <th>学生姓名</th>            <th>学生年龄</th>            <th>操作</th>        </tr>        <c:forEach items="${list}" var="student">            <tr>                <td>${student.id}</td>                <td>${student.name}</td>                <td>${student.age}</td>                <td>                    <a href="/hello/findById/${student.id}">修改</a>                    <a href="/hello/deleteById/${student.id}">删除</a>                </td>            </tr>        </c:forEach>    </table>    <a href="/save.jsp">添加学生</a></body></html>
<%--  Created by IntelliJ IDEA.  User: southwind  Date: 2019-03-21  Time: 12:09  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title</title></head><body>    <form action="/hello/save" method="post">        ID:<input type="text" name="id"/><br/>        name:<input type="text" name="name"/><br/>        age:<input type="text" name="age"/><br/>        <input type="submit" value="提交"/>    </form></body></html>
<%--  Created by IntelliJ IDEA.  User: southwind  Date: 2019-03-21  Time: 12:09  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title</title></head><body>    <form action="/hello/update" method="post">        ID:<input type="text" name="id" value="${student.id}" readonly/><br/>        name:<input type="text" name="name" value="${student.name}"/><br/>        age:<input type="text" name="age" value="${student.age}"/><br/>        <input type="submit" value="提交"/>    </form></body></html>

Spring Boot HTML

Spring Boot 可以结合 Thymeleaf 模版来整合 HTML,使用原生的 HTML 作为视图。

Thymeleaf 模版是面向 Web 和独立环境的 Java 模版引擎,能够处理 HTML、XML、JavaScript、CSS 等。

<p th:text="${message}"></p>
  • pom.xml
<!-- 继承父包 --><parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.0.7.RELEASE</version></parent><dependencies>  <!-- web启动jar -->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.6</version>    <scope>provided</scope>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-thymeleaf</artifactId>  </dependency></dependencies>
  • appliction.yml
server:  port: 9090spring:  thymeleaf:    prefix: classpath:/templates/    suffix: .html    mode: HTML5    encoding: UTF-8
  • Handler
package com.southwind.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/index")public class IndexHandler {    @GetMapping("/index")    public String index(){        System.out.println("index...");        return "index";    }}
  • HTML
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <h1>Hello World</h1></body></html>

如果希望客户端可以直接访问 HTML 资源,将这些资源放置在 static 路径下即可,否则必须通过 Handler 的后台映射才可以访问静态资源。

Spring Boot 数据校验

package com.southwind.entity;import lombok.Data;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;@Datapublic class User {    @NotNull(message = "id不能为空")    private Long id;    @NotEmpty(message = "姓名不能为空")    @Length(min = 2,message = "姓名长度不能小于2位")    private String name;    @Min(value = 16,message = "年龄必须大于16岁")    private int age;}
@GetMapping("/validator")public void validatorUser(@Valid User user,BindingResult bindingResult){  System.out.println(user);  if(bindingResult.hasErrors()){    List<ObjectError> list = bindingResult.getAllErrors();    for(ObjectError objectError:list){      System.out.println(objectError.getCode()+"-"+objectError.getDefaultMessage());    }  }}

Spring Boot 整合 JDBC

  • pom.xml
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.11</version></dependency>
  • application.yml
server:  port: 9090spring:  thymeleaf:    prefix: classpath:/templates/    suffix: .html    mode: HTML5    encoding: UTF-8  datasource:    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8    username: root    password: root    driver-class-name: com.mysql.cj.jdbc.Driver
  • User
package com.southwind.entity;import lombok.Data;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;@Datapublic class User {    @NotNull(message = "id不能为空")    private Long id;    @NotEmpty(message = "姓名不能为空")    @Length(min = 2,message = "姓名长度不能小于2位")    private String name;    @Min(value = 60,message = "成绩必须大于60分")    private double score;}
  • UserRepository
package com.southwind.repository;import com.southwind.entity.User;import java.util.List;public interface UserRepository {    public List<User> findAll();    public User findById(long id);    public void save(User user);    public void update(User user);    public void deleteById(long id);}
  • UserRepositoryImpl
package com.southwind.repository.impl;import com.southwind.entity.User;import com.southwind.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import java.util.List;@Repositorypublic class UserRepositoryImpl implements UserRepository {    @Autowired    private JdbcTemplate jdbcTemplate;    @Override    public List<User> findAll() {        return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class));    }    @Override    public User findById(long id) {        return jdbcTemplate.queryForObject("select * from user where id = ?",new Object[]{id},new BeanPropertyRowMapper<>(User.class));    }    @Override    public void save(User user) {        jdbcTemplate.update("insert into user(name,score) values(?,?)",user.getName(),user.getScore());    }    @Override    public void update(User user) {        jdbcTemplate.update("update user set name = ?,score = ? where id = ?",user.getName(),user.getScore(),user.getId());    }    @Override    public void deleteById(long id) {        jdbcTemplate.update("delete from user where id = ?",id);    }}
  • Handler
package com.southwind.controller;import com.southwind.entity.User;import com.southwind.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;@RestController@RequestMapping("/user")public class UserHandler {    @Autowired    private UserRepository userRepository;    @GetMapping("/findAll")    public List<User> findAll(){        return userRepository.findAll();    }    @GetMapping("/findById/{id}")    public User findById(@PathVariable("id") long id){        return userRepository.findById(id);    }    @PostMapping("/save")    public void save(@RequestBody User user){        userRepository.save(user);    }    @PutMapping("/update")    public void update(@RequestBody User user){        userRepository.update(user);    }    @DeleteMapping("/deleteById/{id}")    public void deleteById(@PathVariable("id") long id){        userRepository.deleteById(id);    }}

Spring Boot 整合 MyBatis

  • pom.xml
<dependency>  <groupId>org.mybatis.spring.boot</groupId>  <artifactId>mybatis-spring-boot-starter</artifactId>  <version>1.3.1</version></dependency>
  • application.yml
server:  port: 9090spring:  thymeleaf:    prefix: classpath:/templates/    suffix: .html    mode: HTML5    encoding: UTF-8  datasource:    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8    username: root    password: root    driver-class-name: com.mysql.cj.jdbc.Drivermybatis:  mapper-locations: classpath:/mapping/*.xml  type-aliases-package: com.southwind.entity
  • UserRepository
package com.southwind.mapper;import com.southwind.entity.User;import java.util.List;public interface UserRepository {    public List<User> findAll(int index,int limit);    public User findById(long id);    public void save(User user);    public void update(User user);    public void deleteById(long id);    public int count();}
  • UserRepository.xml
<?xml version="1.0" encoding="UTF-8" ?>        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.southwind.mapper.UserRepository">    <select id="findAll" resultType="User">        select * from user limit #{param1},#{param2}    </select>    <select id="count" resultType="int">        select count(id) from user    </select>    <select id="findById" parameterType="long" resultType="User">        select * from user where id = #{id}    </select>    <insert id="save" parameterType="User">        insert into user(name,score) values(#{name},#{score})    </insert>    <update id="update" parameterType="User">        update user set name = #{name},score = #{score} where id = #{id}    </update>    <delete id="deleteById" parameterType="long">        delete from user where id = #{id}    </delete></mapper>
  • User
package com.southwind.entity;import lombok.Data;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;@Datapublic class User {    @NotNull(message = "id不能为空")    private Long id;    @NotEmpty(message = "姓名不能为空")    @Length(min = 2,message = "姓名长度不能小于2位")    private String name;    @Min(value = 60,message = "成绩必须大于60分")    private double score;}
  • Handler
package com.southwind.controller;import com.southwind.entity.User;import com.southwind.mapper.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("/mapper")public class UserMapperHandler {    @Autowired    private UserRepository userRepository;    private int limit = 10;    @GetMapping("/findAll/{page}")    public ModelAndView findAll(@PathVariable("page") int page){        ModelAndView modelAndView = new ModelAndView();        int index = (page-1)*limit;        modelAndView.setViewName("show");        modelAndView.addObject("list",userRepository.findAll(index,limit));        modelAndView.addObject("page",page);        //计算总页数        int count = userRepository.count();        int pages = 0;        if(count%limit == 0){            pages = count/limit;        }else{            pages = count/limit+1;        }        modelAndView.addObject("pages",pages);        return modelAndView;    }    @GetMapping("/deleteById/{id}")    public String deleteById(@PathVariable("id") long id){        userRepository.deleteById(id);        return "redirect:/mapper/findAll/1";    }    @GetMapping("/findById")    public ModelAndView findById(@RequestParam("id") long id){        ModelAndView modelAndView = new ModelAndView();        modelAndView.addObject("user",userRepository.findById(id));        modelAndView.setViewName("update");        return modelAndView;    }    @PostMapping("/update")    public String update(User user){        userRepository.update(user);        return "redirect:/mapper/findAll/1";    }    @PostMapping("/save")    public String save(User user){        userRepository.save(user);        return "redirect:/mapper/findAll/1";    }    @GetMapping("/redirect/{name}")    public String redirect(@PathVariable("name") String name){        return name;    }}
  • HTML
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <form action="/mapper/save" method="post">        用户姓名:<input type="text" name="name" /><br/>        用户成绩:<input type="text" name="score" /><br/>        <input type="submit" value="提交"/>    </form></body></html>
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <form action="/mapper/update" method="post">        用户ID:<input type="text" name="id" th:value="${user.id}" readonly/><br/>        用户姓名:<input type="text" name="name" th:value="${user.name}" /><br/>        用户成绩:<input type="text" name="score" th:value="${user.score}" /><br/>        <input type="submit" value="提交"/>    </form></body></html>
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <script type="text/javascript" th:src="@{/jquery-3.3.1.min.js}"></script>    <script type="text/javascript">        $(function(){            $("#first").click(function(){                var page = $("#page").text();                page = parseInt(page);                if(page == 1){                    return false;                }                window.location.href="/mapper/findAll/1";            });            $("#previous").click(function(){                var page = $("#page").text();                page = parseInt(page);                if(page == 1){                    return false;                }                page = page-1;                window.location.href="/mapper/findAll/"+page;            });            $("#next").click(function(){                var page = $("#page").text();                var pages = $("#pages").text();                if(page == pages){                    return false;                }                page = parseInt(page);                page = page+1;                window.location.href="/mapper/findAll/"+page;            });            $("#last").click(function(){                var page = $("#page").text();                var pages = $("#pages").text();                if(page == pages){                    return false;                }                window.location.href="/mapper/findAll/"+pages;            });        });    </script></head><body>    <h1>用户信息</h1>    <table>        <tr>            <th>用户ID</th>            <th>用户名</th>            <th>成绩</th>            <th>操作</th>        </tr>        <tr th:each="user:${list}">            <td th:text="${user.id}"></td>            <td th:text="${user.name}"></td>            <td th:text="${user.score}"></td>            <td>                <a th:href="@{/mapper/deleteById/{id}(id=${user.id})}">删除</a>                <a th:href="@{/mapper/findById(id=${user.id})}">修改</a>            </td>        </tr>    </table>    <a id="first" href="javascript:void(0)">首页</a>    <a id="previous" href="javascript:void(0)">上一页</a>    <span id="page" th:text="${page}"></span>/<span id="pages" th:text="${pages}"></span>    <a id="next" href="javascript:void(0)">下一页</a>    <a id="last" href="javascript:void(0)">尾页</a><br/>    <a href="/mapper/redirect/save">添加用户</a></body></html>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:35:18  更:2022-02-07 13:36:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:31:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码