我的点赞功能(完整分页查询步骤)和快速刷题开发

news2024/11/27 12:38:03

文章目录

    • 1.我的点赞分页展示
        • 1.分页查询工具类
          • 1.PageInfo.java 需要分页查询的就继承它,传值的时候pageNo和pageSize可以为空
          • 2.PageResult.java 根据条件从数据库中查询信息,然后设置这里的四个值即可得到分页查询结果
        • 2.sun-club-application-controller
          • 1.SubjectLikedDTO.java 继承PageInfo
          • 2.SubjectLikedController.java 获取PageNo和PageSize(可以为空,因为PageInfo有默认值)
        • 3.sun-club-domain
          • 1.SubjectLikedBO.java 继承PageInfo
          • 2.SubjectLikedDomainService.java
          • 3.SubjectLikedDomainServiceImpl.java
        • 4.sun-club-infra
          • 1.SubjectLikedService.java
          • 2.SubjectLikedServiceImpl.java
          • 3.SubjectLikedDao.java
          • 4.SubjectLikedDao.xml
        • 5.测试
          • 1.登录
          • 2.点赞
          • 3.使用定时任务将点赞信息同步到数据库
          • 4.查询点赞信息发现查不出来,原因是同步点赞信息时没有设置is_delete=0,设置之后重新测试一遍
          • 5.同步成功
          • 6.total正确了但是没数据,发现是参数写错了,真醉了
          • 7.再次测试,终于对了
    • 2.快速刷题
        • 1.sun-club-application-controller
          • 1.SubjectInfoDTO.java 新增上一题和下一题字段
        • 2.sun-club-domain
          • 1.SubjectInfoBO.java 新增上一题下一题字段
          • 2.SubjectInfoDomainServiceImpl.java 将上一题和下一题的id设置到bo中
        • 3.sun-club-infra
          • 1.SubjectJudgeService.java
          • 2.SubjectInfoServiceImpl.java
          • 3.SubjectInfoDao.java
          • 4.SubjectInfoDao.xml 查询上一题和下一题的sql
        • 4.测试
          • 1.新增同一分类同一标签下的三个题目
          • 2.找到第二个题目的题目id,发送请求
          • 3.查询564得到563和565,没问题

1.我的点赞分页展示

1.分页查询工具类
1.PageInfo.java 需要分页查询的就继承它,传值的时候pageNo和pageSize可以为空
package com.sunxiansheng.subject.application.newpage;

import java.util.Objects;

/**
 * Description: 分页请求的入参
 * @Author sun
 * @Create 2024/5/28 16:25
 * @Version 1.1
 */
public class PageInfo {

    private Integer pageNo = 1;
    private Integer pageSize = 20;

    public Integer getPageNo() {
        return (pageNo == null || pageNo < 1) ? 1 : pageNo;
    }

    public Integer getPageSize() {
        return (pageSize == null || pageSize < 1) ? 20 : pageSize;
    }

    public PageInfo setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
        return this;
    }

    public PageInfo setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
        return this;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PageInfo pageInfo = (PageInfo) o;
        return Objects.equals(pageNo, pageInfo.pageNo) &&
                Objects.equals(pageSize, pageInfo.pageSize);
    }

    @Override
    public int hashCode() {
        return Objects.hash(pageNo, pageSize);
    }

    @Override
    public String toString() {
        return "PageInfo{" +
                "pageNo=" + pageNo +
                ", pageSize=" + pageSize +
                '}';
    }
}

2.PageResult.java 根据条件从数据库中查询信息,然后设置这里的四个值即可得到分页查询结果
package com.sunxiansheng.subject.application.newpage;

import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * Description: 分页返回的实体
 * @Author sun
 * @Create 2024/5/28 16:36
 * @Version 1.1
 */
public class PageResult<T> {

    // 当前页码,默认为1
    private Integer pageNo = 1;

    // 每页显示的记录数,默认为20
    private Integer pageSize = 20;

    // 总记录条数
    private Integer total = 0;

    // 总页数
    private Integer totalPages = 0;

    // 当前页的记录列表
    private List<T> result = Collections.emptyList();

    // 表示当前页是从分页查询结果的第几条记录开始,下标从1开始
    private Integer start = 1;

    // 表示当前页是从分页查询结果的第几条记录结束,下标从1开始
    private Integer end = 0;

    // ==================== 分页查询只需要设置这几个值即可 ====================

    // 设置当前页码,并重新计算起始和结束位置
    public PageResult<T> setPageNo(Integer pageNo) {
        this.pageNo = Objects.requireNonNull(pageNo, "Page number cannot be null");
        calculateStartAndEnd();
        return this;
    }

    // 设置每页记录数,并重新计算起始和结束位置
    public PageResult<T> setPageSize(Integer pageSize) {
        this.pageSize = Objects.requireNonNull(pageSize, "Page size cannot be null");
        calculateStartAndEnd();
        return this;
    }

    // 设置当前页的记录列表
    public PageResult<T> setRecords(List<T> result) {
        this.result = Objects.requireNonNull(result, "Result list cannot be null");
        return this;
    }

    // 设置总记录条数,并重新计算总页数和起始结束位置
    public PageResult<T> setTotal(Integer total) {
        this.total = Objects.requireNonNull(total, "Total count cannot be null");
        calculateTotalPages();
        calculateStartAndEnd();
        return this;
    }

    // ==================== 分页查询只需要设置这几个值即可 ====================

    // 计算总页数
    private void calculateTotalPages() {
        if (this.pageSize > 0) {
            this.totalPages = (this.total / this.pageSize) + (this.total % this.pageSize == 0 ? 0 : 1);
        } else {
            this.totalPages = 0;
        }
    }

    // 计算起始和结束位置
    private void calculateStartAndEnd() {
        if (this.pageSize > 0) {
            this.start = (this.pageNo - 1) * this.pageSize + 1;
            this.end = Math.min(this.pageNo * this.pageSize, this.total);
        } else {
            this.start = 1;
            this.end = this.total;
        }
    }

    public Integer getStart() {
        return start;
    }

    // 获取每页记录数
    public Integer getPageSize() {
        return pageSize;
    }

    public Integer getPageNo() {
        return pageNo;
    }

    public Integer getTotal() {
        return total;
    }

    public Integer getTotalPages() {
        return totalPages;
    }

    public List<T> getResult() {
        return result;
    }

    public Integer getEnd() {
        return end;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PageResult<?> that = (PageResult<?>) o;
        return Objects.equals(pageNo, that.pageNo) &&
                Objects.equals(pageSize, that.pageSize) &&
                Objects.equals(total, that.total) &&
                Objects.equals(totalPages, that.totalPages) &&
                Objects.equals(result, that.result) &&
                Objects.equals(start, that.start) &&
                Objects.equals(end, that.end);
    }

    @Override
    public int hashCode() {
        return Objects.hash(pageNo, pageSize, total, totalPages, result, start, end);
    }

    @Override
    public String toString() {
        return "PageResult{" +
                "pageNo=" + pageNo +
                ", pageSize=" + pageSize +
                ", total=" + total +
                ", totalPages=" + totalPages +
                ", result=" + result +
                ", start=" + start +
                ", end=" + end +
                '}';
    }
}
2.sun-club-application-controller
1.SubjectLikedDTO.java 继承PageInfo

image-20240624150131012

2.SubjectLikedController.java 获取PageNo和PageSize(可以为空,因为PageInfo有默认值)
/**
 * 分页查询我的点赞列表
 */
@PostMapping("/getSubjectLikedPage")
public Result<PageResult<SubjectLikedDTO>> getSubjectLikedPage(@RequestBody SubjectLikedDTO subjectLikedDTO) {
    try {
        // 打日志
        if (log.isInfoEnabled()) {
            log.info("SubjectController.getSubjectLikedPage.dto:{}", JSON.toJSONString(subjectLikedDTO));
        }
        // 校验参数:这里的pageNo和pageSize可以不填,因为在PageInfo中已经有默认值了
        // 转换DTO为BO
        SubjectLikedBO subjectLikedBO = SubjectLikedDTOConverter.INSTANCE.convertDTOToBO(subjectLikedDTO);
        // 设置分页查询的页码和每页显示的数量,即使为空也没事,因为在BO中已经有默认值了
        subjectLikedBO.setPageNo(subjectLikedDTO.getPageNo());
        subjectLikedBO.setPageSize(subjectLikedDTO.getPageSize());
        // 调用domain层的方法,进行分页查询
        PageResult<SubjectLikedBO> boPageResult = subjectLikedDomainService.getSubjectLikedPage(subjectLikedBO);
        return Result.ok(boPageResult);
    } catch (Exception e) {
        log.error("SubjectCategoryController.getSubjectLikedPage.error:{}", e.getMessage(), e);
        return Result.fail("分页查询我的点赞失败");
    }
}
3.sun-club-domain
1.SubjectLikedBO.java 继承PageInfo

image-20240624155408224

2.SubjectLikedDomainService.java
/**
 * 分页查询我的点赞列表
 * @param subjectLikedBO
 * @return
 */
PageResult<SubjectLikedBO> getSubjectLikedPage(SubjectLikedBO subjectLikedBO);
3.SubjectLikedDomainServiceImpl.java
@Override
public PageResult<SubjectLikedBO> getSubjectLikedPage(SubjectLikedBO subjectLikedBO) {
    // 分页查询的结果
    PageResult<SubjectLikedBO> pageResult = new PageResult<>();
    // 链式调用:设置pageNo和pageSize
    pageResult.setPageNo(subjectLikedBO.getPageNo()).setPageSize(subjectLikedBO.getPageSize());

    // ==========根据条件去db分页查询并设置分页查询结果和total==========
    // 1. 计算起始位置:(pageNo - 1) * pageSize 也就是数据库中的OFFSET,即从第几条开始
    int offset = (subjectLikedBO.getPageNo() - 1) * subjectLikedBO.getPageSize();
    // 2.得到页面大小pageSize 也就是数据库中的LIMIT,即取多少条
    int limit = subjectLikedBO.getPageSize();
    // 3.根据条件查询总数,如果为0,直接返回,这样total默认是0,records也是空的
    SubjectLiked subjectLiked = SubjectLikedBOConverter.INSTANCE.convertBOToEntity(subjectLikedBO);
    subjectLiked.setLikeUserId(LoginUtil.getLoginId());
    int count = subjectLikedService.countByCondition(subjectLiked);
    if (count == 0) {
        return pageResult;
    }
    // 4.如果记录条数不为0根据条件、limit、offset去db分页查询
    List<SubjectLiked> subjectLikedList = subjectLikedService.queryPage(subjectLiked, offset,
            limit);
    // 5.链式调用:设置分页查询结果和total
    List<SubjectLikedBO> subjectInfoBOS = SubjectLikedBOConverter.INSTANCE.convertListInfoToBO(subjectLikedList);
    // 根据subjectId查询subjectName
    subjectInfoBOS.forEach(info -> {
        SubjectInfo subjectInfo = subjectInfoService.queryById(info.getSubjectId());
        info.setSubjectName(subjectInfo.getSubjectName());
    });
    pageResult.setRecords(subjectInfoBOS).setTotal(count);
    // ==========根据条件去db分页查询并设置分页查询结果和total==========
    return pageResult;
}
4.sun-club-infra
1.SubjectLikedService.java
/**
 * 根据条件查询数量
 * @param subjectLiked
 * @return
 */
int countByCondition(SubjectLiked subjectLiked);

/**
 * 分页查询
 * @param subjectLiked
 * @param start
 * @param pageSize
 * @return
 */
List<SubjectLiked> queryPage(SubjectLiked subjectLiked, int start, Integer pageSize);
2.SubjectLikedServiceImpl.java
@Override
public int countByCondition(SubjectLiked subjectLiked) {
    return this.subjectLikedDao.countByCondition(subjectLiked);
}

@Override
public List<SubjectLiked> queryPage(SubjectLiked subjectLiked, int offset, Integer limit) {
    return this.subjectLikedDao.queryPage(subjectLiked, offset, offset);
}
3.SubjectLikedDao.java
int countByCondition(SubjectLiked subjectLiked);

List<SubjectLiked> queryPage(@Param("entity") SubjectLiked subjectLiked,
                             @Param("offset") int offset,
                             @Param("limit") Integer limit);
4.SubjectLikedDao.xml
<select id="countByCondition" resultType="java.lang.Integer">
    select count(1)
    from subject_liked
    where like_user_id = #{likeUserId} and status = 1
      and is_deleted = 0
</select>

<select id="queryPage" resultType="com.sunxiansheng.subject.infra.basic.entity.SubjectLiked">
    select *
    from subject_liked
    where like_user_id = #{entity.likeUserId}
      and is_deleted = 0 and status = 1
        limit #{offset}
        , #{limit}
</select>
5.测试
1.登录

image-20240624160716538

2.点赞

image-20240624163311783

3.使用定时任务将点赞信息同步到数据库

image-20240624163948126

4.查询点赞信息发现查不出来,原因是同步点赞信息时没有设置is_delete=0,设置之后重新测试一遍

image-20240624164354096

image-20240624164435131

5.同步成功

image-20240624164703350

6.total正确了但是没数据,发现是参数写错了,真醉了

image-20240624165012345

7.再次测试,终于对了

image-20240624165438824

2.快速刷题

1.sun-club-application-controller
1.SubjectInfoDTO.java 新增上一题和下一题字段
/**
 * 上一题id
 */
private Long lastSubjectId;

/**
 *
 * 下一题id
 */
private Long nextSubjectId;
2.sun-club-domain
1.SubjectInfoBO.java 新增上一题下一题字段
/**
 * 上一题id
 */
private Long lastSubjectId;

/**
 *
 * 下一题id
 */
private Long nextSubjectId;
2.SubjectInfoDomainServiceImpl.java 将上一题和下一题的id设置到bo中

image-20240624174843066

/**
 * 将上一题和下一题的id设置到bo中
 *
 * @param bo 这个bo是从数据库查出来的信息,是要返回的bo
 * @param subjectInfoBO 这个bo是前端传过来的有信息
 */
private void assembleSubjectCursor(SubjectInfoBO bo, SubjectInfoBO subjectInfoBO) {
    // 得到题目的分类和标签id,因为所有的题目都是基于某个分类,某个标签下的
    Long labelId = subjectInfoBO.getLabelId();
    Long categoryId = subjectInfoBO.getCategoryId();
    Long subjectId = subjectInfoBO.getId();
    // 做好兼容,如果不是快速刷题,前端就不会传递两个id,就直接返回
    if (Objects.isNull(labelId) || Objects.isNull(categoryId)) {
        return;
    }
    // 查询下一题,1表示查询上一题
    Long nextSubjectId = subjectInfoService.querySubjectIdCursor(subjectId, categoryId, labelId, 1);
    bo.setNextSubjectId(nextSubjectId);
    // 查询上一题,0表示查询上一题
    Long lastSubjectId = subjectInfoService.querySubjectIdCursor(subjectId, categoryId, labelId, 0);
    bo.setLastSubjectId(lastSubjectId);
}
3.sun-club-infra
1.SubjectJudgeService.java
/**
 * 查询上一题或者下一题
 * @param subjectId
 * @param categoryId
 * @param labelId
 * @param i 1是查询下一题,0是查询上一题
 * @return
 */
Long querySubjectIdCursor(Long subjectId, Long categoryId, Long labelId, int i);
2.SubjectInfoServiceImpl.java
@Override
public Long querySubjectIdCursor(Long subjectId, Long categoryId, Long labelId, int i) {
    return this.subjectInfoDao.querySubjectIdCursor(subjectId, categoryId, labelId, i);
}
3.SubjectInfoDao.java
    /**
     * 查询上一题下一题
     * @param subjectId
     * @param categoryId
     * @param labelId
     * @param cursor 1是下一题,0是上一题
     * @return
     */
    Long querySubjectIdCursor(@Param("subjectId") Long subjectId,
                              @Param("categoryId") Long categoryId,
                              @Param("labelId") Long labelId,
                              @Param("cursor") int cursor);
4.SubjectInfoDao.xml 查询上一题和下一题的sql
<select id="querySubjectIdCursor" resultType="java.lang.Long">
    select a.id
    from subject_info a
    join subject_mapping b on a.id = b.subject_id
    where b.category_id = #{categoryId}
    and b.label_id = #{labelId}
    <if test="cursor != null and cursor == 1">
        and a.id &gt; #{subjectId}
    </if>
    <if test="cursor != null and cursor == 0">
        and a.id &lt; #{subjectId}
    </if>
    order by a.id
    <if test="cursor != null and cursor == 0">
        desc
    </if>
    limit 1
</select>
4.测试
1.新增同一分类同一标签下的三个题目

image-20240624173912761

2.找到第二个题目的题目id,发送请求

image-20240624174038067

3.查询564得到563和565,没问题

image-20240624174551651

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次Nginx代理配置的奇怪经历

目录 1 背景 2 需求 3 方案 4 问题 5 解决方案 6 最后记录 7 参考文献 1 背景 最近我们在做一个能源类智能化转型的项目&#xff0c;整个项目非常大&#xff0c;下面有很多的子项目组。不同项目组之间都是独立的子系统。 客户对技术上做了统一要求&#xff0c;使用统一的…

SpringBoot 自动配置(Condition)

一.Condition Condition 是在Spring 4.0 增加的条件判断功能&#xff0c;通过这个可以功能可以实现选择性的创建 Bean 操 作。 案例&#xff1a;需求1 在 Spring 的 IOC 容器中有一个 User 的 Bean&#xff0c;现要求&#xff1a; 1. 导入Jedis坐标后&#xff0c;加载该Bean…

基于STM32开发的智能农业灌溉系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 农田自动化灌溉家庭园艺智能浇灌常见问题及解决方案 常见问题解决方案结论 1. 引言 智能农业灌溉系统通过集成多种传感器&#xff0c;实时监测土壤湿度、温度、…

​【迅为电子】RK3568驱动指南|第十七篇 串口-第196章 串口简介

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

项目视图组(基于模型)Model-Based-Qt-思维导图-学习笔记

项目视图组(基于模型)Model-Based Model-Based &#xff08;1&#xff09;List View:清单视图 QListView 继承关系&#xff1a;继承自 QAbstractItemView&#xff0c;被 QListWidget 和 QUndoView 继承 功能&#xff1a;提供模型上的列表或图标视图&#xff0c;以非分层列表…

通过连接数据库演示解耦过程

一、什么是解耦&#xff1f; 解耦就是为了降低程序之间的耦合性&#xff0c;在软件工程中&#xff0c;对象之间的耦合度就是对象之间的关联度。程序之间耦合度越高&#xff0c;程序维护起来也就越困难&#xff0c;即程序维护成本高。所以我们需要通过现有方法降低耦合性&#x…

oss学习问题记录

1.在使用oss上传文档时&#xff0c;根据返回的地址访问上传的图片&#xff0c;会报错误如下&#xff1a;This XML file does not appear to have any style information associated with it. The document tree is shown below. 在设置了上传的文档类型和代码设置读写权限之后 …

Redis的基本概念和使用

目录 一、Redis简介 1、NOSQL 2、NOSQL和关系型数据库比较 3、主流的NOSQL产品 4、什么是Redis 5、启动Redis 二、Redis基本操作 1、大概操作 三、 Redis 数据类型&#xff08;5种常用&#xff09; 1、redis 数据存储格式 2、String 3、hash 4、list 5、Set 6、…

面试题-Spring Bean的生命周期

文章目录 Spring Bean 生命周期分为哪几个阶段浅析Bean生命周期源码实现1.1 DefaultListableBeanFactory1.2 createBean2.1 populateBean3.1 initializeBean3.2 invokeInitMethod3.3 applyBeanPostProcessorsBeforeInitialization5.1 destroyBean5.2 invokeDestroyMethod Sprin…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要…

一次评审会议上的纠偏

这段时间&#xff0c;整个项目组都投入在某个专项项目中&#xff0c;评审和版本迭代的频率也很高。而在近期的评审会上&#xff0c;发生了一起激烈的争辩&#xff0c;也让我意识到大多数产品人身上的通病&#xff0c;觉得挺有意义的&#xff0c;借此分享给大家。 同事A最近在做…

Qt窗口交互场景、子窗口数据获取

一、前言 在现代软件开发中&#xff0c;图形用户界面&#xff08;GUI&#xff09;的设计不仅仅关乎美观&#xff0c;更在于用户体验和功能的无缝衔接。Qt框架以其强大的跨平台能力和丰富的组件库&#xff0c;成为众多开发者构建GUI应用的首选工具。在Qt应用中&#xff0c;窗口…

​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​

目录 微机原理判断指令是否正确【见的多了&#xff0c;你就懂了~】 1. 立即数不能作为目标操作数 2. 操作数位数必须匹配 3. 需要指定存储器操作数的字节或字 4. 两个操作数不能同时为存储器操作数 5. 循环次数超过1必须使用CL寄存器 6. 段寄存器限制&#xff08;特别是…

比OpenAI的Whisper快50%,最新开源语音模型

生成式AI初创公司aiOla在官网开源了最新语音模型Whisper-Medusa&#xff0c;推理效率比OpenAI开源的Whisper快50%。 aiOla在Whisper的架构之上进行了修改采用了“多头注意力”机制的并行计算方法&#xff0c;允许模型在每个推理步骤中预测多个token&#xff0c;同时不会损失性…

[000-01-010].第02节:Spring基础开发环境搭建

1.1.新建空项目&#xff1a; 1.新建Empty项目&#xff0c;主要是为了方便之后把各个模块的代码统一的放在一起&#xff1a; 2.设置JDK&#xff1a; 3.设置maven版本&#xff1a; 1.2.建立第一个Spring项目模块&#xff1a; 1.新建模块&#xff1a; 2.配置依赖&#xff…

gitlab自动部署是什么 gitlab自动部署如何进行操作

在现代软件开发流程中&#xff0c;自动化部署是提高效率和确保软件质量的关键环节。GitLab作为一个强大的DevOps平台&#xff0c;提供了完整的自动部署工具&#xff0c;帮助开发团队实现代码从编写到生产的无缝转换。本文将详细解析GitLab的自动部署功能是什么&#xff0c;如何…

走向绿色:能源新选择,未来更美好

当前&#xff0c;全球范围内可再生能源正经历着从辅助能源向核心能源的深刻转型&#xff0c;绿色能源日益渗透至居住、出行、日常应用等多个领域&#xff0c;深刻影响着我们的生活方式&#xff0c;使我们能够更加充分地体验清洁能源所带来的优质生活。 一、绿色能源与“住” …

Fluent学习笔记——催化转化器内流场仿真(含多孔介质)

参考课程&#xff1a; 标题&#xff1a;【ANSYS Fluent教程|流体仿真基础入门105讲&#xff08;官方最新案例讲解&#xff09;】 作者&#xff1a;仿真秀APP 选集&#xff1a;P35-P40https://www.bilibili.com/video/BV1vT4y1z7on?p35&vd_source7e977d0187273d77005659cdd…

数据结构(03):线性表的逻辑结构

线性表的逻辑结构 在谈论逻辑结构的时候&#xff0c;我们不讨论具体数据在物理内存中的存储细节&#xff0c;而只关注线性表的逻辑结构。数据结构系列文章02介绍过常见的逻辑结构有&#xff1a;集合、线性表结构、树结构和图结构等。 A.What&#xff08;什么是线性表&#xff0…

什么是凤凰雪球期权?和雪球期权有什么区别?

凤凰结构&#xff0c;和经典雪球结构类似&#xff0c;属于障碍期权的一种。凤凰结构中包括敲入事件&#xff0c;也包括敲出事件&#xff0c;最后的收益取决于挂钩标的走势和敲入、敲出事件发生的时间&#xff0c;不过在收益计算规则上与雪球有所不同&#xff0c;下文为大家科普…