国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

快速生成通用接口業(yè)務(wù)配置

這篇具有很好參考價(jià)值的文章主要介紹了快速生成通用接口業(yè)務(wù)配置。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

這個(gè)是干什么的?

簡(jiǎn)單介紹下:

作用:通過(guò)插件一鍵生成某個(gè)表對(duì)應(yīng)的增刪改查等基礎(chǔ)或者說(shuō)通用接口,這里面的代碼是基礎(chǔ)版的,后續(xù)改良后,很多業(yè)務(wù)的通用功能,比如流程的啟動(dòng),自動(dòng)下一步,通用導(dǎo)出,通用導(dǎo)入等等。

原理:核心就是BasicControllerPostProcessor ,通過(guò)動(dòng)態(tài)生成代理對(duì)象,完成邏輯實(shí)現(xiàn)。這里呢經(jīng)過(guò)實(shí)踐呢后續(xù)也有不少優(yōu)化的,后續(xù)我總結(jié)后發(fā)一個(gè)新版的

一、核心處理類

package com.nari.core.handler;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Map;


/**
* 動(dòng)態(tài)加載baseMapper,baseDao,baseService
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永勝</a>
* @version 1.0.0
* @since 2021/3/2
*/

@Slf4j
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class BasicControllerPostProcessor extends CommonAnnotationBeanPostProcessor {

private static final long serialVersionUID = -945664767382485314L;

@SuppressWarnings("NullableProblems")
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
String packageName = beanClass.getPackage().getName();
log.trace("beanName---{},packageName:{}", beanName, packageName);
List<String> per = ListUtil.of("com.nari.supervision.daily");
List<String> tail = ListUtil.of("outbound","personal");
if (per.stream().anyMatch(packageName::contains)) {
if (tail.stream().map(v -> v + ".controller").anyMatch(packageName::contains)) {
try {
updateResourceName(beanClass, beanName, "basicService", "Controller", "Service");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
if (tail.stream().map(v -> v + ".service").anyMatch(packageName::contains)) {
try {
updateResourceName(beanClass, beanName, "basicMapper", "Service", "TransformImpl");
updateResourceName(beanClass, beanName, "basicDao", "Service", "Mapper");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
if (tail.stream().map(v -> v + "serviceImpl").anyMatch(packageName::contains)) {
try {
updateResourceName(beanClass, beanName, "basicMapper", "Service", "TransformImpl");
updateResourceName(beanClass, beanName, "basicDao", "Service", "Mapper");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
return null;
}

private void updateResourceName(Class<?> beanClass, String beanName, String destField, String searchString, String replaceString)
throws NoSuchFieldException, IllegalAccessException
{
Field field = beanClass.getSuperclass().getDeclaredField(destField);
Resource basicMapper = field.getAnnotation(Resource.class);
InvocationHandler invocationHandler = Proxy.getInvocationHandler(basicMapper);
Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
memberValues.setAccessible(true);
//noinspection unchecked
Map<String, Object> map = (Map<String, Object>) memberValues.get(invocationHandler);
map.put("name", StringUtils.replace(beanName, searchString, replaceString));
}
}

二、基礎(chǔ)類

BasicController

package com.nari.core.basic;

import com.nari.core.annotation.OperationLog;
import com.nari.core.groups.basic.InsertGroup;
import com.nari.core.groups.basic.UpdateGroup;
import com.nari.core.groups.query.PageQueryGroup;
import com.nari.core.web.ApiResult;
import com.nari.core.web.BaseParam;
import com.nari.core.web.PageResult;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiSort;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

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


/**
* 基礎(chǔ)接口管理
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永勝</a>
* @version 1.0.0
* @since 2021/3/1
*/

@Slf4j
@Valid
public class BasicController<T extends BasicModel, Q extends BaseParam, V, D, M extends BasicMapper<T, Q, D, V>> extends com.nari.core.web.BaseController {

@Resource
private BasicService<T, Q, V, D, M> basicService;

/**
* 添加
*
* @param query {@link Q}
*/

@PostMapping
@ApiOperation(value = "1.1 添加")
@OperationLog(value = "添加")
@Validated(value = InsertGroup.class)
public ApiResult insert(@RequestBody Q query)
{
basicService.insert(query);
return success("添加成功!");
}


/**
* 根據(jù)id刪除
*
* @param id 主鍵
*/

@DeleteMapping("/{id}")
@ApiOperation(value = "1.2 根據(jù)id刪除")
@OperationLog(value = "根據(jù)id刪除")
public ApiResult del(@PathVariable("id") String id) {
basicService.del(id);
return success("刪除成功!");
}

/**
* 根據(jù)id刪除-軟刪除,實(shí)際修改標(biāo)識(shí)符
*
* @param id 主鍵
*/

@DeleteMapping("/{id}/weak")
@ApiOperation(value = "1.3 根據(jù)id刪除-軟刪除,實(shí)際修改標(biāo)識(shí)符")
@OperationLog(value = "根據(jù)id刪除-軟刪除,實(shí)際修改標(biāo)識(shí)符")
public ApiResult delWeak(@PathVariable("id") String id) {
basicService.delWeak(id);
return success("刪除成功!");
}


/**
* 根據(jù)id更新信息
*
* @param query {@link Q}
*/

@PutMapping("update")
@ApiOperation(value = "1.4 根據(jù)id更新信息")
@OperationLog(value = "根據(jù)id更新信息")
@Validated(value = UpdateGroup.class)
public ApiResult<V> update(@RequestBody Q query)
{
return success(basicService.update(query));
}

/**
* 根據(jù)id更新信息-批量
*
* @param query {@link Q}
*/

@PutMapping("updateBatch")
@ApiOperation(value = "1.5 根據(jù)id更新信息-批量")
@OperationLog(value = "根據(jù)id更新信息-批量")
@Validated(value = UpdateGroup.class)
public ApiResult updateBatch(@RequestBody List<Q> query)
{
basicService.updateBatch(query);
return success();
}


/**
* 查詢單個(gè)數(shù)據(jù)
*
* @param id 主鍵
*/

@GetMapping("/{id}")
@ApiOperation(value = "1.6 查詢單個(gè)數(shù)據(jù)")
@OperationLog(value = "查詢單個(gè)數(shù)據(jù)")
public ApiResult<V> select(@PathVariable("id") String id) {
return success(basicService.select(id));
}

/**
* 分頁(yè)
*
* @param query {@link Q}
*/

@GetMapping("page")
@ApiOperation(value = "1.7 分頁(yè)")
@OperationLog(value = "分頁(yè)")
@Validated(value = PageQueryGroup.class)
public ApiResult<PageResult<V>> listUser(Q query)
{
return success(basicService.page(query));
}
}

BasicDao

package com.nari.core.basic;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nari.core.web.BaseParam;
import com.nari.core.web.PageParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
* 基礎(chǔ)接口
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永勝</a>
* @version 1.0.0
* @since 2021/3/1
*/

public interface BasicDao<T extends BasicModel, D, Q extends BaseParam> extends BaseMapper<T> {
List<D> selectPageRel(@Param("page") PageParam<D, Q> page, @Param("param") Q param);
}

BasicEnum

package com.nari.core.basic;


/**
* 基礎(chǔ)枚舉
* 主要用來(lái)配合apijson實(shí)現(xiàn)枚舉展示
*
* @author <a href="mailto:17602556550@189.cn">朱永勝</a>
* @version 1.0.0
* @since 2023/5/25
*/

public interface BasicEnum {
String getName();

Integer getValue();
}

BasicMapper

package com.nari.core.basic;

import org.mapstruct.MappingTarget;

import java.util.List;


/**
* 基礎(chǔ)轉(zhuǎn)換
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永勝</a>
* @version 1.0.0
* @since 2021/3/1
*/

public interface BasicMapper<T, Q, D, V> {
T query2do(Q query);

V dto2View(D dto);

D do2dto(T role);

void update(Q query, @MappingTarget T t);

List<V> dto2ViewPage(List<D> dto);
}

BasicModel

package com.nari.core.basic;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
* 通用模型
*
* @author <a href="mailto:17602556550@189.cn">朱永勝</a>
* @version 1.0.0
* @since 2023/5/26
*/

@Data
public class BasicModel {
/**
* 主鍵
*/

private String id;

/**
* 刪除標(biāo)識(shí)
*/

@ApiModelProperty(value = "刪除標(biāo)識(shí)")
private String deleted;
}

BasicService

package com.nari.core.basic;

import cn.hutool.core.util.IdUtil;
import com.nari.core.web.BaseParam;
import com.nari.core.web.PageParam;
import com.nari.core.web.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;


/**
* 基礎(chǔ)服務(wù)
*
* @author <a href="mailto:njpkhuan@gmail.com">朱永勝</a>
* @version 1.0.0
* @since 2021/3/1
*/

@Slf4j
public class BasicService<T extends BasicModel, Q extends BaseParam, V, D, M extends BasicMapper<T, Q, D, V>> {
@Resource
private BasicDao<T, D, Q> basicDao;

@Resource
private BasicMapper<T, Q, D, V> basicMapper;

/**
* 添加
*
* @param query {@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永勝</a >
* @since 2021/3/1
* @since 1.0.0
*/

@Transactional(rollbackFor = Exception.class)
public void insert(@Valid Q query)
{
T t = basicMapper.query2do(query);
t.setId(IdUtil.simpleUUID());
basicDao.insert(t);
}

/**
* 刪除
*
* @param id {@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永勝</a >
* @since 2021/3/1
* @since 1.0.0
*/

@Transactional(rollbackFor = Exception.class)
public void del(@NotNull String id)
{
basicDao.deleteById(id);
}

/**
* 根據(jù)用戶id更新
*
* @param query @{@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永勝</a >
* @since 2021/3/1
* @since 1.0.0
*/

@Transactional(rollbackFor = Exception.class)
public V update(@Valid Q query)
{
T data = basicMapper.query2do(query);
basicDao.updateById(data);
D d = basicMapper.do2dto(data);
return basicMapper.dto2View(d);
}

/**
* 查詢
*
* @param id 主鍵
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永勝</a >
* @since 2021/3/1
* @since 1.0.0
*/

public V select(@NotNull String id) {
T data = basicDao.selectById(id);
D d = basicMapper.do2dto(data);
return basicMapper.dto2View(d);
}


/**
* 查詢多條記錄
*
* @param query {@link Q}
* @author <a href = "mailto:njpkhuan@gmail.com" >朱永勝</a >
* @since 2021/2/23
* @since 1.0.0
*/

public PageResult<V> page(@Valid Q query) {
PageParam<D, Q> page = new PageParam<>(query);
page.setDefaultOrder("create_time desc");
List<D> list = basicDao.selectPageRel(page, query);

List<V> vList = basicMapper.dto2ViewPage(list);
log.trace("{}", list);

return new PageResult<>(vList, page.getTotal());
}

/**
* 軟刪除
*
* @author <a href="mailto:17602556550@189.cn">朱永勝</a>
* @since 2023/5/26
*/

@Transactional(rollbackFor = Exception.class)
public void delWeak(String id)
{
T t = basicDao.selectById(id);
t.setDeleted("1");
basicDao.updateById(t);
}

/**
* 批量更新
*
* @author <a href="mailto:17602556550@189.cn">朱永勝</a>
* @since 2023/6/6
*/

@Transactional(rollbackFor = Exception.class)
public void updateBatch(List<Q> query)
{
query.forEach(this::update);
}
}

GenericSuperclassUtil

package com.nari.core.basic;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericSuperclassUtil {

/*
* 獲取泛型類Class對(duì)象,不是泛型類則返回null
*/

public static Class<?> getActualTypeArgument(Class<?> clazz) {
Class<?> entitiClass = null;
Type genericSuperclass = clazz.getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass)
.getActualTypeArguments();
if (actualTypeArguments != null && actualTypeArguments.length > 0) {
entitiClass = (Class<?>) actualTypeArguments[0];
}
}

return entitiClass;
}

/*
* 獲取泛型類Class對(duì)象,不是泛型類則返回null
*/

static Class<?> getActualTypeArgument(Class<?> clazz, Integer pos) {
Class<?> entitiClass = null;
Type genericSuperclass = clazz.getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass)
.getActualTypeArguments();
if (actualTypeArguments != null && actualTypeArguments.length > pos) {
entitiClass = (Class<?>) actualTypeArguments[pos];
}
}

return entitiClass;
}
}

三、POM

  <org.mapstruct.version>1.5.5.Final</org.mapstruct.version>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>

</configuration>
</plugin>

本文由 mdnice 多平臺(tái)發(fā)布文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-648458.html

到了這里,關(guān)于快速生成通用接口業(yè)務(wù)配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 通用操作接口UMI:如何快速簡(jiǎn)單地給機(jī)器人提供更多學(xué)習(xí)數(shù)據(jù)?

    通用操作接口UMI:如何快速簡(jiǎn)單地給機(jī)器人提供更多學(xué)習(xí)數(shù)據(jù)?

    論文標(biāo)題: Universal Manipulation Interface: In-The-Wild Robot Teaching Without In-The-Wild Robots 論文作者: Cheng Chi , Zhenjia Xu , Chuer Pan, Eric Cousineau, Benjamin Burchfiel, Siyuan Feng, Russ Tedrake, Shuran Song 項(xiàng)目地址: https://umi-gripper.github.io/ 導(dǎo)讀: 斯坦福團(tuán)隊(duì)提出通用操縱接口(UMI)通用框架,可以直接

    2024年04月12日
    瀏覽(22)
  • XXX汽車SAP ERP系統(tǒng)接口提速,助力生產(chǎn)物流業(yè)務(wù)數(shù)據(jù)快速處理(投稿數(shù)字化月報(bào)一)

    XXX汽車SAP ERP系統(tǒng)接口提速,助力生產(chǎn)物流業(yè)務(wù)數(shù)據(jù)快速處理(投稿數(shù)字化月報(bào)一)

    ????????XXX汽車每臺(tái)整車的生產(chǎn)訂單數(shù)據(jù)(含配置BOM)都通過(guò)整車訂單下達(dá)接口下發(fā),因?yàn)閿?shù)據(jù)量龐大且又和生產(chǎn)、物流、質(zhì)量等業(yè)務(wù)域息息相關(guān),一直是ERP項(xiàng)目組重點(diǎn)關(guān)注的接口。從2019年項(xiàng)目初發(fā)給MOM生產(chǎn)、LES物流系統(tǒng)到現(xiàn)在,下游接收系統(tǒng)已經(jīng)增加到15個(gè)之多。針對(duì)該

    2024年02月12日
    瀏覽(24)
  • 微信小程序自研業(yè)務(wù)接口的服務(wù)器一點(diǎn)配置記錄整理

    微信小程序的開(kāi)發(fā)和APP的開(kāi)發(fā)有些類似,但又略有不同。 App一般有很多版本,甚至要兼容很多版本兼容,尤其是各個(gè)小版本之間一般都是要共存的。當(dāng)然如果有較大變化或者升級(jí),尤其是底層邏輯或者數(shù)據(jù)庫(kù)結(jié)構(gòu)改動(dòng),一般會(huì)強(qiáng)制升級(jí)。 因?yàn)橐鄠€(gè)版本兼容,互相不影響使

    2023年04月25日
    瀏覽(21)
  • 如何給網(wǎng)站或者后端服務(wù)免費(fèi)且快速的進(jìn)行配置HTTPS,配置ssl證書

    如何給網(wǎng)站或者后端服務(wù)免費(fèi)且快速的進(jìn)行配置HTTPS,配置ssl證書

    現(xiàn)在部署的網(wǎng)站用的大多都是 https 協(xié)議的,還有的平臺(tái)你要是想發(fā)布自己的網(wǎng)站就必須得是 https 的協(xié)議,如果不使用 ssl 的話,那就不讓你使用.就比如微信,支付寶等的產(chǎn)品,不用的話就不讓你使用他們的平臺(tái).不過(guò)還好很多服務(wù)廠商都提供了免費(fèi) ssl 證書可以進(jìn)行配置 今天的情況

    2024年02月09日
    瀏覽(21)
  • H5套殼微信小程序跳轉(zhuǎn)H5以及配置服務(wù)器接口域名和業(yè)務(wù)域名

    H5套殼微信小程序跳轉(zhuǎn)H5以及配置服務(wù)器接口域名和業(yè)務(wù)域名

    一、H5套殼微信小程序跳轉(zhuǎn)H5 基本語(yǔ)法: web-view src=\\\"https://你的域名\\\"/web-view 1. 其中,url必須在管理后臺(tái)加進(jìn)業(yè)務(wù)域名,并且是https開(kāi)頭的。 使用了web-view,頁(yè)面將不能放置其他元素,因?yàn)閣eb-view會(huì)鋪滿整個(gè)頁(yè)面 電腦端調(diào)試,需要在開(kāi)發(fā)者工具的項(xiàng)目設(shè)置里把基礎(chǔ)庫(kù)版本改為最

    2024年02月07日
    瀏覽(31)
  • IntelliJ IDEA 中使用Apifox IDEA 插件快速生成接口API (Java 開(kāi)發(fā)告別寫接口文檔)

    IntelliJ IDEA 中使用Apifox IDEA 插件快速生成接口API (Java 開(kāi)發(fā)告別寫接口文檔)

    Apifox IDEA 插件快速上手 | Apifox 幫助文檔 特別注意: 1、idea版本必須大于2019.03才可以使用這個(gè)插件 2、修改設(shè)置不然分組校驗(yàn)必填項(xiàng),apifox里面顯示都是必填 添加圖片注釋,不超過(guò) 140 字(可選) Apifox IDEA 插件(Apifox Helper) 主要用于 IDEA 項(xiàng)目快速生成 API 文檔,并同步到 A

    2024年03月24日
    瀏覽(29)
  • IDEA好用插件:MybatisX快速生成接口實(shí)體類mapper.xml映射文件

    IDEA好用插件:MybatisX快速生成接口實(shí)體類mapper.xml映射文件

    目錄 ?1、在Idea中找到下載插件,Install,重啟Idea ?2、一個(gè)測(cè)試java文件,里面有com包 ?3、在Idea中添加數(shù)據(jù)庫(kù) --------以O(shè)racle數(shù)據(jù)庫(kù)為例 ?4、快速生成entity-service-mapper方法 ?5、查看生成的代碼 ?6、自動(dòng)生成(增刪查改)在TestMapper中快速編寫代碼 1、在Idea中找到下載插件,Ins

    2024年02月02日
    瀏覽(25)
  • 復(fù)雜業(yè)務(wù)系統(tǒng)的通用架構(gòu)設(shè)計(jì)法則

    復(fù)雜業(yè)務(wù)系統(tǒng)的通用架構(gòu)設(shè)計(jì)法則

    我們經(jīng)常提到復(fù)雜系統(tǒng),那么到底什么是復(fù)雜系統(tǒng)。我們看下維基的定義:復(fù)雜系統(tǒng)(英語(yǔ):complex system),又稱復(fù)合系統(tǒng),是指由許多可能相互作用的組成成分所組成的系統(tǒng)。強(qiáng)調(diào)了兩點(diǎn): 由點(diǎn)組成 點(diǎn)之間有各種關(guān)聯(lián) 兩點(diǎn)的規(guī)模和復(fù)雜性直接決定了系統(tǒng)的復(fù)雜程度。比如

    2024年02月08日
    瀏覽(19)
  • 華為eNSP配置RSTP(快速生成樹(shù))

    華為eNSP配置RSTP(快速生成樹(shù))

    LSW1 LSW2 LSW3

    2024年02月07日
    瀏覽(15)
  • 【架構(gòu)實(shí)踐】復(fù)雜業(yè)務(wù)系統(tǒng)的通用架構(gòu)設(shè)計(jì)法則

    目錄 一、什么是復(fù)雜系統(tǒng) 二、什么是架構(gòu) 三、架構(gòu)的本質(zhì) 四、架構(gòu)分類

    2024年02月08日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包