实用API设计案例

简介: 实用API设计案例

艺术生永远不要把学技巧放在第一位,而要把怎么思考放在第一位。——灵遁者

今天为了偷懒,写了两个函数

/**
 * AR模式in查询
 *
 * @param page 分页参数
 * @param ids  ids
 * @param type Class
 * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/16 16:21
 */
@SneakyThrows
public static <T extends BaseEntity<T>> IPage<T> selectPageByIds(IPage<T> page, List<?> ids, Class<T> type) {
    if (ids.isEmpty()) {
        return page;
    }
    return type.newInstance().selectPage(page, new LambdaQueryWrapper<>(type.newInstance()).in(T::getId, ids));
}

这里用到了AR模式,AR模式我之前博客写过,就不赘述了

AR模式文章戳我

看上去就两三行,但这个函数能应对我此处的需求:查询我的关注企业/收藏资讯/收藏产品列表等

然后我在service中调用如下:

/**
 * 我的关注/收藏
 *
 * @param page          分页参数
 * @param userAttention 查询条件
 * @return com.ruben.zsxh.pojo.common.Result
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/16 15:51
 */
@Override
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public Result mine(Page page, UserAttention userAttention) {
    userAttention.setUserId(Long.valueOf(ProfileHolder.getProfile().getId()));
    List<Long> ids = list(Wrappers.lambdaQuery(userAttention).select(UserAttention::getAttentionId)).parallelStream().map(UserAttention::getAttentionId).collect(Collectors.toList());
    return Result.ok().data(MybatisPlusUtils.selectPageByIds(page, ids, userAttention.getType().getTypeClass()));
}

这里第一行是给参数赋值,便于作为下方查询条件

userAttention.setUserId(Long.valueOf(ProfileHolder.getProfile().getId()));

第二行是从表内根据条件查询出关联数据

例如这里service的第二行是:在userAttention中调用UserAttention::getUserId,并以user_id=userId作为where条件,在对应的数据库表名为user_attention中取出attention_id,但mybatis-plusselectList返回的是UserAttention,所以我们再使用并行流转换为attentionId

List<Long> ids = list(Wrappers.lambdaQuery(userAttention).select(UserAttention::getAttentionId)).parallelStream().map(UserAttention::getAttentionId).collect(Collectors.toList());

最后拿到的返回值就是attentionId的集合,然后这个ids是用于关联其他表的

最后第三行中我们写法如下:

return Result.ok().data(MybatisPlusUtils.selectPageByIds(page, ids, userAttention.getType().getTypeClass()));

这里调用了我们上面的selectPageByIds,然后传入了

page:分页参数

ids:上方获取到attentionId的集合

userAttention.getType().getTypeClass():这个对应了一个枚举如下:

package com.ruben.zsxh.enumration.type;
import com.ruben.zsxh.entity.ArticleInfo;
import com.ruben.zsxh.entity.MemberInfo;
import com.ruben.zsxh.entity.ProductInfo;
import com.ruben.zsxh.pojo.common.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * 用户关注类型
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/16 14:46
 */
@Getter
@AllArgsConstructor
public enum UserAttentionTypeEnum {
    /**
     * Cheating the compiler.
     */
    MEMBER("关注企业", MemberInfo.class),
    NEWS("收藏资讯", ArticleInfo.class),
    PRODUCT("收藏商品", ProductInfo.class);
    private final String desc;
    private final Class<? extends BaseEntity> typeClass;
}

然后我们再配置mvc配置fastjson序列化枚举以及Mybatis-plus通用枚举之后

再到Controller中调用service

/**
 * 查询我的列表
 *
 * @param page 分页参数?size=10&current=1
 * @return 分页结果
 * @author <achao1441470436@gmail.com>
 * @since 2021-08-09
 */
@GetMapping("mine")
public Result mine(Page page, UserAttention userAttention) {
    return userAttentionService.mine(page, userAttention);
}

最后就能实现传入不同的type,分页拿到不同表的数据

例如传入MEMBER

传入NEWS

传入PRODUCT

这样就能用最少的代码做最多的事,达到事半功倍的效果

相关文章
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
缓存 JavaScript Serverless
一些可能被忽视的 Vue3 API 附带案例
一些可能被忽视的 Vue3 API 附带案例
284 0
|
API
GEE案例分析——利用sentinel-3数据计算空气污染指数(Air Pollution Index,简称API)
GEE案例分析——利用sentinel-3数据计算空气污染指数(Air Pollution Index,简称API)
635 0
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
604 102
|
供应链 API
案例分享:API如何助力小型电商实现月销售额翻倍
&quot;悦居生活&quot;通过接入支付、库存、营销及物流API,优化运营流程,解决库存滞后、营销低效、物流体验差等问题,实现库存周转率提升152%、会员复购率增长128%、月销售额突破32万元。
|
SQL Java 程序员
Java 8中的Stream API:简介与实用案例
【5月更文挑战第23天】本文将深入探讨Java 8中的Stream API,这是一种能够极大提升Java程序员生产力的新特性。我们将从基础概念开始,然后通过一些实用的案例来展示如何使用Stream API进行数据处理和操作。无论你是Java的初学者还是经验丰富的开发者,本文都将为你提供有价值的信息。
|
JSON BI API
商城上货API接口的实战案例
在商城上货过程中,API接口扮演着至关重要的角色。以下是对商城上货API接口的实战分析,涵盖其主要功能、类型、安全性以及实战案例等方面。
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
296 1
|
存储 Linux API
Linux源码阅读笔记08-进程调度API系统调用案例分析
Linux源码阅读笔记08-进程调度API系统调用案例分析