前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、lombok

支持lombok的各种注解,从此不用写getter setter这些 可以把注解还原为原本的java代码 非常方便

https://plugins.jetbrains.com/plugin/6317-lombok-plugin

AAAAAAAAAAAADFASF

2、GsonFormat

一键根据json文本生成java类  非常方便

https://plugins.jetbrains.com/plugin/7654-gsonformat

A7878fsdfasdf

3、VisualVM Launcher

运行java程序的时候启动visualvm,方便查看jvm的情况 比如堆内存大小的分配某个对象占用了多大的内存,jvm调优必备工具

https://plugins.jetbrains.com/plugin/7115-visualvm-launcher

A555555555555fd

4、GenerateAllSetter

一键调用一个对象的所有set方法并且赋予默认值 在对象字段多的时候非常方便

https://plugins.jetbrains.com/plugin/9360-generateallsette

A11111111fasd

5、Rainbow Brackets

彩虹颜色的括号  看着很舒服 敲代码效率变高

https://plugins.jetbrains.com/plugin/10080-rainbow-brackets

WX20180912-180038@2x

6、activate-power-mode

打字飞快,可以让你的屏幕跳动起来

WX20180912-180119@2x

7、Grep console

自定义log日志的颜色

https://images2018.cnblogs.com/blog/1162587/201805/1162587-20180518111929629-1534541229.png

8、Free Mybatis plugin

mybatis 插件,让你的mybatis.xml像java代码一样编辑。我们开发中使用mybatis时时长需要通过mapper接口查找对应的xml中的sql语句,该插件方便了我们的操作

WX20180912-180147@2x

9、MyBatis Log Plugin(直接搜索 MyBatis Log 相当的牛逼)

Mybatis现在是java中操作数据库的首选,在开发的时候,我们都会把Mybatis的脚本直接输出在console中,但是默认的情况下,输出的脚本不是一个可以直接执行的。

要以Debug模式启动应用,并且日志级别也要是Debug。

1585887388629

WX20180912-180210@2x

WX20181219-190453

10、CodeGlance

类似SublimeText的Mini Map插件 

WX20180912-163915

12、maven helper

1581910491205

13、CamelCase

下载Spring Manipulation

命名风格转换插件,可以在 kebab-case,SNAKE_CASE,PascalCase,camelCase,snake_case 和 空格风格之间切换。快捷键苹果为 Shift + Alt +U

1581910359319

14、EasyCode

14.1、安装配置

第一步:idea安装EasyCode

ctrl+alt+s –> 选择Plugins –> 安装Easy Code插件 –> 安装之后注意重启idea!

1585881348499

第二步:配置数据库添加数据源

1585881359804

14.2、使用

CREATE TABLE `user` (
    `id` bigint(20) unsigned NOT NULL,
    `city` varchar(20) NOT NULL DEFAULT '',
    `name` varchar(20) NOT NULL DEFAULT '',
    `status` int(10) NOT NULL DEFAULT '0' COMMENT '状态',
    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

14.2.1、配置映射:当然也可以在配置备注的时候重新配置一下

有些数据库的字段类型,这个插件识别不了,添加的时候注意\\

数据库类型 Java类型
varchar((\d+))? java.lang.String
char((\d+))? java.lang.String
text java.lang.String
   
int((\d+))? java.lang.Integer
   
bigint((\d+))? java.lang.Long
bigint((\d+))? unsigned java.lang.Long
   
datetime java.util.Date
timestamp java.util.Date
date java.util.Date
   
decimal((\d+,\d+))? java.lang.BigDecimal
decimal((\d+))? java.lang.BigDecimal
   
boolean java.lang.Boolean

1585882246601

14.2.2、配置备注、是否在实体中出现、映射:

14.2.2.1、配置备注

如果有的备注数据库中就没有,需要我们手动添加

1585881793630

比如我们的name就在数据库中没有备注

1585881725269

添加完成后如下

1585881768901

14.2.2.2、是否在实体中出现

改成true即可

1585881869173

14.2.2.3、配置映射

1585882901262

14.3、配置要生成的模板

默认的模板一 Defualt

1585882554516

默认的模板2 MybatisPlus

1585882565203

14.3.1、Default模板

1585883184416

14.3.1.1、Entity

package com.entity;

import java.util.Date;
import java.io.Serializable;

/**
 * (User)实体类
 *
 * @author makejava
 * @since 2020-04-03 11:09:05
 */
public class User implements Serializable {
    private static final long serialVersionUID = -36714741080529376L;
    
    private Long id;
    
    private String city;
    /**
    * 姓名
    */
    private String name;
    /**
    * 状态
    */
    private Integer status;
    /**
    * 创建时间
    */
    private Date createTime;
    /**
    * 修改时间
    */
    private Date updateTime;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

}

14.3.1.2、Dao

package com.dao;

import com.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * (User)表数据库访问层
 *
 * @author makejava
 * @since 2020-04-03 11:09:05
 */
public interface UserDao {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    User queryById(Long id);

    /**
     * 查询指定行数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    List<User> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);


    /**
     * 通过实体作为筛选条件查询
     *
     * @param user 实例对象
     * @return 对象列表
     */
    List<User> queryAll(User user);

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 影响行数
     */
    int insert(User user);

    /**
     * 修改数据
     *
     * @param user 实例对象
     * @return 影响行数
     */
    int update(User user);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Long id);

}

14.3.1.3、Mappe.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.dao.UserDao">

    <resultMap type="com.entity.User" id="UserMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="city" column="city" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="status" column="status" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>

    <!--查询单个-->
    <select id="queryById" resultMap="UserMap">
        select
          id, city, name, status, create_time, update_time
        from ds_0.user
        where id = #{id}
    </select>

    <!--查询指定行数据-->
    <select id="queryAllByLimit" resultMap="UserMap">
        select
          id, city, name, status, create_time, update_time
        from ds_0.user
        limit #{offset}, #{limit}
    </select>

    <!--通过实体作为筛选条件查询-->
    <select id="queryAll" resultMap="UserMap">
        select
          id, city, name, status, create_time, update_time
        from ds_0.user
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
            <if test="city != null and city != ''">
                and city = #{city}
            </if>
            <if test="name != null and name != ''">
                and name = #{name}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="createTime != null">
                and create_time = #{createTime}
            </if>
            <if test="updateTime != null">
                and update_time = #{updateTime}
            </if>
        </where>
    </select>

    <!--新增所有列-->
    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
        insert into ds_0.user(city, name, status, create_time, update_time)
        values (#{city}, #{name}, #{status}, #{createTime}, #{updateTime})
    </insert>

    <!--通过主键修改数据-->
    <update id="update">
        update ds_0.user
        <set>
            <if test="city != null and city != ''">
                city = #{city},
            </if>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="status != null">
                status = #{status},
            </if>
            <if test="createTime != null">
                create_time = #{createTime},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime},
            </if>
        </set>
        where id = #{id}
    </update>

    <!--通过主键删除-->
    <delete id="deleteById">
        delete from ds_0.user where id = #{id}
    </delete>

</mapper>

14.3.1.3、Service

package com.service;

import com.entity.User;
import java.util.List;

/**
 * (User)表服务接口
 *
 * @author makejava
 * @since 2020-04-03 11:09:05
 */
public interface UserService {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    User queryById(Long id);

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    List<User> queryAllByLimit(int offset, int limit);

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    User insert(User user);

    /**
     * 修改数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    User update(User user);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    boolean deleteById(Long id);

}

14.3.1.4、ServiceImpl

package com.service.impl;

import com.entity.User;
import com.dao.UserDao;
import com.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * (User)表服务实现类
 *
 * @author makejava
 * @since 2020-04-03 11:09:05
 */
@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public User queryById(Long id) {
        return this.userDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    @Override
    public List<User> queryAllByLimit(int offset, int limit) {
        return this.userDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public User insert(User user) {
        this.userDao.insert(user);
        return user;
    }

    /**
     * 修改数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public User update(User user) {
        this.userDao.update(user);
        return this.queryById(user.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.userDao.deleteById(id) > 0;
    }
}

14.3.1.5、Controller

package com.controller;

import com.entity.User;
import com.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * (User)表控制层
 *
 * @author makejava
 * @since 2020-04-03 11:09:05
 */
@RestController
@RequestMapping("user")
public class UserController {
    /**
     * 服务对象
     */
    @Resource
    private UserService userService;

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("selectOne")
    public User selectOne(Long id) {
        return this.userService.queryById(id);
    }

}

14.3.2、MybatisPlus模板

1585883174915

14.3.2.1、Entity

package com.entity;

import java.util.Date;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;

/**
 * (User)表实体类
 *
 * @author makejava
 * @since 2020-04-03 11:02:03
 */
@SuppressWarnings("serial")
public class User extends Model<User> {

    private Long id;

    private String city;
    //姓名
    private String name;
    //状态
    private Integer status;
    //创建时间
    private Date createTime;
    //修改时间
    private Date updateTime;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    /**
     * 获取主键值
     *
     * @return 主键值
     */
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}

14.3.2.2、Dao

package com.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.entity.User;

/**
 * (User)表数据库访问层
 *
 * @author makejava
 * @since 2020-04-03 11:02:03
 */
public interface UserDao extends BaseMapper<User> {

}

14.3.2.3、Service

package com.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.entity.User;

/**
 * (User)表服务接口
 *
 * @author makejava
 * @since 2020-04-03 11:02:03
 */
public interface UserService extends IService<User> {

}

14.3.2.4、ServiceImpl

package com.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dao.UserDao;
import com.entity.User;
import com.service.UserService;
import org.springframework.stereotype.Service;

/**
 * (User)表服务实现类
 *
 * @author makejava
 * @since 2020-04-03 11:02:03
 */
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

}

14.3.2.5、Controller

package com.controller;



import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.ApiController;
import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.entity.User;
import com.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

/**
 * (User)表控制层
 *
 * @author makejava
 * @since 2020-04-03 11:02:03
 */
@RestController
@RequestMapping("user")
public class UserController extends ApiController {
    /**
     * 服务对象
     */
    @Resource
    private UserService userService;

    /**
     * 分页查询所有数据
     *
     * @param page 分页对象
     * @param user 查询实体
     * @return 所有数据
     */
    @GetMapping
    public R selectAll(Page<User> page, User user) {
        return success(this.userService.page(page, new QueryWrapper<>(user)));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R selectOne(@PathVariable Serializable id) {
        return success(this.userService.getById(id));
    }

    /**
     * 新增数据
     *
     * @param user 实体对象
     * @return 新增结果
     */
    @PostMapping
    public R insert(@RequestBody User user) {
        return success(this.userService.save(user));
    }

    /**
     * 修改数据
     *
     * @param user 实体对象
     * @return 修改结果
     */
    @PutMapping
    public R update(@RequestBody User user) {
        return success(this.userService.updateById(user));
    }

    /**
     * 删除数据
     *
     * @param idList 主键结合
     * @return 删除结果
     */
    @DeleteMapping
    public R delete(@RequestParam("idList") List<Long> idList) {
        return success(this.userService.removeByIds(idList));
    }
}

14.3.3、自定义模板:CustomMybatisPlus

14.3.3.1、Entity

##引入宏定义
$!define

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

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

##使用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;
import lombok.Data;

##使用宏定义实现类注释信息
/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
@Data
public class $!{tableInfo.name} implements Serializable {

#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})/**  ${column.comment} */#end

    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end



}
package com.entity;

import java.util.Date;
import java.io.Serializable;
import lombok.Data;

/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
@Data
public class User implements Serializable {

    
    private Long id;
    
    private String city;
    /**  姓名 */
    private String name;
    /**  状态 */
    private Integer status;
    /**  创建时间 */
    private Date createTime;
    /**  修改时间 */
    private Date updateTime;



}

14.3.3.2、Mapper.java

##导入宏定义
$!define

##设置表后缀宏定义
#setTableSuffix("Mapper")

##保存文件宏定义
#save("/mapper", "Mapper.java")

##包路径宏定义
#setPackageSuffix("mapper")

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import $!{tableInfo.savePackageName}.entity.$!tableInfo.name;

/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
public interface $!{tableName} extends BaseMapper<$!tableInfo.name> {

}
package com.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.entity.User;

/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
public interface UserMapper extends BaseMapper<User> {

}

14.3.3.2、Mapper.xml

##引入mybatis支持
$!mybatisSupport

##设置保存名称与保存位置
$!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>

</mapper>
<?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.mapper.UserMapper">

    <resultMap type="com.entity.User" id="UserMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="city" column="city" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="status" column="status" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>

</mapper>

14.3.3.2、Service.java

##定义初始变量
#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;


/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
public interface $!{tableName} {


}
package com.service;


/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
public interface UserService {


}

14.3.3.2、ServiceImpl.java

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

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

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

import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;

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

/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")
public class $!{tableName} implements $!{tableInfo.name}Service {

    @Autowired
    private $!{tableInfo.name}Mapper $!tool.firstLowerCase($!{tableInfo.name})Mapper;
 
}
package com.service.impl;

import com.mapper.UserMapper;
import com.service.UserService;
import org.springframework.stereotype.Service;

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

/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;
 
}

14.3.3.2、Controller.java

##定义初始变量
#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}.service.$!{tableInfo.name}Service;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
@RestController
@RequestMapping("api/$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} {
    
    @Autowired
    private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;

}
package com.controller;

import com.service.UserService;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author HealerJean
 * @date 2020-04-03 11:40:02
 * @Description
 */
@RestController
@RequestMapping("api/user")
public class UserController {
    
    @Autowired
    private UserService userService;

}

15、POJO to JSON

右键 -> MakeJson -> 剪贴板

image-20200909163209711

1585889313225

16、 翻译插件

在IDEA插件中搜索 translation

image-20200518104426695

17、Background Image Plus

image-20200909162934249

image-20200909163043196

18、codehelper.generator

对象相关赋值插件,自定义快捷键 ALT+C

image-20200925161457897

image-20200925161527716

image-20200925161557605

19、

ContactAuthor