日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

基于SpringBoot的CodeGenerator

發布時間:2023/11/29 javascript 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于SpringBoot的CodeGenerator 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

title: 基于SpringBoot的CodeGenerator tags:

  • SpringBoot
  • Mybatis
  • 生成器
  • PageHelper categories: springboot date: 2017-11-21 15:13:33

背景

目前組織上對于一個基礎的crud的框架需求較多 因此選擇了SpringBoot作為基礎選型。

Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發展的快速應用開發領域(rapid application development)成為領導者。

目前的結構基于 SpringBoot [base]+ mybatis[orm] + dubbo[soa] + shiro[rbac] + kisso[sso] + orika[mapping] +swagger[doc] +easypoi [word]

代碼

在介紹生成器之前先簡單介紹如下幾個抽象接口或者超類

實體對象

package com.f6car.base.common;public class Po implements java.io.Serializable {private static final long serialVersionUID = 5350639685728778721L;} 復制代碼

頁面展示對象

package com.f6car.base.common;public class Vo implements java.io.Serializable {private static final long serialVersionUID = -3138610557784823876L;} 復制代碼

頁面搜索對象

/*** @author qixiaobo*///非線程安全public class So implements java.io.Serializable, Pagable, Sortable {private static final long serialVersionUID = -828171499994153332L;private int currentPage;private int pageSize = PAGESIZE.s.pageSize;private boolean enableCount;private List<Sort> sorts;@Overridepublic int getCurrentPage() {return currentPage;}@Overridepublic void setCurrentPage(int currentPage) {this.currentPage = currentPage;}@Overridepublic int getPageSize() {return pageSize;}@Overridepublic void setPageSize(int pageSize) {this.pageSize = pageSize;}@Overridepublic boolean isEnableCount() {return enableCount;}@Overridepublic void setEnableCount(boolean enableCount) {this.enableCount = enableCount;}@Overridepublic List<Sort> getSorts() {return sorts;}public void setSorts(List<Sort> sorts) {this.sorts = sorts;}@Overridepublic void addSort(Sort sort) {if (sorts != null) {sorts = new ArrayList<>();}sorts.add(sort);}public static enum PAGESIZE {xs(5), s(10), m(20), l(30), xl(50), xxl(100), xxxl(1000);private int pageSize;PAGESIZE(int pageSize) {this.pageSize = pageSize;}public int getPageSize() {return pageSize;}}} 復制代碼 /*** Created by qixiaobo on 2016/11/24.*/public interface Pagable {public int getCurrentPage();public void setCurrentPage(int currentPage);public int getPageSize();public void setPageSize(int pagesize);public boolean isEnableCount();public void setEnableCount(boolean enable);} 復制代碼 /*** Created by qixiaobo on 2016/11/24.*/public interface Sortable {List<Sort> getSorts();void addSort(Sort sort);} 復制代碼 /*** Created by qixiaobo on 2016/11/24.*/public class Sort implements Serializable {private static final long serialVersionUID = 7739709965769082011L;private static final String DEFAULT_PREFIX = "p";private static final String SQL_DOT = ".";private String orderField;private OrderType orderType = OrderType.ASC;private boolean enablePrefix = true;private Sort() {}private Sort(String orderField, OrderType orderType, boolean enablePrefix) {assert orderField != null;this.orderField = orderField;this.orderType = orderType;this.enablePrefix = enablePrefix;}private Sort(String orderField) {this(orderField, OrderType.ASC, true);}public static Sort valueOf(String sortString) {return new Sort(sortString);}public static Sort valueOf(String sortKey, OrderType orderType) {return new Sort(sortKey, orderType, true);}public static Sort valueOf(String sortKey, OrderType orderType, boolean enablePrefix) {return new Sort(sortKey, orderType, enablePrefix);}public String getOrderField() {if (orderField.contains(SQL_DOT) || !enablePrefix) {return orderField;} else {return DEFAULT_PREFIX + SQL_DOT + orderField;}}public void setOrderField(String orderField) {this.orderField = orderField;}public OrderType getOrderType() {return orderType;}public void setOrderType(OrderType orderType) {this.orderType = orderType;}public boolean isEnablePrefix() {return enablePrefix;}public void setEnablePrefix(boolean enablePrefix) {this.enablePrefix = enablePrefix;}@Overridepublic String toString() {return getOrderField() + " " + orderType;}} 復制代碼

統一回復格式

public class Result {private int code;private String message;private Object data;public Result setCode(ResultCode resultCode) {this.code = resultCode.code;return this;}public int getCode() {return code;}public Result setCode(int code) {this.code = code;return this;}public String getMessage() {return message;}public Result setMessage(String message) {this.message = message;return this;}public Object getData() {return data;}public Result setData(Object data) {this.data = data;return this;}@Overridepublic String toString() {final StringBuilder sb = new StringBuilder("Result{");sb.append("code=").append(code);sb.append(", message='").append(message).append('\'');sb.append(", data=").append(data);sb.append('}');return sb.toString();}}public enum ResultCode {SUCCESS(200),//成功FAIL(400),//失敗UNAUTHORIZED(401),//未認證(簽名錯誤)NOT_FOUND(404),//接口不存在INTERNAL_SERVER_ERROR(500);//服務器內部錯誤public int code;ResultCode(int code) {this.code = code;}} 復制代碼 public class ResultGenerator {private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";public static Result genSuccessResult() {return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE);}public static Result genSuccessResult(Object data) {return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE).setData(data);}public static Result genFailResult(String message) {return new Result().setCode(ResultCode.FAIL).setMessage(message);}} 復制代碼

抽象Mapper

package com.f6car.base.core;import com.f6car.base.common.Po;import tk.mybatis.mapper.common.BaseMapper;import tk.mybatis.mapper.common.ConditionMapper;import tk.mybatis.mapper.common.IdsMapper;import tk.mybatis.mapper.common.special.InsertListMapper;public interface Mapper<T extends Po>extendsBaseMapper<T>,ConditionMapper<T>,IdsMapper<T>,InsertListMapper<T> {} 復制代碼

抽象Service

public abstract class AbstractService<T extends Po, V extends Vo, S extends So> implements Service<V, S> {@Autowiredprotected Mapper<T> mapper;@Resourceprotected OrikaMapper orikaMapper;protected Class<V> voClazz;protected Class<T> poClazz;public AbstractService() {TypeToken<T> poType = new TypeToken<T>(getClass()) {};TypeToken<V> voType = new TypeToken<V>(getClass()) {};poClazz = (Class<T>) poType.getRawType();voClazz = (Class<V>) voType.getRawType();}@Overridepublic int save(V model) {Preconditions.checkArgument(model != null);T po = orikaMapper.convert(model, poClazz);return mapper.insertSelective(po);}@Overridepublic int save(List<V> models) {Preconditions.checkArgument(models != null && !models.isEmpty());List<T> ts = orikaMapper.convertList(models, poClazz);return mapper.insertList(ts);}@Overridepublic int deleteById(Serializable id) {Preconditions.checkArgument(id != null);return mapper.deleteByPrimaryKey(id);}@Overridepublic int deleteByIds(String ids) {Preconditions.checkArgument(!Strings.isNullOrEmpty(ids));return mapper.deleteByIds(ids);}@Overridepublic int update(V model) {Preconditions.checkArgument(model != null);T po = orikaMapper.convert(model, poClazz);return mapper.updateByPrimaryKeySelective(po);}@Overridepublic V findById(Serializable id) {Preconditions.checkArgument(id != null);return orikaMapper.convert(mapper.selectByPrimaryKey(id), voClazz);}@Overridepublic List<V> findByIds(String ids) {Preconditions.checkArgument(!Strings.isNullOrEmpty(ids));return orikaMapper.convertList(mapper.selectByIds(ids), voClazz);}@Overridepublic List<V> findAll() {return orikaMapper.convertList(mapper.selectAll(), voClazz);}} 復制代碼

很明顯此處實現了基于泛型的注入

Service接口

/*** Service 層 基礎接口,其他Service 接口 請繼承該接口*/public interface Service<V extends Vo, S extends So> {int save(V model);//持久化int save(List<V> models);//批量持久化int deleteById(Serializable id);//通過主鍵刪除int deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4”int update(V model);//更新V findById(Serializable id);//通過ID查找List<V> findByIds(String ids);//通過多個ID查找//eg:ids -> “1,2,3,4”List<V> findAll();//獲取所有} 復制代碼

service層次并沒有提供po的 泛型 各位可以思考這是為啥?

抽象Controller

/*** @author qixiaobo*/public abstract class AbstractRestController<V extends Vo, S extends So> {@Autowiredprivate Service<V, S> service;@PostMapping()@ApiOperation(value = "新建實體", notes = "")public Result add(@RequestBody V vo) {service.save(vo);return ResultGenerator.genSuccessResult();}@DeleteMapping("/{id}")@ApiOperation(value = "刪除實體", notes = "")public Result delete(@PathVariable Serializable id) {service.deleteById(id);return ResultGenerator.genSuccessResult();}@PutMapping@ApiOperation(value = "更新實體", notes = "")public Result update(@RequestBody V vo) {service.update(vo);return ResultGenerator.genSuccessResult();}@GetMapping@ApiOperation(value = "獲取實體列表", notes = "")public Result list(S so) {PageHelper.startPage(so.getCurrentPage(), so.getPageSize());List<V> list = service.findAll();PageInfo pageInfo = new PageInfo(list);return ResultGenerator.genSuccessResult(pageInfo);}@GetMapping("/{id}")@ApiOperation(value = "獲取單個實體", notes = "")public Result detail(@PathVariable Serializable id) {V vo = service.findById(id);return ResultGenerator.genSuccessResult(vo);}@DeleteMapping("/batch")@ApiOperation(value = "批量刪除實體", notes = "")public Result batchDelete(@RequestParam String ids) {service.deleteByIds(ids);return ResultGenerator.genSuccessResult();}@GetMapping("/batch")@ApiOperation(value = "批量獲取實體", notes = "")public Result batchDetail(@RequestParam String ids) {List<V> vos = service.findByIds(ids);return ResultGenerator.genSuccessResult(vos);}@PostMapping("/batch")@ApiOperation(value = "批量新建實體", notes = "")public Result add(@RequestBody List<V> vos) {service.save(vos);return ResultGenerator.genSuccessResult();}} 復制代碼

生成器

public class CodeGenerator {private static final String JDBC_URL = "jdbc:mysql://192.168.1.7:3306/f6dms_20160522";private static final String JDBC_USERNAME = "root";private static final String JDBC_PASSWORD = "root";private static final String JDBC_DIVER_CLASS_NAME = "com.mysql.jdbc.Driver";public static final ThreadLocal<List<Field>> PO_FIELDS = new ThreadLocal<>();private static final String PROJECT_PATH = System.getProperty("user.dir");private static final String TEMPLATE_FILE_PATH = PROJECT_PATH + "/src/test/resources/template";private static final String JAVA_PATH = "/src/main/java";private static final String RESOURCES_PATH = "/src/main/resources";private static final String PACKAGE_PATH_SERVICE = packageConvertPath(SERVICE_PACKAGE);private static final String PACKAGE_PATH_SERVICE_IMPL = packageConvertPath(SERVICE_IMPL_PACKAGE);private static final String PACKAGE_PATH_SO = packageConvertPath(SO_PACKAGE);private static final String PACKAGE_PATH_VO = packageConvertPath(VO_PACKAGE);private static final String PACKAGE_PATH_CONTROLLER = packageConvertPath(CONTROLLER_PACKAGE);private static final String AUTHOR = "qixiaobo";private static final Splitter TABLE_NAME_SPLITTER = Splitter.on(UNDER_LINE).trimResults().omitEmptyStrings();private static final String DATE = new DateTime().toString("yyyy-MM-dd");private static final List<String> VO_EXCLUED_FIELD_NAMES = Lists.newArrayList("creator", "modifier", "modifiedtime", "creationtime");private static final Joiner PATH_JOINER = Joiner.on("/");private static GroupTemplate gt;static {ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("template");org.beetl.core.Configuration cfg = null;try {cfg = org.beetl.core.Configuration.defaultConfiguration();} catch (IOException e) {e.printStackTrace();}gt = new GroupTemplate(resourceLoader, cfg);}public static void main(String[] args) throws IOException {genCode("tb_user", "tb_org", "tb_menu", "tb_org_mac");}/*** 通過數據表名稱生成代碼,Model 名稱通過解析數據表名稱獲得,下劃線轉大駝峰的形式。* 如輸入表名稱 "t_user_detail" 將生成 TUserDetail、TUserDetailMapper、TUserDetailService ...** @param tableNames 數據表名稱...*/public static void genCode(String... tableNames) throws IOException {for (String tableName : tableNames) {genCodeByCustomModelName(tableName, null);}}/*** 通過數據表名稱,和自定義的 Model 名稱生成代碼* 如輸入表名稱 "t_user_detail" 和自定義的 Model 名稱 "User" 將生成 User、UserMapper、UserService ...** @param tableName 數據表名稱* @param modelName 自定義的 Model 名稱*/public static void genCodeByCustomModelName(String tableName, String modelName) throws IOException {String subPackage = "";List<String> strings = TABLE_NAME_SPLITTER.splitToList(tableName);if (strings.size() >= 2) {if (strings.get(0).length() <= 2) {subPackage = strings.get(1);}}genModelAndMapper(tableName, modelName, subPackage);genService(tableName, modelName, subPackage);genController(tableName, modelName, subPackage);}public static void genModelAndMapper(String tableName, String modelName, String subPackageName) {Context context = new Context(ModelType.FLAT);context.setId("f6car");context.setTargetRuntime("MyBatis3Simple");context.addProperty(PropertyRegistry.CONTEXT_BEGINNING_DELIMITER, "`");context.addProperty(PropertyRegistry.CONTEXT_ENDING_DELIMITER, "`");JDBCConnectionConfiguration jdbcConnectionConfiguration = new JDBCConnectionConfiguration();jdbcConnectionConfiguration.setConnectionURL(JDBC_URL);jdbcConnectionConfiguration.setUserId(JDBC_USERNAME);jdbcConnectionConfiguration.setPassword(JDBC_PASSWORD);jdbcConnectionConfiguration.setDriverClass(JDBC_DIVER_CLASS_NAME);context.setJdbcConnectionConfiguration(jdbcConnectionConfiguration);JavaTypeResolverConfiguration javaTypeResolverConfiguration = new JavaTypeResolverConfiguration();javaTypeResolverConfiguration.setConfigurationType(F6JavaTypeResolverDefaultImpl.class.getName());context.setJavaTypeResolverConfiguration(javaTypeResolverConfiguration);PluginConfiguration pluginConfiguration = new PluginConfiguration();pluginConfiguration.setConfigurationType(F6MapperPlugin.class.getName());pluginConfiguration.addProperty("mappers", MAPPER_INTERFACE_REFERENCE);context.addPluginConfiguration(pluginConfiguration);JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();javaModelGeneratorConfiguration.setTargetProject(PROJECT_PATH + Module.model.moduleDir + JAVA_PATH);String javaPackage = MODEL_PACKAGE;String mapperPackage = MAPPER_PACKAGE;String xmlPackage = "mapper";if (!Strings.isNullOrEmpty(subPackageName)) {javaPackage += ("." + subPackageName);mapperPackage += ("." + subPackageName);xmlPackage += ("/" + subPackageName);}javaModelGeneratorConfiguration.setTargetPackage(javaPackage);context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration();sqlMapGeneratorConfiguration.setTargetProject(PROJECT_PATH + Module.dao.moduleDir + RESOURCES_PATH);sqlMapGeneratorConfiguration.setTargetPackage(xmlPackage);context.setSqlMapGeneratorConfiguration(sqlMapGeneratorConfiguration);JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration();javaClientGeneratorConfiguration.setTargetProject(PROJECT_PATH + Module.dao.moduleDir + JAVA_PATH);javaClientGeneratorConfiguration.setTargetPackage(mapperPackage);javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER");context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);TableConfiguration tableConfiguration = new TableConfiguration(context);tableConfiguration.setTableName(tableName);if (!Strings.isNullOrEmpty(modelName)) {tableConfiguration.setDomainObjectName(modelName);}tableConfiguration.setGeneratedKey(new GeneratedKey("id", "Mysql", true, null));context.addTableConfiguration(tableConfiguration);List<String> warnings;MyBatisGenerator generator;try {Configuration config = new Configuration();config.addContext(context);config.validate();boolean overwrite = true;DefaultShellCallback callback = new DefaultShellCallback(overwrite);warnings = new ArrayList<>();generator = new MyBatisGenerator(config, callback, warnings);generator.generate(null);} catch (Exception e) {throw new RuntimeException("生成Model和Mapper失敗", e);}if (generator.getGeneratedJavaFiles().isEmpty() || generator.getGeneratedXmlFiles().isEmpty()) {throw new RuntimeException("生成Model和Mapper失敗:" + warnings);}if (StringUtils.isEmpty(modelName)) {modelName = tableNameConvertUpperCamel(tableName);}System.out.println(modelName + ".java 生成成功");System.out.println(modelName + "Mapper.java 生成成功");System.out.println(modelName + "Mapper.xml 生成成功");}public static void genService(String tableName, String modelName, String subPackage) throws IOException {Map<String, Object> data = new HashMap<>();data.put("date", DATE);data.put("author", AUTHOR);String modelNameUpperCamel = StringUtils.isEmpty(modelName) ? tableNameConvertUpperCamel(tableName) : modelName;data.put("modelNameUpperCamel", modelNameUpperCamel);data.put("modelNameLowerCamel", tableNameConvertLowerCamel(tableName));data.put("basePackage", BASE_PACKAGE);String servicePackageDir = PROJECT_PATH + Module.service.moduleDir + JAVA_PATH + PACKAGE_PATH_SERVICE;String serviceImplPackageDir = PROJECT_PATH + Module.serviceimpl.moduleDir + JAVA_PATH + PACKAGE_PATH_SERVICE_IMPL;String soPackageDir = PROJECT_PATH + Module.dto.moduleDir + JAVA_PATH + PACKAGE_PATH_SO;String voPackageDir = PROJECT_PATH + Module.dto.moduleDir + JAVA_PATH + PACKAGE_PATH_VO;if (!Strings.isNullOrEmpty(subPackage)) {data.put("subPackage", "." + subPackage);servicePackageDir += ("/" + subPackage + "/");serviceImplPackageDir += ("/" + subPackage + "/");soPackageDir += ("/" + subPackage + "/");voPackageDir += ("/" + subPackage + "/");}generateByTemplate(gt, "/service.beetl", servicePackageDir + modelNameUpperCamel + "Service.java", data);generateByTemplate(gt, "/service-impl.beetl", serviceImplPackageDir + modelNameUpperCamel + "ServiceImpl.java", data);data.put("fields", getVoFields());generateByTemplate(gt, "/so.beetl", soPackageDir + modelNameUpperCamel + "So.java", data);generateByTemplate(gt, "/vo.beetl", voPackageDir + modelNameUpperCamel + "Vo.java", data);}private static Collection<Field> getVoFields() {if (PO_FIELDS.get().isEmpty()) {return Collections.emptyList();} else {return Collections2.filter(PO_FIELDS.get(), new Predicate<Field>() {@Overridepublic boolean apply(Field input) {if (VO_EXCLUED_FIELD_NAMES.contains(input.getName())) {return false;}return true;}});}}private static void generateByTemplate(GroupTemplate groupTemplate, String templateFile, String filename, Map data) throws IOException {File serviceFile = new File(filename);if (!serviceFile.getParentFile().exists()) {serviceFile.getParentFile().mkdirs();}Template template = groupTemplate.getTemplate(templateFile);template.binding(data);template.renderTo(new FileWriter(serviceFile));System.out.println(filename + "生成成功");}public static void genController(String tableName, String modelName, String subPackage) throws IOException {Map<String, Object> data = new HashMap<>();data.put("date", DATE);data.put("author", AUTHOR);String modelNameUpperCamel = StringUtils.isEmpty(modelName) ? tableNameConvertUpperCamel(tableName) : modelName;List<String> strings = TABLE_NAME_SPLITTER.splitToList(tableName.toLowerCase());if (strings.size() >= 2) {if (strings.get(0).length() <= 2) {strings = Lists.newArrayList(strings);strings.remove(0);}data.put("baseRequestMapping", PATH_JOINER.join(strings));}if (!data.containsKey("baseRequestMapping")) {data.put("baseRequestMapping", modelNameConvertMappingPath(modelNameUpperCamel));}data.put("modelNameUpperCamel", modelNameUpperCamel);data.put("modelNameLowerCamel", CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, modelNameUpperCamel));data.put("basePackage", BASE_PACKAGE);String controllerPackageDir = PROJECT_PATH + Module.web.moduleDir + JAVA_PATH + PACKAGE_PATH_CONTROLLER;if (!Strings.isNullOrEmpty(subPackage)) {data.put("subPackage", "." + subPackage);controllerPackageDir += ("/" + subPackage + "/");}generateByTemplate(gt, "/controller.beetl", controllerPackageDir + modelNameUpperCamel + "Controller.java", data);PO_FIELDS.remove();}private static String tableNameConvertLowerCamel(String tableName) {return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, tableName.toLowerCase());}private static String tableNameConvertUpperCamel(String tableName) {return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, tableName.toLowerCase());}private static String tableNameConvertMappingPath(String tableName) {tableName = tableName.toLowerCase();return "/" + (tableName.contains("_") ? tableName.replaceAll("_", "/") : tableName);}private static String modelNameConvertMappingPath(String modelName) {String tableName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, modelName);return tableNameConvertMappingPath(tableName);}private static String packageConvertPath(String packageName) {return String.format("/%s/", packageName.contains(".") ? packageName.replaceAll("\\.", "/") : packageName);}private static enum Module {dao("/dao"), web("/web"), service("/service"), serviceimpl("/serviceimpl"), dto("/dto"), model("/model");private String moduleDir;Module(String moduleDir) {this.moduleDir = moduleDir;}}} 復制代碼

基于我們系統中使用uuid_short 必須使用bigint unsigned (20) 目前Java中并無基礎數據類型可以對應 所以使用了String類型

public class F6JavaTypeResolverDefaultImpl extends JavaTypeResolverDefaultImpl {public F6JavaTypeResolverDefaultImpl() {super();//bigint unsigned!typeMap.put(Types.BIGINT, new JdbcTypeInformation("BIGINT",new FullyQualifiedJavaType(String.class.getName())));}} 復制代碼

生成器模板

vo

package com.f6car.base.vo${subPackage!};import com.f6car.base.common.Vo;import java.util.Date;import java.math.BigDecimal;/*** Created by ${author} on ${date}.*/public class ${modelNameUpperCamel}Vo extends Vo {private static final long serialVersionUID = -6920934492324729614L;<%for(field in fields){%>private ${ field.type.shortName} ${field.name};<%}%><%for(field in fields){%><%var firstChar = strutil.subStringTo(field.name,0,1);var firstChar_upper = strutil.toUpperCase(firstChar);var fieldNameWithUpper = strutil.replace (field.name,firstChar,firstChar_upper);%>public void set${fieldNameWithUpper}(${ field.type.shortName} ${field.name}) {this.${field.name} = ${field.name};}public ${ field.type.shortName} get${fieldNameWithUpper}() {return ${field.name};}<%}%>} 復制代碼

so

package com.f6car.base.so${subPackage!};import com.f6car.base.common.So;/*** Created by ${author} on ${date}.*/public class ${modelNameUpperCamel}So extends So {private static final long serialVersionUID = -6920934492324729614L;} 復制代碼

service

package ${basePackage}.service${subPackage!};import ${basePackage}.vo${subPackage!}.${modelNameUpperCamel}Vo;import ${basePackage}.so${subPackage!}.${modelNameUpperCamel}So;import ${basePackage}.common.Service;/*** Created by ${author} on ${date}.*/public interface ${modelNameUpperCamel}Service extends Service<${modelNameUpperCamel}Vo,${modelNameUpperCamel}So> {} 復制代碼

service-impl

package ${basePackage}.service.impl${subPackage!};import ${basePackage}.dao${subPackage!}.${modelNameUpperCamel}Mapper;import ${basePackage}.po${subPackage!}.${modelNameUpperCamel};import ${basePackage}.vo${subPackage!}.${modelNameUpperCamel}Vo;import ${basePackage}.so${subPackage!}.${modelNameUpperCamel}So;import ${basePackage}.service${subPackage!}.${modelNameUpperCamel}Service;import ${basePackage}.core.AbstractService;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;/*** Created by ${author} on ${date}.*/@Service@Transactional(rollbackFor = Exception.class)public class ${modelNameUpperCamel}ServiceImpl extends AbstractService<${modelNameUpperCamel},${modelNameUpperCamel}Vo,${modelNameUpperCamel}So> implements ${modelNameUpperCamel}Service {@Resourceprivate ${modelNameUpperCamel}Mapper ${modelNameLowerCamel}Mapper;} 復制代碼

controller

package ${basePackage}.controller${subPackage!};import ${basePackage}.common.Result;import ${basePackage}.common.ResultGenerator;import ${basePackage}.vo${subPackage!}.${modelNameUpperCamel}Vo;import ${basePackage}.so${subPackage!}.${modelNameUpperCamel}So;import ${basePackage}.service${subPackage!}.${modelNameUpperCamel}Service;import ${basePackage}.controller.base.AbstractRestController;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import java.io.Serializable;import java.util.List;/*** Created by ${author} on ${date}.*/@RestController@RequestMapping("${baseRequestMapping}")public class ${modelNameUpperCamel}Controller extends AbstractRestController<${modelNameUpperCamel}Vo, ${modelNameUpperCamel}So> {@Resourceprivate ${modelNameUpperCamel}Service ${modelNameLowerCamel}Service;} 復制代碼

當運行生成器比如傳入

genCode("tb_user", "tb_org", "tb_menu", "tb_org_mac"); 復制代碼

生成如下

package com.f6car.base.po.user;import com.f6car.base.common.Po;import java.util.Date;import javax.persistence.*;@Table(name = "tb_user")public class TbUser extends Po {/*** 主鍵*/@Id@Column(name = "pk_id")private String pkId;/*** 用戶名*/private String username;@Column(name = "cell_phone")private String cellPhone;/*** 密碼*/private String password;/*** 是否管理員*/@Column(name = "is_admin")private Byte isAdmin;/*** 角色ID*/@Column(name = "id_role")private String idRole;/*** 創建人*/private String creator;/*** 修改人*/private String modifier;/*** 修改日期*/private Date modifiedtime;/*** 創建日期*/private Date creationtime;/*** 組織*/@Column(name = "id_own_org")private String idOwnOrg;/*** 員工ID*/@Column(name = "id_employee")private String idEmployee;@Column(name = "is_del")private Byte isDel;/*** 向導默認開關:0默認關閉,1默認打開*/@Column(name = "is_guide_open")private Byte isGuideOpen;/*** 維小寶用戶ID*/@Column(name = "id_wxb_user")private String idWxbUser;/*** 維小寶店鋪ID*/@Column(name = "id_wxb_station")private String idWxbStation;private String openid;/*** 是否限定PC登錄設備 0 不選中 1 選中*/@Column(name = "limit_mac")private Byte limitMac;/*** 獲取主鍵** @return pk_id - 主鍵*/public String getPkId() {return pkId;}/*** 設置主鍵** @param pkId 主鍵*/public void setPkId(String pkId) {this.pkId = pkId;}/*** 獲取用戶名** @return username - 用戶名*/public String getUsername() {return username;}/*** 設置用戶名** @param username 用戶名*/public void setUsername(String username) {this.username = username;}/*** @return cell_phone*/public String getCellPhone() {return cellPhone;}/*** @param cellPhone*/public void setCellPhone(String cellPhone) {this.cellPhone = cellPhone;}/*** 獲取密碼** @return password - 密碼*/public String getPassword() {return password;}/*** 設置密碼** @param password 密碼*/public void setPassword(String password) {this.password = password;}/*** 獲取是否管理員** @return is_admin - 是否管理員*/public Byte getIsAdmin() {return isAdmin;}/*** 設置是否管理員** @param isAdmin 是否管理員*/public void setIsAdmin(Byte isAdmin) {this.isAdmin = isAdmin;}/*** 獲取角色ID** @return id_role - 角色ID*/public String getIdRole() {return idRole;}/*** 設置角色ID** @param idRole 角色ID*/public void setIdRole(String idRole) {this.idRole = idRole;}/*** 獲取創建人** @return creator - 創建人*/public String getCreator() {return creator;}/*** 設置創建人** @param creator 創建人*/public void setCreator(String creator) {this.creator = creator;}/*** 獲取修改人** @return modifier - 修改人*/public String getModifier() {return modifier;}/*** 設置修改人** @param modifier 修改人*/public void setModifier(String modifier) {this.modifier = modifier;}/*** 獲取修改日期** @return modifiedtime - 修改日期*/public Date getModifiedtime() {return modifiedtime;}/*** 設置修改日期** @param modifiedtime 修改日期*/public void setModifiedtime(Date modifiedtime) {this.modifiedtime = modifiedtime;}/*** 獲取創建日期** @return creationtime - 創建日期*/public Date getCreationtime() {return creationtime;}/*** 設置創建日期** @param creationtime 創建日期*/public void setCreationtime(Date creationtime) {this.creationtime = creationtime;}/*** 獲取組織** @return id_own_org - 組織*/public String getIdOwnOrg() {return idOwnOrg;}/*** 設置組織** @param idOwnOrg 組織*/public void setIdOwnOrg(String idOwnOrg) {this.idOwnOrg = idOwnOrg;}/*** 獲取員工ID** @return id_employee - 員工ID*/public String getIdEmployee() {return idEmployee;}/*** 設置員工ID** @param idEmployee 員工ID*/public void setIdEmployee(String idEmployee) {this.idEmployee = idEmployee;}/*** @return is_del*/public Byte getIsDel() {return isDel;}/*** @param isDel*/public void setIsDel(Byte isDel) {this.isDel = isDel;}/*** 獲取向導默認開關:0默認關閉,1默認打開** @return is_guide_open - 向導默認開關:0默認關閉,1默認打開*/public Byte getIsGuideOpen() {return isGuideOpen;}/*** 設置向導默認開關:0默認關閉,1默認打開** @param isGuideOpen 向導默認開關:0默認關閉,1默認打開*/public void setIsGuideOpen(Byte isGuideOpen) {this.isGuideOpen = isGuideOpen;}/*** 獲取維小寶用戶ID** @return id_wxb_user - 維小寶用戶ID*/public String getIdWxbUser() {return idWxbUser;}/*** 設置維小寶用戶ID** @param idWxbUser 維小寶用戶ID*/public void setIdWxbUser(String idWxbUser) {this.idWxbUser = idWxbUser;}/*** 獲取維小寶店鋪ID** @return id_wxb_station - 維小寶店鋪ID*/public String getIdWxbStation() {return idWxbStation;}/*** 設置維小寶店鋪ID** @param idWxbStation 維小寶店鋪ID*/public void setIdWxbStation(String idWxbStation) {this.idWxbStation = idWxbStation;}/*** @return openid*/public String getOpenid() {return openid;}/*** @param openid*/public void setOpenid(String openid) {this.openid = openid;}/*** 獲取是否限定PC登錄設備 0 不選中 1 選中** @return limit_mac - 是否限定PC登錄設備 0 不選中 1 選中*/public Byte getLimitMac() {return limitMac;}/*** 設置是否限定PC登錄設備 0 不選中 1 選中** @param limitMac 是否限定PC登錄設備 0 不選中 1 選中*/public void setLimitMac(Byte limitMac) {this.limitMac = limitMac;}} 復制代碼 package com.f6car.base.vo.user;import com.f6car.base.common.Vo;import java.util.Date;import java.math.BigDecimal;/*** Created by qixiaobo on 2017-11-21.*/public class TbUserVo extends Vo {private static final long serialVersionUID = -6920934492324729614L;private String pkId;private String username;private String cellPhone;private String password;private Byte isAdmin;private String idRole;private String idOwnOrg;private String idEmployee;private Byte isDel;private Byte isGuideOpen;private String idWxbUser;private String idWxbStation;private String openid;private Byte limitMac;public void setPkId(String pkId) {this.pkId = pkId;}public String getPkId() {return pkId;}public void setUsername(String username) {this.username = username;}public String getUsername() {return username;}public void setCellPhone(String cellPhone) {this.cellPhone = cellPhone;}public String getCellPhone() {return cellPhone;}public void setPassword(String password) {this.password = password;}public String getPassword() {return password;}public void setIsAdmIn(Byte isAdmin) {this.isAdmin = isAdmin;}public Byte getIsAdmIn() {return isAdmin;}public void setIdRole(String idRole) {this.idRole = idRole;}public String getIdRole() {return idRole;}public void setIdOwnOrg(String idOwnOrg) {this.idOwnOrg = idOwnOrg;}public String getIdOwnOrg() {return idOwnOrg;}public void setIdEmployee(String idEmployee) {this.idEmployee = idEmployee;}public String getIdEmployee() {return idEmployee;}public void setIsDel(Byte isDel) {this.isDel = isDel;}public Byte getIsDel() {return isDel;}public void setIsGuIdeOpen(Byte isGuideOpen) {this.isGuideOpen = isGuideOpen;}public Byte getIsGuIdeOpen() {return isGuideOpen;}public void setIdWxbUser(String idWxbUser) {this.idWxbUser = idWxbUser;}public String getIdWxbUser() {return idWxbUser;}public void setIdWxbStatIon(String idWxbStation) {this.idWxbStation = idWxbStation;}public String getIdWxbStatIon() {return idWxbStation;}public void setOpenid(String openid) {this.openid = openid;}public String getOpenid() {return openid;}public void setLimitMac(Byte limitMac) {this.limitMac = limitMac;}public Byte getLimitMac() {return limitMac;}} 復制代碼 package com.f6car.base.so.user;import com.f6car.base.common.So;/*** Created by qixiaobo on 2017-11-21.*/public class TbUserSo extends So {private static final long serialVersionUID = -6920934492324729614L;} 復制代碼 package com.f6car.base.service.user;import com.f6car.base.vo.user.TbUserVo;import com.f6car.base.so.user.TbUserSo;import com.f6car.base.common.Service;/*** Created by qixiaobo on 2017-11-21.*/public interface TbUserService extends Service<TbUserVo,TbUserSo> {}package com.f6car.base.service.impl.user;import com.f6car.base.dao.user.TbUserMapper;import com.f6car.base.po.user.TbUser;import com.f6car.base.vo.user.TbUserVo;import com.f6car.base.so.user.TbUserSo;import com.f6car.base.service.user.TbUserService;import com.f6car.base.core.AbstractService;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;/*** Created by qixiaobo on 2017-11-21.*/@Service@Transactional(rollbackFor = Exception.class)public class TbUserServiceImpl extends AbstractService<TbUser,TbUserVo,TbUserSo> implements TbUserService {@Resourceprivate TbUserMapper tbUserMapper;} 復制代碼 package com.f6car.base.controller.user;import com.f6car.base.common.Result;import com.f6car.base.common.ResultGenerator;import com.f6car.base.vo.user.TbUserVo;import com.f6car.base.so.user.TbUserSo;import com.f6car.base.service.user.TbUserService;import com.f6car.base.controller.base.AbstractRestController;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import java.io.Serializable;import java.util.List;/*** Created by qixiaobo on 2017-11-21.*/@RestController@RequestMapping("user")public class TbUserController extends AbstractRestController<TbUserVo, TbUserSo> {@Resourceprivate TbUserService tbUserService;}復制代碼

聲明

本代碼基于?https://github.com/lihengming/spring-boot-api-project-seed 改造

感謝這位小伙伴~~~

本人項目?https://github.com/qixiaobo/zeus

總結

以上是生活随笔為你收集整理的基于SpringBoot的CodeGenerator的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产午夜视频在线观看 | 久久久精品网 | 九九综合九九 | 国产人成免费视频 | 免费网站看v片在线a | 成人精品一区二区三区电影免费 | 国产视频首页 | 91在线一区二区 | 久久中文精品视频 | 久久久久久久久久影院 | 国产三级国产精品国产专区50 | 国产成人一区二区三区电影 | 午夜精品一区二区三区免费 | 涩涩网站在线播放 | 色先锋av资源中文字幕 | 成人久久视频 | a√国产免费a | 婷婷精品在线 | 黄色福利视频网站 | 国产精品va在线观看入 | 中文字幕免费高清 | 国产资源在线播放 | 超碰在线免费福利 | 亚洲精品中文在线观看 | 激情综合一区 | 99热精品在线 | 日韩91在线| 色噜噜狠狠狠狠色综合久不 | 国精产品一二三线999 | 免费情趣视频 | 欧美激情视频在线免费观看 | 色欧美日韩 | 麻花豆传媒mv在线观看 | 久久电影国产免费久久电影 | 久久情侣偷拍 | 国产在线观看你懂得 | 日韩成人高清在线 | 黄网站免费大全入口 | 一级黄色在线视频 | 午夜视频免费在线观看 | 欧美日韩性视频 | 国产精品福利久久久 | 在线视频99 | 久久久2o19精品 | 久久激五月天综合精品 | 美女视频免费精品 | 欧美做受69 | 18久久久| 中文字幕免费观看全部电影 | 国产区在线看 | 欧美中文字幕久久 | 在线视频观看成人 | 韩国视频一区二区三区 | 日韩免费一二三区 | 天天综合在线观看 | 久久久影视 | 成人在线播放网站 | 亚洲综合视频在线 | 香蕉影视| 国产精品原创av片国产免费 | 国产在线中文 | 日韩电影在线观看一区二区三区 | 91系列在线 | 久草在线视频首页 | 亚洲成av人片 | 在线视频日韩 | 久久爱导航 | 国产最新在线视频 | 成人久久18免费 | 久久综合色一综合色88 | 天天干天天操人体 | 亚洲日韩欧美一区二区在线 | 国产精品中文字幕av | 成人黄色电影在线播放 | 国产精品观看在线亚洲人成网 | 免费色视频网址 | 一本色道久久综合亚洲二区三区 | 亚洲91av | 在线精品观看国产 | 国产人在线成免费视频 | 欧美成人h版 | www.天天操| 日韩在线视频播放 | 日本最新中文字幕 | 日本久久久精品视频 | 国产小视频精品 | 久久国产精品二国产精品中国洋人 | 日韩精品在线免费播放 | av免费播放 | 欧美一区二区三区不卡 | 色在线视频 | 精品国产精品久久 | 午夜精品一区二区三区可下载 | 99情趣网视频 | 中文字幕在线观看免费高清完整版 | 97国产精品亚洲精品 | 四虎国产精品免费 | 久久久久久国产精品亚洲78 | 亚洲精品乱码久久久久久蜜桃91 | 欧美黑人性爽 | 91精品国产一区二区三区 | 久久久久国产一区二区三区 | 国产午夜小视频 | 亚洲久草在线 | 欧美日韩一区二区视频在线观看 | 日韩av电影网站在线观看 | 夜夜澡人模人人添人人看 | 日日夜夜人人天天 | 久产久精国产品 | 精品久久久免费 | 国产精品情侣视频 | 国产精品精品国产婷婷这里av | 久草视频在线播放 | www178ccom视频在线 | 国产福利小视频在线 | 亚洲网站在线看 | 成年在线观看 | 美女视频免费精品 | 国产伦精品一区二区三区免费 | 五月婷亚洲 | 在线视频app| 国内久久看| 亚洲春色综合另类校园电影 | 日日夜夜精品免费观看 | 国产高清视频免费观看 | 成人av一区二区三区 | 国产精品久久电影网 | 91亚洲欧美 | 久久免费国产 | 免费欧美高清视频 | 国产精品久久久久久久免费大片 | 欧美精品在线观看 | 美女黄视频免费看 | 91av电影在线 | 青青草国产免费 | 国产视频一区二区三区在线 | 免费观看成人网 | 最新av网址在线观看 | 在线观看91| 日韩欧美精品在线视频 | 欧洲一区精品 | 精品久久1 | 亚洲天天综合网 | 视频在线日韩 | 成年人视频在线免费 | 国色天香永久免费 | 国产精品久久久久999 | 麻豆传媒在线视频 | 久久久综合香蕉尹人综合网 | 亚洲国产成人在线播放 | 国产精品欧美久久久久无广告 | 99精品视频播放 | 美女久久 | 免费在线观看av不卡 | 免费日韩一区二区三区 | 日韩中文字幕在线观看 | 激情综合网五月 | 亚洲精品在线一区二区 | 一本一道久久a久久精品 | 99成人在线视频 | 久久永久免费视频 | 国产精品久久99综合免费观看尤物 | 成年人在线免费看视频 | av在线免费在线观看 | 欧美精品亚州精品 | 成人av电影免费在线观看 | 久久蜜臀av | 日本三级久久久 | 99re在线视频观看 | 国产美女免费观看 | 美女在线免费观看视频 | 色视频在线观看 | 欧美久久影院 | 伊人五月婷 | 国产手机在线 | 欧美激情视频三区 | 91视频-88av| 97精品伊人| 久操视频在线观看 | 全黄色一级片 | 精品视频一区在线观看 | 91精品视频一区 | 欧美日韩视频网站 | 黄色大全免费观看 | 黄色中文字幕 | 久久婷婷开心 | 欧美色图p| 国产精品久久久久久久久久直播 | 亚洲另类人人澡 | 天天操网站 | 国产国产人免费人成免费视频 | 日韩手机在线观看 | 日韩区欠美精品av视频 | 伊人久久在线观看 | 狠狠色丁香婷婷综合最新地址 | 91免费黄视频 | 99久久精品国产网站 | 亚洲精品在线资源 | 国产视频1 | 黄色一级在线免费观看 | 日韩v在线91成人自拍 | 日韩理论片在线观看 | 一级电影免费在线观看 | 日本高清免费中文字幕 | 国模一区二区三区四区 | 久久久久久97三级 | 九九国产精品视频 | 国产最新福利 | 97超碰精品 | 成人免费91 | 人人精品 | 日韩av午夜在线观看 | 免费成人在线观看 | 97在线成人 | 成年美女黄网站色大片免费看 | 中文字幕国产精品一区二区 | 中文字幕日本特黄aa毛片 | 亚洲激情久久 | 人人澡人人模 | 国产精品久久久久久久久久久久午夜 | 欧美日韩不卡在线 | 免费黄色av片| 国产成视频在线观看 | 天天狠狠操| 国产成本人视频在线观看 | 911免费视频 | 久久电影日韩 | 中文字幕一区二区三区久久蜜桃 | av不卡免费在线观看 | 精品国产成人av在线免 | 午夜久久久久久久久 | 久久精品美女视频 | 久久免费看av | 91黄视频在线观看 | 天天干,天天射,天天操,天天摸 | 在线性视频日韩欧美 | 久久午夜色播影院免费高清 | 亚洲男模gay裸体gay | 久久精品99久久久久久 | 青青草久草在线 | 日本黄色免费大片 | 日韩中文字幕免费视频 | 9999免费视频 | 久久免费视频在线观看 | 五月婷婷在线视频 | 久久精品5| 中文字幕在线日亚洲9 | 国内精品久久天天躁人人爽 | 欧美日韩免费视频 | 一区二区三区中文字幕在线 | 狠狠操欧美| 久久成人18免费网站 | 成人久久影院 | 精品一区二区在线观看 | 日韩在线视频在线观看 | 在线观看视频一区二区三区 | www.国产精品 | 亚洲最新av在线网址 | 久色小说 | 一区二区三区影院 | 日韩精品久久中文字幕 | 亚洲精品国产欧美在线观看 | 美腿丝袜av| 成人精品久久 | 久久久久成人精品亚洲国产 | 亚洲精品毛片一级91精品 | 国产一区免费看 | 狠狠色丁香婷婷 | 日韩在线 一区二区 | 色综合www | 丁香在线 | 日韩精品中文字幕久久臀 | 久久久综合电影 | 国产高清福利在线 | 国产在线日本 | 久久久久电影网站 | 色婷婷综合激情 | 国产一区二区在线免费视频 | 日韩一区二区三区不卡 | 亚洲成av人片在线观看www | 免费a网址 | 91亚洲精品乱码久久久久久蜜桃 | 日韩免费电影网站 | 久久久久久久久毛片精品 | 99视频偷窥在线精品国自产拍 | 麻豆免费看片 | 久久三级视频 | 色网站中文字幕 | 在线网站黄 | 伊人婷婷综合 | 99精品视频在线播放观看 | 最近中文字幕免费视频 | 夜夜夜夜操| 欧美专区国产专区 | 天天操天天玩 | 亚洲精品在线国产 | 国产精选在线 | 天天综合区 | 日日爽天天操 | 亚洲在线黄色 | 色吊丝av中文字幕 | 免费观看性生活大片3 | 一区二精品 | 激情久久五月 | 五月天国产精品 | 国产精品手机视频 | 国产精品久久久久久久久久新婚 | 免费中文字幕视频 | 日韩在线观看视频一区二区三区 | 97国产电影 | 国产一区观看 | 欧美综合国产 | 一区二区中文字幕在线 | 久久精品99国产国产 | 天天操天天干天天摸 | 噜噜色官网 | 国产涩涩在线观看 | 欧美日韩一区二区在线观看 | 国产成人av在线 | 亚洲欧美国产精品va在线观看 | 九九免费精品 | 亚洲精品资源在线观看 | 天天干中文字幕 | 不卡的av电影在线观看 | av黄色在线观看 | 就色干综合 | 91精品推荐 | 国色天香在线观看 | 波多野结衣精品 | 国产精品igao视频网入口 | 免费日韩 精品中文字幕视频在线 | 国内精品久久久久久久久久久 | 久久久精品国产免费观看同学 | 国产成人三级在线观看 | 精品久久一区 | 久久99精品久久久久久 | 亚洲国产美女精品久久久久∴ | 久久久久久久免费观看 | www五月婷婷| 亚洲国产成人高清精品 | 国内精品亚洲 | 国产群p | av在线影视 | 免费观看一级 | 日本久久久久久 | 免费亚洲黄色 | 亚洲h色精品 | 日日操日日插 | 免费视频你懂得 | 免费合欢视频成人app | 麻豆视频免费版 | 韩国av免费在线观看 | 亚洲国产理论片 | 天天操天天干天天操天天干 | 又色又爽又激情的59视频 | 亚洲欧洲成人精品av97 | 成人黄色电影在线观看 | 亚洲在线网址 | 成人禁用看黄a在线 | 婷婷激情5月天 | 久久xxxx | 久久国产精品电影 | 免费在线观看成年人视频 | 成人影音av| 9992tv成人免费看片 | 91精品久久久久 | 成人a视频| 在线观看成人小视频 | 久久免费视频国产 | 8x成人在线 | 国产成人精品一区二 | 国产在线视频资源 | 亚洲乱码精品久久久久 | 亚洲 欧洲 国产 精品 | 国内精品久久久精品电影院 | 人人看看人人 | 婷婷成人综合 | 五月综合激情婷婷 | 亚洲午夜久久久久久久久电影网 | 韩国精品视频在线观看 | 欧美性色综合网站 | 国产精品理论片在线观看 | 日日干激情五月 | 日本在线成人 | 亚洲精品一区二区三区在线观看 | 国产一级做a | 欧美成人精品在线 | 中文字幕一区二区三区四区 | 久久久久综合 | 不卡av在线 | 国产精品 中文在线 | 天天色天天 | 国产不卡在线看 | 精品国产三级 | 精品国产一区二区三区日日嗨 | 最近高清中文在线字幕在线观看 | 精品久久久久久久久久久久久久久久久久 | 久久av在线 | 国产精品视频免费看 | 久久er99热精品一区二区 | 欧美精品中文字幕亚洲专区 | 日本在线观看一区二区三区 | 成年人看片网站 | 人人dvd | 久久丁香| 久久99精品国产99久久6尤 | 97成人超碰 | 中文字幕乱码电影 | 精品产品国产在线不卡 | 国内精品免费久久影院 | 免费av高清 | 成人在线视频观看 | 成人免费91 | 国产色秀视频 | 四虎成人精品永久免费av | 亚洲伊人天堂 | 精品在线二区 | 国产在线精品一区 | 热久精品 | 五月精品 | 日韩一区二区免费播放 | 国产精彩在线视频 | 97超碰成人在线 | 国产123av| www.在线看片.com| 一区二区精品在线 | 欧美精品乱码99久久影院 | 日韩综合一区二区三区 | 五月综合色 | 精品国产日本 | 91福利视频免费 | 国产精品乱码在线 | 欧美日韩天堂 | 国产又粗又猛又爽又黄的视频先 | 粉嫩aⅴ一区二区三区 | 精品国产一区二区三区蜜臀 | 欧美国产日韩一区二区 | 日日干夜夜爱 | 久久中文欧美 | 99热这里只有精品国产首页 | 中文网丁香综合网 | 精品国产亚洲日本 | 久久精品人人做人人综合老师 | 日韩在线电影 | 日韩免费小视频 | 欧美电影黄色 | 成人午夜电影久久影院 | 中文字幕在线观看日本 | 婷婷 综合 色 | 日韩理论在线视频 | 四虎永久国产精品 | 成人黄色片免费 | 国产aaa免费视频 | 国产精品久久久久久久久久99 | 亚洲精品在线视频网站 | 午夜三级福利 | 久久首页 | 精品a在线 | 亚洲成人999 | 在线观看中文字幕一区二区 | 午夜精品久久久99热福利 | 久久在线视频在线 | 成人h动漫在线看 | 很黄很色很污的网站 | 免费日韩一级片 | 99婷婷| 亚洲在线免费视频 | 日韩影视精品 | 精品xxx| 欧美色图另类 | 天天操综合网 | 久久不射电影网 | 国产精品久久久777 成人手机在线视频 | 激情欧美一区二区三区 | 美女黄频 | 国产精品美女网站 | 国产在线日韩 | 国产群p | 视频二区在线 | 最近中文字幕mv | 日韩网站在线看片你懂的 | 亚洲天堂激情 | 99国产精品久久久久久久久久 | 国产精品自拍在线 | 综合在线亚洲 | 天天操 夜夜操 | 日韩影视大全 | 97超碰国产精品女人人人爽 | 久草免费在线观看 | av福利免费| 六月色播 | 天天干夜夜操视频 | 午夜av影院 | 91chinesexxx| 中文电影网 | 亚洲人在线7777777精品 | 91视频久久久久 | 97人人爽 | 99久久久国产精品免费观看 | 国产成人精品一区二区三区福利 | 91福利视频网站 | 日韩精品视频免费专区在线播放 | 色就色,综合激情 | av大片免费| 免费三级大片 | 91伊人久久大香线蕉蜜芽人口 | 国产福利91精品一区二区三区 | 久久99精品国产 | 在线看v片 | 久草在线资源免费 | 美女久久久久久久久久 | av7777777| 在线观看av国产 | 欧美在线1 | 一本一本久久a久久精品综合小说 | 啪啪免费试看 | 色网站中文字幕 | 日韩专区在线播放 | 成人免费视频视频在线观看 免费 | av网站播放| 成年人app网址 | 九九国产视频 | 国产美腿白丝袜足在线av | 国产日韩视频在线 | 国产小视频在线播放 | 亚洲精品高清一区二区三区四区 | 国产一区二区精 | 免费a视频在线观看 | 亚洲欧美视频 | 69av网| 精品中文字幕在线 | www久久久久| 国产精品一区二区免费视频 | a久久免费视频 | 日韩视频欧美视频 | av资源网在线播放 | 久久精品视频在线播放 | 最新中文字幕视频 | 国产成人精品一区二区三区在线 | 在线免费观看黄网站 | 狠狠色狠狠色综合日日小说 | 成人毛片在线观看 | 国产精品久久久久久久久久久久冷 | 久久综合色天天久久综合图片 | 97免费在线观看视频 | 国产免费视频在线 | 天天艹日日干 | 九九免费在线观看 | 亚洲人成精品久久久久 | 亚洲精品国偷拍自产在线观看蜜桃 | 中文字幕一区二区三区视频 | 国产成人99久久亚洲综合精品 | 中午字幕在线 | 国产精品美女999 | 精品国产视频一区 | 精品a级片 | 欧美日一级片 | 亚洲高清视频在线观看免费 | 精品黄色在线观看 | 免费看黄20分钟 | www.神马久久 | 五月婷婷视频在线 | 99视频在线精品免费观看2 | 久久精品2| 亚洲精品中文字幕视频 | 久久永久视频 | 美女网站视频色 | 伊人久久在线观看 | 免费黄色在线网站 | 精品久久九九 | 欧美巨乳网 | 婷婷5月色 | 国产一级二级av | 最近中文字幕国语免费av | 久久在线精品视频 | 91精品啪在线观看国产81旧版 | 三级黄色大片在线观看 | 亚洲精品字幕在线观看 | 极品久久久久 | av导航福利 | 香蕉色综合 | 深夜成人av | 日韩在线观看视频中文字幕 | 91自拍视频在线 | 欧美精品在线观看免费 | 91传媒91久久久 | 亚洲天堂色婷婷 | 99热在线免费观看 | 丝袜av网站 | 欧美日韩国产精品一区二区亚洲 | 国产亚洲日本 | 麻豆一区二区三区视频 | 国产 欧美 日本 | 天天爱天天色 | 成人免费在线电影 | www.久久成人 | 久久久国产日韩 | 午夜久久久久 | 国产精品成人国产乱 | 日韩一区精品 | 77国产精品 | 91精品国| 欧美亚洲免费在线一区 | 欧美日韩69 | 国产淫a| 五月婷婷激情五月 | 又大又硬又黄又爽视频在线观看 | 欧美日韩中文国产一区发布 | 国产精品久久久av久久久 | 国内免费久久久久久久久久久 | 亚洲精色| 免费日韩 精品中文字幕视频在线 | 深夜国产在线 | 久久a久久| 久久久久久久精 | 五月婷婷av在线 | 久久九九久久精品 | 欧美一级电影片 | 久久久精品日本 | 国内免费的中文字幕 | 日本公妇在线观看 | 欧美怡红院视频 | 激情av网| 欧美另类一二三四区 | 在线观看中文字幕dvd播放 | 69国产精品视频免费观看 | 欧美精品成人在线 | 免费在线91 | 国产成年免费视频 | www免费看片com | 伊人五月在线 | 日韩二区三区在线 | 欧美不卡在线 | 精品一区二区三区四区在线 | 五月综合在线观看 | 色国产视频 | 久久69精品久久久久久久电影好 | 欧美三人交 | 午夜黄色大片 | 国产无套精品久久久久久 | 国产成人三级三级三级97 | 国产欧美中文字幕 | 亚洲视频网站在线观看 | 三上悠亚一区二区在线观看 | 国产精品午夜av | 国产精品不卡av | 又粗又长又大又爽又黄少妇毛片 | 黄色avwww | 狠狠操影视 | 99热 精品在线| 免费能看的黄色片 | 97在线观看免费观看 | 日韩欧美视频 | 在线观看一区二区精品 | 久久a热6 | 97色在线| 久久久久久久久久久免费视频 | 日韩r级在线 | 午夜久久久久久久久久影院 | 狠狠色噜噜狠狠狠合久 | 99视频99 | 成人午夜片av在线看 | 在线免费黄色av | 亚洲美女精品视频 | 久久精品一区二区三区四区 | 日日夜夜免费精品 | 免费三级黄色 | 亚洲jizzjizz日本少妇 | 在线观看亚洲国产精品 | 热久久99这里有精品 | 国产欧美精品xxxx另类 | 日女人电影 | 日韩精品欧美一区 | 亚洲高清免费在线 | 成人超碰97 | 四虎成人免费影院 | 国内久久看 | 精品国产1区| 欧美激情视频在线观看免费 | 国产一区二区在线观看视频 | 黄色免费网站大全 | 丁香婷婷色月天 | 人人狠狠综合久久亚洲 | 免费在线观看av网址 | 日免费视频 | 欧美日韩一级在线 | 日韩av三区 | 最新日韩中文字幕 | 九九激情视频 | 激情五月综合网 | 日韩精品一区二区免费 | 日韩久久久久 | 国产韩国日本高清视频 | 去干成人网 | 日日爱夜夜爱 | 丁香六月在线 | a国产精品 | 成人毛片a | 国产精品激情偷乱一区二区∴ | 精品视频久久久久久 | 精品嫩模福利一区二区蜜臀 | 91久久在线观看 | 欧美日韩在线观看一区二区 | 激情电影在线观看 | 欧美极品在线播放 | 精品久久久成人 | 久久久久女教师免费一区 | 久久久精品 一区二区三区 国产99视频在线观看 | 欧美另类v| 亚洲黄色在线观看 | 日韩网站在线免费观看 | 美女久久网站 | av在线播放中文字幕 | 在线免费视 | 91九色在线观看视频 | 亚洲精品1区2区3区 超碰成人网 | 亚洲国产网站 | 日韩理论视频 | 成人福利在线观看 | 天天爽夜夜操 | 成人精品国产 | 日韩欧美在线视频一区二区 | www最近高清中文国语在线观看 | 亚洲精品xxx| 国产色道 | 激情欧美在线观看 | www.亚洲黄 | 2023av在线 | 91在线你懂的 | 久草免费新视频 | 久久国产精品99久久久久 | 成年人电影毛片 | 97电影院在线观看 | 四虎成人网 | 蜜臀aⅴ国产精品久久久国产 | 亚洲色图美腿丝袜 | www五月 | 午夜精品电影 | 免费av网址在线观看 | 天天爽人人爽夜夜爽 | 国产字幕av | 国产精品区一区 | 免费黄色特级片 | 日本精品xxxx | 国产精品 中文在线 | 97自拍超碰 | 国产又黄又爽无遮挡 | 国产中文视频 | 精品亚洲一区二区 | 最近中文国产在线视频 | 久久久毛片 | 婷婷综合视频 | 黄色一级大片在线免费看国产一 | 一区二区三区在线电影 | 成人丝袜 | 在线观看成人 | 日韩| 国产97色在线 | 欧美精品久久久久久久 | 日本婷婷色 | 国产精品久久久久久久久久 | 国产成人一级 | 91精品国产成人 | 黄色毛片观看 | 久久国内精品视频 | 免费视频二区 | 97综合网| 久久精品国产亚洲精品 | 天天色婷婷 | 9999在线观看 | 欧美成人视 | 欧美精品乱码久久久久久 | 天天鲁一鲁摸一摸爽一爽 | 久久99国产视频 | 成人av教育 | 在线免费观看黄色大片 | 日p视频 | 国产成人免费观看 | 在线看岛国av | 久久久久激情视频 | 911久久 | 久久一级电影 | 一区在线观看 | 国产一区二区三区视频在线 | 国产不卡av在线 | 麻豆手机在线 | 欧美日韩视频一区二区三区 | 久久99久久精品国产 | 一本一道久久a久久精品蜜桃 | 欧美另类sm图片 | 日韩色在线观看 | 一区二区三区高清在线观看 | 美女国产免费 | 国产精品久久久久久久久久免费看 | 国产成人av网站 | 国产视频在线免费观看 | 日韩电影在线一区二区 | 日韩一级电影在线观看 | 成人免费观看完整版电影 | 日韩精品久久久久久久电影99爱 | www.久久99 | 亚洲女裸体 | 毛片黄色一级 | 天堂久久电影网 | 一区二区三区免费在线播放 | 成年人黄色av | 美女一二三区 | 麻豆一精品传二传媒短视频 | 国产涩涩网站 | 亚洲最大激情中文字幕 | 中文字幕精品一区二区三区电影 | 黄色免费高清视频 | 欧美日韩亚洲在线观看 | 亚洲视屏 | 国产一区二区三区高清播放 | 欧美激情一区不卡 | 99久久精品国产免费看不卡 | 成人在线视频你懂的 | 免费av片在线 | 亚洲精品久久激情国产片 | 色www精品视频在线观看 | 精品久久久久久亚洲综合网 | 99久久这里有精品 | 国产99中文字幕 | 天天操夜夜拍 | 久久成人亚洲欧美电影 | 最近中文字幕视频网 | 在线观看中文字幕 | 色综合色综合色综合 | 99久热在线精品视频成人一区 | 国产精品免费一区二区三区在线观看 | 亚洲精品久久久久久久蜜桃 | 国产精品一区二区麻豆 | 久久er99热精品一区二区 | 成人av高清| 国产美女免费视频 | 最新av在线免费观看 | 在线免费观看的av网站 | 国产精品久久久久久久久久免费 | 91精品免费在线观看 | 在线播放亚洲 | 日韩在线国产精品 | 成人免费一区二区三区在线观看 | a极黄色片 | 丁香综合av| 欧美一级特黄aaaaaa大片在线观看 | 成人九九视频 | 日本精品视频在线观看 | 97av影院 | 久久在线精品视频 | 69国产精品成人在线播放 | 人人干天天干 | 精品九九九 | 九九综合久久 | 三上悠亚在线免费 | 国产999视频在线观看 | 国产免费视频一区二区裸体 | 久久免费片 | 88av色 | 成人欧美一区二区三区在线观看 | 激情伊人五月天 | 亚洲三级精品 | 黄色看片 | 亚洲成人欧美 | 九九热免费在线观看 | 国产精品v欧美精品v日韩 | 成人中文字幕av | 中文乱码视频在线观看 | 午夜影视一区 | 婷婷丁香九月 | a级国产乱理论片在线观看 伊人宗合网 | 狠狠狠狠狠狠 | 69av视频在线| 国际精品久久 | 韩国av免费观看 | 国产剧情一区二区 | 亚洲精品一区中文字幕乱码 | 92av视频 | 黄色小网站在线观看 | 国产成人精品a | 美女视频黄频大全免费 | 黄色av高清 | 亚洲电影自拍 | 中文字幕色婷婷在线视频 | 日日色综合 | 色婷婷av国产精品 | 国产成人久久精品77777综合 | 国产女人18毛片水真多18精品 | 亚洲成av人影片在线观看 | 狠狠色狠狠综合久久 | 久久久久久不卡 | 91资源在线视频 | 成年人精品 | 在线视频日韩欧美 | 国产自偷自拍 | 国产99久久久国产精品免费看 | 在线观看黄网站 | 亚洲 欧美日韩 国产 中文 | 91av手机在线观看 | 五月婷婷综 | 黄色小说视频网站 | 9999在线视频| 亚洲精品一区二区三区新线路 | 免费国产在线视频 | 成全在线视频免费观看 | 97色在线视频 | 成片免费 | 天天爱天天射天天干天天 | av大全在线免费观看 | 午夜久久视频 | 狠狠干免费 | 黄色小说免费在线观看 | 久久久久久免费 | 午夜视频不卡 | 精品一区 在线 | 激情视频91| 久久黄视频 | 三级动图 | 成人蜜桃 | 丁香婷婷久久久综合精品国产 | 国产精品永久久久久久久www | 操操色| 天堂网一区二区三区 | 亚洲人成在线观看 | 欧美精品在线观看一区 | 中文字幕久久网 | 韩日电影在线观看 | 欧美精品三级在线观看 | 在线观看av大片 | 日日爽天天操 | 中文字幕国语官网在线视频 | 色婷婷电影 | 国产区精品在线 | 免费a视频在线 | 天天色官网 | 欧美天天综合网 | 日韩在线色视频 | 69久久夜色精品国产69 | 国产手机视频在线观看 | 激情综合啪 | 久久精美视频 | 日韩专区在线 | 成人免费在线网 | 天天干天天拍 | 日韩电影在线观看一区二区 | 狠狠狠色丁香综合久久天下网 | 欧美极品久久 | 国产美腿白丝袜足在线av | 亚洲激情视频 | 免费人人干 | 天天干天天干天天 | 丁香五月网久久综合 | 亚洲影视资源 | 五月天激情综合 | 久久亚洲二区 | 欧美日韩国产精品一区二区三区 | 国产色资源 | 天天爽天天摸 | 亚洲码国产日韩欧美高潮在线播放 | 久久精品91久久久久久再现 | 日韩色在线 | 亚洲国产欧美在线人成大黄瓜 | 99久久99久久精品国产片果冰 | 黄色资源网站 | 亚洲精品高清在线 | 久久久一本精品99久久精品66 | 人人舔人人舔 | 欧美analxxxx| 丁香花在线观看视频在线 | 欧美日韩1区 | 国产在线视频导航 | 最新中文字幕在线观看视频 | 99久久这里有精品 | av亚洲产国偷v产偷v自拍小说 | 天天综合亚洲 | 日韩久久精品一区二区 | 中文字幕精品三区 | 亚洲首页 | 欧美一区二区在线看 | 欧美视频18 | 亚洲精品国产精品国自产观看 | 欧美福利片在线观看 | 91麻豆精品 | 亚洲国产成人精品在线 | 欧洲精品码一区二区三区免费看 | 少妇搡bbbb搡bbb搡aa | 国产在线观看91 | 狠狠色2019综合网 | 香蕉在线观看视频 | 日韩美女高潮 | 亚洲精品国产欧美在线观看 | www.黄色 | 国产又粗又猛又色 | 亚洲免费在线看 | 日韩精品一区二区三区视频播放 | av国产在线观看 | 亚洲激情一区二区三区 | 国产亚洲资源 |