3.2 内容管理模块 - 课程分类、新增课程、修改课程

news2024/11/25 23:12:09

内容管理模块-课程分类、新增课程、修改课程

文章目录

  • 内容管理模块-课程分类、新增课程、修改课程
  • 一、课程分类
    • 1.1 课程分类表
    • 1.2 查询树形结构
      • 1.2.1 表自连接
      • 1.2.2 SQL递归
    • 1.3 Mapper
    • 1.4 Service
    • 1.5 Controller
    • 1.6 效果图
  • 二、添加课程
    • 2.1 需求分析
    • 2.2 数据表
      • 2.2.1 课程基础信息表
      • 2.2.2 课程营销信息表
    • 2.3 交互类
      • 2.3.1 AddCourseDto
      • 2.3.2 CourseBaseInfoDto
    • 2.3 Mapper
    • 2.4 Service
    • 2.5 Controller
    • 2.6 效果图
  • 三、修改课程
    • 3.1 需求分析
    • 3.2 数据回显
      • 3.2.1 Service类
      • 3.2.2 Controller类
    • 3.3 修改课程
      • 3.3.1 修改课程Dto
      • 3.3.2 Service
      • 3.3.3 Controller

一、课程分类

点击“添加课程”,之后随便选一个“课程形式”

image-20231107222138556

然后有一个“课程分类”,我们下面就要实现课程分类,这个地方缺少一个课程分类的下拉框

image-20231107222227362

1.1 课程分类表

典型的树形分类结构

image-20231107224534473

image-20231109211534507

@Data
@TableName("course_category")
public class CourseCategory implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    private String id;

    /**
     * 分类名称
     */
    private String name;

    /**
     * 分类标签默认和名称一样
     */
    private String label;

    /**
     * 父结点id(第一级的父节点是0,自关联字段id)
     */
    private String parentid;

    /**
     * 是否显示
     */
    private Integer isShow;

    /**
     * 排序字段
     */
    private Integer orderby;

    /**
     * 是否叶子
     */
    private Integer isLeaf;


}

创建一个Dto,方便之后向前端响应课程分类表数据

@Data
public class CourseCategoryTreeDto extends CourseCategory implements Serializable {

    //Serializable:在网络传输需要序列化的时候,需要实现Serializable接口
    private static final long serialVersionUID = 2950235607890841126L;

    //下级节点
    List<CourseCategoryTreeDto> childrenTreeNodes;
    
}

展示出来是下面这种格式

{
"id" : "1-2",
"isLeaf" : null,
"isShow" : null,
"label" : "移动开发",
"name" : "移动开发",
"orderby" : 2,
"parentid" : "1",
"childrenTreeNodes" : [
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-2-1",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "微信开发",
                  "name" : "微信开发",
                  "orderby" : 1,
                  "parentid" : "1-2"
               }
 }

1.2 查询树形结构

1.2.1 表自连接

假如说数据层级比较固定,而且数据层级比较少,可以使用表自连接的方式

select one.id one_id, one.label one_label, 
       two.id two_id,two.label two_label,
			 three.id three_id,three.label three_label
from course_category one -- one是表的别名,表示一级分类

inner join course_category two -- two是表的别名,表示二级分类
      on two.parentid = one.id -- 子节点的parentid是父节点的id
inner join course_category three
       on  three.parentid = two.id

查询结果

image-20231109211920604

1.2.2 SQL递归

灵活的方式实现树形表的查询,比如使用MYSQL递归实现,使用with语法

递归时MySQL8之后才有的

递归语法

WITH [RECURSIVE]
        cte_name [(col_name [, col_name] ...)] AS (subquery)
        [, cte_name [(col_name [, col_name] ...)] AS (subquery)] 

cte_name :公共表达式的名称,可以理解为表名,用来表示as后面跟着的子查询

col_name :公共表达式包含的列名,可以写也可以不写

有一个关键字RECURSIVE,就是递归的含义

cte_name相当于表的一个别名

(col_name [, col_name] …)]是表中的哪些字段

示例代码

--  t1J就是一个虚拟表
with RECURSIVE t1  AS
(
-- 这个t1表的初始数据就是1
  SELECT 1 as n
	
-- 将下面查询出的数据结果集放入t1虚拟表中
  UNION ALL
	
-- 下面是递归查询的内容
  SELECT n + 1 FROM t1 WHERE n < 5
)

-- 查询最终结果
SELECT * FROM t1;

image-20231109213712866

下面查询树形结果的SQL,向下递归

向下递归:先拿一级节点,拿到一级节点后找二级节点,拿到二级节点后找三级节点…

with RECURSIVE t1  AS(
--  初始数据,就认为是根节点
  select * from course_category as p where id = '1'

--  每递归一次就把数据放入t1
union all

--  由树根找叶子
select t2.* 
from course_category as t2
INNER JOIN t1
      ON t2.parentid =  t1.id 
 
--  当我们拿到id为1的结点,递归后就可以拿到1-1等子结点的结果集
--  当我们拿到id为1-1等结点后,递归后就可以拿到1-1-1等子结点结果集
--  .......
)

select * from t1

image-20231109220313874

向上递归

向上递归:拿到最下一级的节点后找次下及节点…

由子节点找父节点

with RECURSIVE t1  AS(
--  初始数据,就认为是根节点
  select * from course_category as p where id = '1-1-1'

--  每递归一次就把数据放入t1
union all

--  由树根找叶子
select t2.* 
from course_category as t2
INNER JOIN t1
      ON t2.id =  t1.parentid 
 
--  当我们拿到id为1的结点,递归后就可以拿到1-1等子结点的结果集
--  当我们拿到id为1-1等结点后,递归后就可以拿到1-1-1等子结点结果集
--  .......
)

select * from t1

image-20231109221252895

mysql为了避免无限递归默认递归次数为1000,可以通过设置cte_max_recursion_depth参数增加递归深度,还可以通过max_execution_time限制执行时间,超过此时间也会终止递归操作。

mysql递归相当于在存储过程中执行若干次sql语句,java程序仅与数据库建立一次链接执行递归操作,所以只要控制好递归深度,控制好数据量性能就没有问题。

1.3 Mapper

//使用递归查询分类
public List<CourseCategoryTreeDto> selectTreeNodes(@Param("id") String id);
    <!--查询课程分类-->
    <select id="selectTreeNodes" resultType="com.xuecheng.content.model.dto.CourseCategoryTreeDto">
        with RECURSIVE t1 AS (
            select *
            from course_category as p
            where id = #{id}
            union all
            select t2.*
            from course_category as t2
                     INNER JOIN t1
                                ON t2.parentid = t1.id
        )

        select *
        from t1
        order by t1.id, t1.orderby

    </select>

我们现在从数据库中查到的数据是下列这个模样

image-20231109225811919

代码中查询出来的数据如下所示

image-20231109225958818

1.4 Service

要将Mapper层返回的数据进行进一步的处理。

将根节点id=1舍弃不要,因为在业务上没什么需要了

我们要将子节点放入到父节点的childrenTreeNodes集合里面。比如将1-1-x的节点放入到1-1节点的childrenTreeNodes集合里面

@Slf4j
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {

    @Autowired
    private CourseCategoryMapper courseCategoryMapper;

    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        //TODO 数据库递归查询出课程分类信息
        List<CourseCategoryTreeDto> courseCategoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);


        //TODO 找到每个节点的子节点,最终封装成List<CourseCategoryTreeDto>
        //将list转map,以备使用,排除根节点
        Map<String, CourseCategoryTreeDto> mapTemp = courseCategoryTreeDtos.stream()
                //!id.equals(item.getId()) 含义就是排除根节点
                .filter(item -> !id.equals(item.getId()))
                .collect(
                        //转Map是需要一个key,一个value的
                        //第一个key是代表元素的意思,key -> key.getId()是拿到key元素的id,然后充当Map的key
                        //value表示对象的本身,所以不需要任何的处理
                        //(key1, key2) -> key2 表示当key重复的时候(键相同),以后来的key为主
                        Collectors.toMap(key -> key.getId(), value -> value, (key1, key2) -> key2)
                );

        //最终返回的list
        List<CourseCategoryTreeDto> categoryTreeDtos = new ArrayList<>();

        //依次遍历每个元素,排除根节点
        //courseCategoryTreeDtos是从数据库查询出来的全部的数据
        courseCategoryTreeDtos.stream().filter(item -> !id.equals(item.getId())).forEach(item -> {
            if (item.getParentid().equals(id)) {
                //紧挨根节点下的节点
                categoryTreeDtos.add(item);
            }
            //找到当前节点的父节点
            CourseCategoryTreeDto courseCategoryTreeDto = mapTemp.get(item.getParentid());
            if (courseCategoryTreeDto != null) {
                if (courseCategoryTreeDto.getChildrenTreeNodes() == null) {
                    courseCategoryTreeDto.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDto>());
                }
                //下边开始往ChildrenTreeNodes属性中放子节点
                courseCategoryTreeDto.getChildrenTreeNodes().add(item);
            }
        });
        return categoryTreeDtos;
    }

}

1.5 Controller

/**
 * 课程分类相关接口
 */
@Slf4j
@RestController
public class CourseCategoryController {


    @Autowired
    private CourseCategoryService courseCategoryService;

    @GetMapping("/course-category/tree-nodes")
    public List<CourseCategoryTreeDto> queryTreeNodes() {
        return courseCategoryService.queryTreeNodes("1");
    }

}

1.6 效果图

image-20231109233240245

二、添加课程

2.1 需求分析

将来这些信息都会存储到“course_base”表中

  1. 点击“添加课程”选项

image-20231107222056328

  1. 点击添加课程,选择课程形式为录播

image-20231114213547334

  1. 选择完毕,点击下一步,进入课程基本信息添加界面

本界面分两部分信息,一部分是课程基本信息上,一部分是课程营销信息。

课程基本信息

image-20231114213621571

课程营销信息

下面的信息会存储在course_market表中

image-20231114214356815

也就是说一个表单中的数据要存储到两张表中

在这个界面中填写课程的基本信息、课程营销信息上。

填写完毕,保存并进行下一步

2.2 数据表

course_base、course_market两张表存储

两张表是一对一的关系,一个课程只有一个营销信息

并且两张表的主键id是相同的

2.2.1 课程基础信息表

  • course_base

image-20231114220605075

image-20231114220349065

/**
 * 课程基本信息
 */
@Data
@TableName("course_base")
public class CourseBase implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 机构ID
     */
    private Long companyId;

    /**
     * 机构名称
     */
    private String companyName;

    /**
     * 课程名称
     */
    private String name;

    /**
     * 适用人群
     */
    private String users;

    /**
     * 课程标签
     */
    private String tags;

    /**
     * 大分类
     */
    private String mt;

    /**
     * 小分类
     */
    private String st;

    /**
     * 课程等级
     */
    private String grade;

    /**
     * 教育模式(common普通,record 录播,live直播等)
     */
    private String teachmode;

    /**
     * 课程介绍
     */
    private String description;

    /**
     * 课程图片
     */
    private String pic;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createDate;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime changeDate;

    /**
     * 创建人
     */
    private String createPeople;

    /**
     * 更新人
     */
    private String changePeople;

    /**
     * 审核状态
     */
    private String auditStatus;

    /**
     * 课程发布状态 未发布  已发布 下线
     */
    private String status;
}

2.2.2 课程营销信息表

  • course_market

image-20231114220542319

image-20231114220530310

/**
 * 课程营销信息
 */
@Data
@TableName("course_market")
public class CourseMarket implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键,课程id
     */
    private Long id;

    /**
     * 收费规则,对应数据字典
     */
    private String charge;

    /**
     * 现价
     */
    private Float price;

    /**
     * 原价
     */
    private Float originalPrice;

    /**
     * 咨询qq
     */
    private String qq;

    /**
     * 微信
     */
    private String wechat;

    /**
     * 电话
     */
    private String phone;

    /**
     * 有效期天数
     */
    private Integer validDays;


}

2.3 交互类

2.3.1 AddCourseDto

价格信息存Float是没有问题的,但是计算的时候是有问题的,我们要使用BigDecimal

/**
 * @description 添加课程dto
 */
@Data
@ApiModel(value = "AddCourseDto", description = "新增课程基本信息")
public class AddCourseDto {

    @NotEmpty(message = "课程名称不能为空")
    @ApiModelProperty(value = "课程名称", required = true)
    private String name;

    @NotEmpty(message = "适用人群不能为空")
    @Size(message = "适用人群内容过少", min = 10)
    @ApiModelProperty(value = "适用人群", required = true)
    private String users;

    @ApiModelProperty(value = "课程标签")
    private String tags;

    @NotEmpty(message = "课程分类不能为空")
    @ApiModelProperty(value = "大分类", required = true)
    private String mt;

    @NotEmpty(message = "课程分类不能为空")
    @ApiModelProperty(value = "小分类", required = true)
    private String st;

    @NotEmpty(message = "课程等级不能为空")
    @ApiModelProperty(value = "课程等级", required = true)
    private String grade;

    @ApiModelProperty(value = "教学模式(普通,录播,直播等)", required = true)
    private String teachmode;

    @ApiModelProperty(value = "课程介绍")
    private String description;

    @ApiModelProperty(value = "课程图片", required = true)
    private String pic;

    @NotEmpty(message = "收费规则不能为空")
    @ApiModelProperty(value = "收费规则,对应数据字典", required = true)
    private String charge;

    @ApiModelProperty(value = "价格")
    private BigDecimal price;
    @ApiModelProperty(value = "原价")
    private BigDecimal originalPrice;


    @ApiModelProperty(value = "qq")
    private String qq;

    @ApiModelProperty(value = "微信")
    private String wechat;
    @ApiModelProperty(value = "电话")
    private String phone;

    @ApiModelProperty(value = "有效期")
    private Integer validDays;
}

2.3.2 CourseBaseInfoDto

添加成功之后我们查询出来的课程的详细信息

/**
 * @description 课程基本信息dto
 * 添加上课程信息后我们再查询返回的信息
 */
@Data
public class CourseBaseInfoDto extends CourseBase {


    /**
     * 收费规则,对应数据字典
     */
    private String charge;

    /**
     * 价格
     */
    private Float price;


    /**
     * 原价
     */
    private Float originalPrice;

    /**
     * 咨询qq
     */
    private String qq;

    /**
     * 微信
     */
    private String wechat;

    /**
     * 电话
     */
    private String phone;

    /**
     * 有效期天数
     */
    private Integer validDays;

    /**
     * 大分类名称
     */
    private String mtName;

    /**
     * 小分类名称
     */
    private String stName;

}

2.3 Mapper

/**
 * 课程基本信息 Mapper 接口
 */
public interface CourseBaseMapper extends BaseMapper<CourseBase> {

}
/**
 * 课程营销信息 Mapper 接口
 */
public interface CourseMarketMapper extends BaseMapper<CourseMarket> {

}

2.4 Service

2.5 Controller

    @ApiOperation("新增课程")
    @PostMapping("/course")
    public CourseBaseInfoDto createCourseBase(@Validated @RequestBody AddCourseDto addCourseDto) {
//      将来会集成SpringSecurity框架,用户登录之后就可以获取到用户所属机构的ID
//      先把机构ID写死
        return courseBaseInfoService.createCourseBase(10086L,addCourseDto);
    }

2.6 效果图

image-20231115000310216

image-20231115000319523

之后点击保存,这个时候会报错一个404,因为后面课程大纲的内容还没有编写

再查看数据库

image-20231115000356970

再通过页面查看一下,还是挺带劲的

image-20231115000508921

三、修改课程

涉及的表也是course_base课程基本信息表、course_market课程营销表

其实就是比添加课程多了一个数据回显而已

3.1 需求分析

点击编辑按钮就可以修改课程信息

image-20231115234017461

要修改的表单内容其实是和添加课程时的表单是一个样子的

然后这个地方点击编辑的时候要做一个数据回显

image-20231115234241162

image-20231115234253071

修改课程的请求数据只是比添加课程的请求数据多了一个课程id而已

但是没有营销信息

image-20231215223126640

3.2 数据回显

image-20231215222839372

3.2.1 Service类

这个方法之前其实写过

    @Override
    public CourseBaseInfoDto getCourseBaseInfo(Long courseId){

        //TODO 查询课程基本信息
        CourseBase courseBase = courseBaseMapper.selectById(courseId);
        if(courseBase == null){
            return null;
        }
        //TODO 查询课程营销信息
        CourseMarket courseMarket = courseMarketMapper.selectById(courseId);
        CourseBaseInfoDto courseBaseInfoDto = new CourseBaseInfoDto();
        BeanUtils.copyProperties(courseBase,courseBaseInfoDto);
        if(courseMarket != null){
            BeanUtils.copyProperties(courseMarket,courseBaseInfoDto);
        }

        //TODO 查询分类名称,是哪一级的
        CourseCategory courseCategoryBySt = courseCategoryMapper.selectById(courseBase.getSt());//小分类
        courseBaseInfoDto.setStName(courseCategoryBySt.getName());//小分类名称

        CourseCategory courseCategoryByMt = courseCategoryMapper.selectById(courseBase.getMt());//大分类
        courseBaseInfoDto.setMtName(courseCategoryByMt.getName());//大分类名称

        return courseBaseInfoDto;

    }

3.2.2 Controller类

    @ApiOperation("根据课程id查询接口")
    @GetMapping("/course/{courseId}")
    public CourseBaseInfoDto getCourseBaseById(@PathVariable("courseId") Long courseId) {
        return courseBaseInfoService.getCourseBaseInfo(courseId);
    }

3.3 修改课程

3.3.1 修改课程Dto

修改课程的请求数据只比增加课程的请求数据多一个课程id

/**
 * 修改课程Dto
 */
@Data
@ApiModel(value = "EditCourseDto",description = "修改课程基本信息")
public class EditCourseDto extends AddCourseDto{

    @ApiModelProperty(value = "课程id",required = true)
    private Long id;
}

3.3.2 Service

    /**
     * 修改课程
     *
     * @param companyId     机构id,后面做认证收取那使用
     * @param editCourseDto 要修改的课程信息
     * @return 修改之后的课程详细信息
     */
    @Override
    public CourseBaseInfoDto updateCourseBase(Long companyId, EditCourseDto editCourseDto) {
        //TODO 课程基本信息
        //获取到课程id
        Long courseId = editCourseDto.getId();
        //查询课程
        CourseBase courseBase = courseBaseMapper.selectById(courseId);

        if (courseBase == null) {
            XueChengPlusException.cast("课程不存在");
        }
        //数据合法性校验
        //根据具体的业务逻辑进行校验 - 本机构只能修改本机构的课程
        if (!companyId.equals(courseBase.getCompanyId())) {
            XueChengPlusException.cast("本机构只能修改本机构的课程");
        }

        //封装数据
        BeanUtils.copyProperties(editCourseDto, courseBase);
        //修改时间
        courseBase.setChangeDate(LocalDateTime.now());
        //更新数据库
        int i = courseBaseMapper.updateById(courseBase);
        if (i<=0){
            XueChengPlusException.cast("修改课程失败");
        }

        //TODO 更新课程营销信息
        CourseMarket courseMarketNew = new CourseMarket();
        BeanUtils.copyProperties(editCourseDto, courseMarketNew);
        int count = courseMarketMapper.updateById(courseMarketNew);
        if (count <= 0) {
            throw new RuntimeException("更新课程营销信息失败");
        }

        //查询课程信息
        CourseBaseInfoDto courseBaseInfo = getCourseBaseInfo(courseId);

        return courseBaseInfo;
    }

3.3.3 Controller

    @ApiOperation("修改课程接口")
    @PutMapping("/course")
    public CourseBaseInfoDto getCourseBaseById(@RequestBody EditCourseDto editCourseDto) {

        //机构id先写死,后面授权认证的时候后会改过来
        Long companyId = 1232141425L;
        return courseBaseInfoService.updateCourseBase(companyId,editCourseDto);
    }

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

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

相关文章

【linux】SSH终端Putty配置:文件上传/下载、显示中文字体、自动登录

文章目录 写在前面putty上传/下载文件1. 下载2. 解压和配置3. 使用sz/rz3.1 下载文件:sz3.2 上传文件:rz 显示中文字体1. 下载合适的字体2. 解压和安装3. putty配置 putty自动登录1. putty配置2. putty快捷方式配置3. 使用putty 写在后面 写在前面 一篇博客介绍了12种SSH终端工…

福德植保无人机工厂:创新科技与绿色农业的完美结合

亲爱的读者们&#xff0c;欢迎来到福德植保无人机工厂的世界。这里&#xff0c;科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者&#xff0c;以其领先的无人机技术&#xff0c;创新的理念&#xff0c;为我们展示了一种全新的农业服…

C++共享和保护——(4)保护共享数据

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 一滴汗珠万粒粮&#xff0c;万粒汗珠谷…

Scala多线程爬虫程序的数据可视化与分析实践

一、Scala简介 Scala是一种多种类型的编程语言&#xff0c;结合了针对对象编程和函数式编程的功能。它运行在Java虚拟机上&#xff0c;具有强大的运算能力和丰富的库支持。Scala常用于大数据处理、并发编程和Web应用程序开发。其灵活性和高效性编程成为编写多线程爬虫程序的理…

SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?

文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里&#xff0c;MVCC的实现机制是不同的。本节我们会以InnoDB举例&#xff0c;讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念&#xff1a; 事务版本号行记录的隐藏…

02.微服务组件 Eureka注册中心

1.Eureka注册中心 服务提供者与消费者&#xff1a; 服务提供者:一次业务中&#xff0c;被其它微服务调用的服务。(提供接口给其它微服务)服务消费者:一次业务中&#xff0c;调用其它微服务的服务。&#xff08;调用其它微服务提供的接口)一个服务是消费者还是提供者&#xff…

Apache Flink(十五):Flink任务提交模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

响应式布局2:手写响应式导航栏(BootStrap实现以及原生实现)

1.响应式导航栏介绍 响应式导航栏是一种在不同设备和屏幕尺寸下自适应布局和显示的导航栏。它可以根据用户所使用的设备&#xff08;如桌面电脑、平板电脑或手机&#xff09;自动调整其外观和交互方式&#xff0c;以提供更好的用户体验。 pc端&#xff1a; 手机端&#xff1a…

网络编程『socket套接字 ‖ 简易UDP网络程序』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文1.预备知识1.1.IP地址1.2.端口号1.3.端口号与进…

【具身智能评估6】Habitat 3.0: A Co-Habitat for Humans, Avatars and Robots

论文标题&#xff1a;Habitat 3.0: A Co-Habitat for Humans, Avatars and Robots 论文作者&#xff1a;Xavier Puig, Eric Undersander, Andrew Szot, Mikael Dallaire Cote, Tsung-Yen Yang, Ruslan Partsey, Ruta Desai, Alexander William Clegg, Michal Hlavac, So Yeon M…

出国旅游需要注意些什么

出国旅游是一种令人兴奋、令人期待的经历。然而&#xff0c;在进行这种经历之前&#xff0c;有几件事情是需要注意的。本文将为您介绍出国旅游需要注意的一些重要事项。首先&#xff0c;为了确保您的出国旅行顺利进行&#xff0c;您应该提前办理好您的签证和护照。不同国家对于…

JAVA主流日志框架梳理学习及使用

前言&#xff1a;目前市面上有挺多JAVA的日志框架&#xff0c;比如JUL(JDK自带的日志框架),Log4j,Logback,Log4j2等&#xff0c;有人可能有疑问说还有slf4j&#xff0c;不过slf4j不是一种日志框架的具体实现&#xff0c;而是一种日志门面&#xff08;日志门面可以理解为是一种统…

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差&#xff0c;不利于在不同规模的数据集上有效运行若输入维度发生变化&#xff0c;需要修改并重新训练网络容易过拟合 全连接导致参数量特别多&#xff0c;容易过拟合如果增加更多层&#xff0c;参数量会翻倍无法有效利用局部特征 输入…

【华为数据之道学习笔记】5-9图模型设计

图模型作为当前流行的信息处理加工技术&#xff0c;自提出以来&#xff0c;迅速在学术界和工业界得到了普及&#xff0c;在智能推荐、决策分析等方面有着广泛的应用。 图模型由节点和边组成。节点表示实体或概念&#xff0c;边则由属性或关系构成。实体指的是具有可区别性且独立…

区域和检索算法(leetcode第303题)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询:计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a;NumArray(int[] nums) 使用数组…

Spark编程实验二:RDD编程初级实践

目录 一、目的与要求 二、实验内容 三、实验步骤 1、pyspark交互式编程 2、编写独立应用程序实现数据去重 3、编写独立应用程序实现求平均值问题 4、三个综合实例 四、结果分析与实验体会 一、目的与要求 1、熟悉Spark的RDD基本操作及键值对操作&#xff1b; 2、熟悉使…

Flutter ios 使用ListView 。滚动时 AppBar 改变颜色问题

在Ios 中 列表滚动条向下滚动一段距离后 会导致 AppBar 颜色改变 可以给 AppBar 或者 AppBarTheme。 scrolledUnderElevation: 0.0 属性 全局&#xff1a; MaterialApp(theme: ThemeData(appBarTheme: AppBarTheme(scrolledUnderElevation: 0.0)) ) 局部&#xff1a; App…

C语言判断素数(求素数)(两种方法)

素数又称质数。所谓素数是指除了 1 和它本身以外&#xff0c;不能被任何整数整除的数&#xff0c;例如17就是素数&#xff0c;因为它不能被 2~16 的任一整数整除。 思路1)&#xff1a;因此判断一个整数m是否是素数&#xff0c;只需把 m 被 2 ~ m-1 之间的每一个整数去除&#…

Mybatis-Plus之内置接口(一起了解Mybatis-Plus的内置接口)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Mybatis-Plus系列》。&#x1…

飞天使-jumpserver-docker跳板机安装

文章目录 jumpserverdocker 更新到最新下载安装包mysql启动mysql 命令 验证字符集,创建数据库使用jumpserver 进行连接测试 redis部署jumpserver 写入变量建jumpserver 容器正确输出登录验证 jumpserver 基础要求 硬件配置: 2 个 CPU 核心, 4G 内存, 50G 硬盘&#xff08;最低…