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 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 使用IDEA快速开发之EasyCode插件 -> 正文阅读

[开发工具]使用IDEA快速开发之EasyCode插件

一、插件安装

1.这个不多说,idea安装插件应该都会,如有疑问可自行查阅相关文档
在这里插入图片描述

二、模板配置

easyCode有自带的模板生成文件,生成的分页语句是mysql的语法
在这里插入图片描述

这里我们新建一个模板来适应我们的项目
在这里插入图片描述
新创建一个group name 命名为myTemplate
在myTemplate下面新建模板文件

1.mapper.xml.vm

##引入mybatis支持
$!{mybatisSupport.vm}

##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

<?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="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper">
    <resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map">
#foreach($column in $tableInfo.fullColumn)
        <result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
    </resultMap>
    <!--查询单个-->
    <select id="selectByPrimaryKey" resultMap="$!{tableInfo.name}Map">
        select
          #allSqlColumn()

        from $!tableInfo.obj.name
        where $!pk.obj.name = #{$!pk.name}
    </select>
    <!--查询指定行数据-->
    <select id="queryAll" resultMap="$!{tableInfo.name}Map">
        select
          #allSqlColumn()

        from $!tableInfo.obj.name
        <where>
#foreach($column in $tableInfo.fullColumn)
            <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
                and $!column.obj.name = #{$!column.name}
            </if>
#end
        </where>
    </select>
    <!--统计总行数-->
    <select id="count" resultType="java.lang.Long">
        select count(1)
        from $!tableInfo.obj.name
        <where>
#foreach($column in $tableInfo.fullColumn)
            <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
                and $!column.obj.name = #{$!column.name}
            </if>
#end
        </where>
    </select>
    <!--新增所有列-->
    <insert id="insertSelective" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end)
        values (#foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($velocityHasNext), #end#end)
    </insert>
    <insert id="insertBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert all
        <foreach collection="list" item="item" separator=",">
        into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end)
        values
        (#foreach($column in $tableInfo.otherColumn)#{item.$!{column.name}}#if($velocityHasNext), #end#end)
        </foreach>
        select 1 from dual
    </insert>
    <!--通过主键修改数据-->
    <update id="updateByPrimaryKeySelective">
        update $!{tableInfo.obj.name}
        <set>
#foreach($column in $tableInfo.otherColumn)
            <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
                $!column.obj.name = #{$!column.name},
            </if>
#end
        </set>
        where $!pk.obj.name = #{$!pk.name}
    </update>
    <!--通过主键删除-->
    <delete id="deleteByPrimaryKey">
        delete from $!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name}
    </delete>

</mapper>

2.entity.java.vm

##引入宏定义
$!{define.vm}

##使用宏定义设置回调(保存位置与文件后缀)
#save("/entity", ".java")

##使用宏定义设置包后缀
#setPackageSuffix("entity")

##使用全局变量实现默认包导入
$!{autoImport.vm}
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

##使用宏定义实现类注释信息
#tableComment("实体类")
@ApiModel(value = "$!{tableInfo.name}", description = "$!{tableInfo.comment}")
public class $!{tableInfo.name} implements Serializable {
    
    private static final long serialVersionUID = $!tool.serial();

#foreach($column in $tableInfo.fullColumn)

    #if(${column.comment})/**
     * ${column.comment}
     */#end
     
    @ApiModelProperty(value = "${column.comment}")
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end

}

3.service.java.vm

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Service"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;

import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import com.github.pagehelper.PageInfo;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表服务接口
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{tableName} {

    /**
     * 通过ID查询单条数据
     *
     * @param $!pk.name 主键
     * @return 实例对象
     */
    $!{tableInfo.name} selectByPrimaryKey($!pk.shortType $!pk.name);

    /**
     * 分页查询
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 筛选条件
     * @return 查询结果
     */
    PageInfo<$!{tableInfo.name}> queryByPage(int pageNum, int pageSize, $!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));

    /**
     * 新增数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 实例对象
     */
    $!{tableInfo.name} insertSelective($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));

    /**
     * 修改数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 实例对象
     */
    $!{tableInfo.name} updateByPrimaryKeySelective($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));

    /**
     * 通过主键删除数据
     *
     * @param $!pk.name 主键
     * @return 删除的数据量
     */
    int deleteByPrimaryKey($!pk.shortType $!pk.name);

}

4.serviceImpl.java.vm

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;

import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import javax.annotation.Resource;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
 *
 * @author $!author
 * @since $!time.currTime()
 */
@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")
public class $!{tableName} implements $!{tableInfo.name}Service {
    
    @Resource
    private $!{tableInfo.name}Mapper mapper;

    /**
     * 通过ID查询单条数据
     *
     * @param $!pk.name 主键
     * @return 实例对象
     */
    @Override
    public $!{tableInfo.name} selectByPrimaryKey($!pk.shortType $!pk.name) {
        return this.mapper.selectByPrimaryKey($!pk.name);
    }

    /**
     * 分页查询
     *
     * @param $!{tool.firstLowerCase($tableInfo.name)} 筛选条件
     * @return 查询结果
     */
    @Override
    public PageInfo<$!{tableInfo.name}> queryByPage(int pageNum, int pageSize, $!{tableInfo.name} $!{tool.firstLowerCase($tableInfo.name)}) {
        PageHelper.startPage(pageNum,pageSize);
        return new PageInfo<>(this.mapper.queryAll($!{tool.firstLowerCase($tableInfo.name)}));
    }

    /**
     * 新增数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 实例对象
     */
    @Override
    public $!{tableInfo.name} insertSelective($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
        this.mapper.insertSelective($!tool.firstLowerCase($!{tableInfo.name}));
        return $!tool.firstLowerCase($!{tableInfo.name});
    }

    /**
     * 修改数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 实例对象
     */
    @Override
    public $!{tableInfo.name} updateByPrimaryKeySelective($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
        this.mapper.updateByPrimaryKeySelective($!tool.firstLowerCase($!{tableInfo.name}));
        return this.selectByPrimaryKey($!{tool.firstLowerCase($!{tableInfo.name})}.get$!tool.firstUpperCase($pk.name)());
    }

    /**
     * 通过主键删除数据
     *
     * @param $!pk.name 主键
     * @return 是否成功
     */
    @Override
    public int deleteByPrimaryKey($!pk.shortType $!pk.name) {
        return this.mapper.deleteByPrimaryKey($!pk.name);
    }
}

5.mapper.java.vm

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Mapper"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper;

import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{tableName} {

    /**
     * 通过ID查询单条数据
     *
     * @param $!pk.name 主键
     * @return 实例对象
     */
    $!{tableInfo.name} selectByPrimaryKey($!pk.shortType $!pk.name);

    /**
     * 查询指定行数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 查询条件
     * @return 对象列表
     */
    List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));

    /**
     * 统计总行数
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 查询条件
     * @return 总行数
     */
    long count($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));

    /**
     * 新增数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 影响行数
     */
    int insertSelective($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));

    /**
     * 批量新增数据(MyBatis原生foreach方法)
     *
     * @param list List<$!{tableInfo.name}> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("list") List<$!{tableInfo.name}> list);

    /**
     * 修改数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 影响行数
     */
    int updateByPrimaryKeySelective($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));

    /**
     * 通过主键删除数据
     *
     * @param $!pk.name 主键
     * @return 影响行数
     */
    int deleteByPrimaryKey($!pk.shortType $!pk.name);

}

6.controller.java.vm

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;

import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import javax.annotation.Resource;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import com.github.pagehelper.PageInfo;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表控制层
 *
 * @author $!author
 * @since $!time.currTime()
 */
@RestController
@RequestMapping("/$!tool.firstLowerCase($tableInfo.name)")
@Api(value = "$!{tableInfo.comment}($!{tableInfo.name}")
public class $!{tableName} {

    /**
     * 服务对象
     */
    @Resource(name = "$!tool.firstLowerCase($!{tableInfo.name})Service")
    private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;

    /**
     * 分页查询$!{tableInfo.comment}数据
     *
     * @return 实例对象集合
     */
    @ApiOperation(value = "分页查询$!{tableInfo.comment}数据")
    @GetMapping("/page/{pageNum}/{pageSize}")
    public ResponseEntity<List> queryByPage(@ApiParam(name = "pageNum", value = "当前页") @PathVariable(name="pageNum") int pageNum, @ApiParam(name = "pageSize", value = "每页条数") @PathVariable(name="pageSize") int pageSize, @ApiParam(name = "$!{tool.firstLowerCase($tableInfo.name)}", value = "$!{tableInfo.comment}对象") $!{tableInfo.name} $!{tool.firstLowerCase($tableInfo.name)}) {
        PageInfo<$!{tableInfo.name}> pageInfo = this.$!{tool.firstLowerCase($tableInfo.name)}Service.queryByPage(pageNum,pageSize,$!{tool.firstLowerCase($tableInfo.name)});
        return ResponseEntity.ok(pageInfo.getList());
    }
    
    /**
     * 通过主键查询单条$!{tableInfo.comment}数据
     *
     * @param $!{tool.firstLowerCase($!pk.name)} 主键
     * @return 单条数据
     */
    @ApiOperation(value = "通过$!{tool.firstLowerCase($!pk.name)}主键查询单条$!{tableInfo.comment}数据")
    @GetMapping("/{$!{tool.firstLowerCase($!pk.name)}}")
    public ResponseEntity<$!{tableInfo.name}> selectByPrimaryKey(@ApiParam(name = "$!{tool.firstLowerCase($!pk.name)}", value = "$!pk.name主键") @PathVariable(name="$!pk.name") $!pk.shortType $!{tool.firstLowerCase($!pk.name)}) {
        return ResponseEntity.ok(this.$!{tool.firstLowerCase($tableInfo.name)}Service.selectByPrimaryKey($!pk.name));
    }

    /**
     * 新增单条$!{tableInfo.comment}数据
     *
     * @param $!{tool.firstLowerCase($tableInfo.name)} 实体
     * @return 新增结果
     */
    @ApiOperation(value = "新增单条$!{tableInfo.comment}数据")
    @PostMapping
    public ResponseEntity<$!{tableInfo.name}> insertSelective(@ApiParam(name = "$!{tool.firstLowerCase($tableInfo.name)}", value = "$!{tableInfo.comment}对象") @RequestBody $!{tableInfo.name} $!{tool.firstLowerCase($tableInfo.name)}) {
        return ResponseEntity.ok(this.$!{tool.firstLowerCase($tableInfo.name)}Service.insertSelective($!{tool.firstLowerCase($tableInfo.name)}));
    }

    /**
     * 通过主键$!{tool.firstLowerCase($!pk.name)}修改单条$!{tableInfo.comment}数据
     *
     * @param $!{tool.firstLowerCase($tableInfo.name)} 实体
     * @return 修改结果
     */
    @ApiOperation(value = "通过主键$!{tool.firstLowerCase($!pk.name)}修改单条$!{tableInfo.comment}数据")
    @PutMapping
    public ResponseEntity<$!{tableInfo.name}> updateByPrimaryKeySelective(@ApiParam(name = "$!{tool.firstLowerCase($tableInfo.name)}", value = "$!{tableInfo.comment}") @RequestBody $!{tableInfo.name} $!{tool.firstLowerCase($tableInfo.name)}) {
        return ResponseEntity.ok(this.$!{tool.firstLowerCase($tableInfo.name)}Service.updateByPrimaryKeySelective($!{tool.firstLowerCase($tableInfo.name)}));
    }

    /**
     * 通过$!{tool.firstLowerCase($!pk.name)}主键删除单条$!{tableInfo.comment}数据
     *
     * @param $!{tool.firstLowerCase($!pk.name)} 主键
     * @return 删除结果数
     */
    @ApiOperation(value = "通过$!{tool.firstLowerCase($!pk.name)}主键删除单条$!{tableInfo.comment}数据")
    @DeleteMapping("/{$!{tool.firstLowerCase($!pk.name)}}")
    public ResponseEntity<Integer> deleteByPrimaryKey(@ApiParam(name = "$!{tool.firstLowerCase($!pk.name)}", value = "$!{tool.firstLowerCase($!pk.name)}主键") @PathVariable(name="$!pk.name") $!pk.shortType $!{tool.firstLowerCase($!pk.name)}) {
        return ResponseEntity.ok(this.$!{tool.firstLowerCase($tableInfo.name)}Service.deleteByPrimaryKey($!{tool.firstLowerCase($!pk.name)}));
    }

}

三、新建springBoot项目

1.springBoot版本

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

2.项目依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>

        <!--oracle数据库驱动-->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>6.0</version>
        </dependency>

        <!--swagger相关依赖-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
       <!--mybatis分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.1</version>
        </dependency>

    </dependencies>

3.yml文件配置

注意替换数据库ip与账号密码

server:
  port: 8088
spring:
  application:
    name: demo
  datasource:
    password: bbb
    username: aaa
    url: jdbc:oracle:thin:@***.**.*.***:1521:aaa
    driver-class-name: oracle.jdbc.driver.OracleDriver
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration:
    #驼峰命名
    map-underscore-to-camel-case: true
    #映射null值
    call-setters-on-nulls: true

4.启动类

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.example.demo.mapper")
@SpringBootApplication
public class DemoApplication {

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

}

四、代码生成

1.数据库连接

加粗样式在这里插入图片描述

在这里插入图片描述填写数据库连接信息,可以点击test测试一下,有个出现绿色的√代表连接成功
在这里插入图片描述

2.一键生成代码

找到我们要生成的表,右键选择EasyCode,然后点击Generate Code
在这里插入图片描述填写文件生成的位置信息,如果点击ok的时候报错可以在上一步的时候先进行config table
在这里插入图片描述
红色文件为自动生成的
在这里插入图片描述

3.接口访问测试

启动项目访问
在这里插入图片描述
在这里插入图片描述

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:19:38  更:2022-04-15 00:23:48 
 
开发: 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/14 15:14:52-

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