【云岚到家】-day02-1-区域服务后续开发及完善

news2024/11/24 4:24:21

【云岚到家】-day02-1-区域服务后续开发及完善

  • 1 区域服务后续开发
    • 1.1 添加区域服务
      • 1.1.1 接口定义
        • 1.1.1.1 接口设计
        • 1.1.1.2 接口定义-json
      • 1.1.2 接口开发
        • 1.1.2.1 mapper
        • 1.1.2.2 service
        • 1.1.2.3 controller
      • 1.1.3 测试
    • 1.2 修改价格
      • 1.2.1 接口定义
        • 1.2.1.1 接口设计
        • 1.2.1.2 接口定义-form表单
      • 1.2.2 接口开发
        • 1.2.2.1 mapper
        • 1.2.2.2 service
        • 1.2.2.3 controller
      • 1.2.3 测试
    • 1.3 服务上架
      • 1.3.1 接口定义
        • 1.3.1.1 接口设计
        • 1.3.1.2 接口定义-form表单格式
      • 1.3.2 接口开发
        • 1.3.2.1 mapper
        • 1.3.2.2 service
        • 1.3.2.3 controller
      • 1.3.3 测试
    • 1.4 删除区域服务开发
      • 1.4.1 接口定义
        • 1.4.1.1 接口设计
        • 1.4.1.2 接口定义-form表单
      • 1.4.2 接口开发
        • 1.4.2.1 mapper
        • 1.4.2.2 service
        • 1.4.2.3 controller
      • 1.4.3 测试
    • 1.5 区域服务下架开发
      • 1.5.1 mapper
      • 1.5.2 service
      • 1.5.3 controller
      • 1.5.4 测试
    • 1.6 设置热门开发
      • 1.6.1 mapper
      • 1.6.2 service
      • 1.6.3 controller
      • 1.6.4 测试
    • 1.7 取消热门开发
      • 1.7.1 mapper
      • 1.7.2 service
      • 1.7.3 controller
      • 1.7.4 测试
    • 1.8 启用区域功能完善
      • 1.8.1 创建按区域id和状态查询的mapper
      • 1.8.2 增加校验逻辑
    • 1.9 禁用区域功能完善
      • 1.9.1 增加校验逻辑
    • 1.10 禁用服务项功能完善
      • 1.10.1 创建按服务项id和状态查询的mapper
      • 1.10.2 增加校验逻辑


1 区域服务后续开发

1.1 添加区域服务

1.1.1 接口定义

1.1.1.1 接口设计

下边设计添加区域服务接口,重点设计:传入参数类型、参数内容、响应结果内容。

根据界面原型梳理操作流程:

首先进入某个区域的服务列表:

在这里插入图片描述

点击添加服务,如下图:
在这里插入图片描述

选择要添加到区域中的服务,点击“添加”按钮。

最终向serve表添加数据。

serve表存储了区域中开通的服务,根据字段信息思考数据来源:

字段名含义数据来源
id服务id主键,自动生成
serve_item_id服务项id接口传入
region_id区域id接口传入
city_code城市编码根据区域id查询region表得到
sale_status售卖状态默认为草稿状态,数据库设置了默认值
price价格默认为服务项的价格,用户可修改
is_hot是否为热门默认为非热门,数据库设置了默认值
hot_time_stamp更新为热门的时间戳默认空
create_time创建时间数据库设置了默认值
update_time更新时间数据库设置了默认值
create_by创建人由framework的MyBatisAutoFillInterceptor自动处理
update_by更新人由framework的MyBatisAutoFillInterceptor自动处理

根据上边的分析,通过接口传入服务项id、区域id、价格,支持多个服务传入,实现批量添加。

传入参数内容为数组,所以使用json格式。

传入参数内容包括:服务项id、区域id、价格。

响应结果内容可为空,前端根据状态码判断是否添加成功。

接口设计信息:

接口路径:POST/foundations/operation/serve/batch

请求数据类型 application/json

在这里插入图片描述

在这里插入图片描述

1.1.1.2 接口定义-json

controller

@PutMapping("/batch")
@ApiOperation("批量添加区域服务")
public void batch(@RequestBody List<ServeUpsertReqDTO> serveUpsertReqDTOList) {
    return;
}

批量添加的请求参数用List来接收,@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。而GET请求一般是key-value格式,则不用添加@RequestBody

查看接口文档:

重启服务,查看swagger文档如下:

在这里插入图片描述

1.1.2 接口开发

1.1.2.1 mapper

添加接口只向serve表添加数据所以使用mybatisplus提供的单表CRUD方法即可无需自定义mapper接口。

1.1.2.2 service

定义service接口:

void batchAdd(List<ServeUpsertReqDTO> serveUpsertReqDTOList);

定义service实现方法:

@Resource
private ServeItemMapper serveItemMapper;
@Resource
private RegionMapper regionMapper;

/**
 * 批量添加区域服务
 * @param serveUpsertReqDTOList
 */
@Override
@Transactional
public void batchAdd(List<ServeUpsertReqDTO> serveUpsertReqDTOList) {
    for (ServeUpsertReqDTO serveUpsertReqDTO : serveUpsertReqDTOList) {
        //1.校验服务项是否为启用状态,不是启用状态不能新增
        ServeItem serveItem = serveItemMapper.selectById(serveUpsertReqDTO.getServeItemId());
        //如果服务项信息不存在或未启用
        if(ObjectUtil.isNull(serveItem) || serveItem.getActiveStatus()!= FoundationStatusEnum.ENABLE.getStatus()){
            throw new ForbiddenOperationException("该服务未启用无法添加到区域下使用");
        }

        //2.校验是否重复新增
        Integer count = lambdaQuery()
                .eq(Serve::getRegionId, serveUpsertReqDTO.getRegionId())
                .eq(Serve::getServeItemId, serveUpsertReqDTO.getServeItemId())
                .count();
        if(count>0){
            throw new ForbiddenOperationException(serveItem.getName()+"服务已存在");
        }

        //3.新增服务
        Serve serve = BeanUtil.toBean(serveUpsertReqDTO, Serve.class);
        Region region = regionMapper.selectById(serveUpsertReqDTO.getRegionId());
        serve.setCityCode(region.getCityCode());
        baseMapper.insert(serve);
    }

}

说明:

对于增、删、改类的接口通常会先进行入参校验,校验失败抛出异常,由异常处理器统一对异常进行处理。

我们抛出的异常是自定义异常类型,自定义的异常类型都继承了CommonException类型,在异常处理器中对此类型的异常进行处理。

异常处理器的源码在jzo2o-framework中,如下图:

在这里插入图片描述

通过@RestControllerAdvice注解加@ExceptionHandler注解实现,具体的原理是当controller抛出异常由DispatcherServlet统一拦截处理,再根据异常类型找到@ExceptionHandler标识方法去执行该方法进行异常处理。

1.1.2.3 controller

在controller方法中调用service接口添加区域服务。

@PostMapping("/batch")
@ApiOperation("批量添加区域服务")
public void batch(@RequestBody List<ServeUpsertReqDTO> serveUpsertReqDTOList) {
    serveService.batchAdd(serveUpsertReqDTOList);
}

1.1.3 测试

我们通过前后端联调测试添加区域服务接口。

启动foundations服务和gateway服务。

通过cmd进入project-xzb-pc-admin-vue3-java目录启动前端项目

运行命令,启动前端工程

npm run dev 

因为代码是我们写的,我们在前后端联调时除了测试成功结果还要测试失败结果。

下边我们先测试成功结果。

进入运营管理端,点击“区域管理”菜单,点击“设置服务”

在这里插入图片描述

区域服务列表如下图:

在这里插入图片描述

点击添加服务

在这里插入图片描述

点击添加服务,如下图:

在这里插入图片描述

添加成功查询区域服务列表是否存在已添加的服务。

如果列表没有显示已添加的服务则需要进行排查,可以进入数据库直接查询serve表查看是否添加成功,如果后台的错误日志需要根据错误日志进行排查。

下边测试失败结果。

在这里插入图片描述

1.2 修改价格

1.2.1 接口定义

1.2.1.1 接口设计

根据界面原型设计传入参数类型、参数内容、响应结果内容。

进入修改界面
在这里插入图片描述

输入价格进行修改

在这里插入图片描述

传入参数内容:价格、区域服务ID(serve表主键)

根据id更新serve表的价格字段。

传入参数类型:form表单格式

响应结果内容可为空,前端根据状态码判断是否添加成功。

接口设计信息如下:

接口路径:PUT/foundations/operation/serve/{id}

请求数据类型 application/x-www-form-urlencoded
在这里插入图片描述
在这里插入图片描述

1.2.1.2 接口定义-form表单

编写controller方法,HTTP方法使用PUT方式,代码如下:

PUT/foundations/operation/serve/{id}从url中接,用@PathVariable,id是从url中获取,而price是前端传过来了的,所以用 @RequestParam来接收。

@PutMapping("/{id}")
@ApiOperation("区域服务价格修改")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class),
        @ApiImplicitParam(name = "price", value = "价格", required = true, dataTypeClass = BigDecimal.class)
})
public void update( @PathVariable("id") Long id,
                    @RequestParam("price") BigDecimal price) {

}

1.2.2 接口开发

1.2.2.1 mapper

修改接口只向serve表更新数据所以使用mybatisplus提供的单表CRUD方法即可无需自定义mapper接口。

1.2.2.2 service

定义service接口:

Serve update(Long id, BigDecimal price);

返回修改后的Serve类型有助于我们后期做缓存,就不用再查了。

定义service实现方法:

@Override
@Transactional
public Serve update(Long id, BigDecimal price) {
    //1.更新服务价格
    boolean update = lambdaUpdate()
            .eq(Serve::getId, id)
            .set(Serve::getPrice, price)
            .update();
    if(!update){
        throw new CommonException("修改服务价格失败");
    }
    return baseMapper.selectById(id);
}
1.2.2.3 controller

在controller方法中调用service接口价格修改。

@PutMapping("/{id}")
@ApiOperation("区域服务价格修改")
@ApiImplicitParams({
    @ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class),
    @ApiImplicitParam(name = "price", value = "价格", required = true, dataTypeClass = BigDecimal.class)
})
public void update(@PathVariable("id") Long id,
          @RequestParam("price") BigDecimal price) {
  serveService.update(id, price);
}

1.2.3 测试

在这里插入图片描述

查看控制台

在这里插入图片描述

测试成功

1.3 服务上架

1.3.1 接口定义

1.3.1.1 接口设计

根据业务流程、界面原型进行设计。

在区域服务列表中点击“上架”,此服务在该区域将生效,用户即可对该服务进行下单。

在这里插入图片描述

业务流程如下:

在这里插入图片描述

在serve表有一个售卖状态sale_status,服务上架后将状态更改为“上架”,代码为2。

下边分析接口的传入参数类型、参数内容、响应结果内容。

传入参数内容:服务Id(serve表的主键),

传入参数类型:form表单格式

响应结果内容: 内容可为空,前端根据状态码判断是否添加成功。

注意:区分 服务id和服务项id,服务id即serve表的主键,服务项id即serve_item表的主键。

接口信息如下:

接口路径:PUT/foundations/operation/serve/onSale/{id}

请求数据类型 application/x-www-form-urlencoded

在这里插入图片描述

在这里插入图片描述

1.3.1.2 接口定义-form表单格式

编写controller方法,HTTP方法使用PUT方式,代码如下:

@PutMapping("/onSale/{id}")
@ApiOperation("区域服务上架")
@ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class)
public void onSale(@PathVariable("id") Long id) {
    return;
}

1.3.2 接口开发

1.3.2.1 mapper

服务上架最终修改serve表的状态,所以使用mybatisplus提供的单表CRUD方法即可无需自定义mapper接口。

1.3.2.2 service

定义service接口:

Serve onSale(Long id);

实现:

@Override
@Transactional
public Serve onSale(Long id) {
    //1.校验服务是否存在
    Serve serve = baseMapper.selectById(id);
    if(ObjectUtil.isNull(serve)){
        throw new ForbiddenOperationException("区域服务不存在");
    }
    //2.校验服务状态是否为草稿或下架状态
    if(serve.getSaleStatus()!= FoundationStatusEnum.INIT.getStatus() || serve.getSaleStatus()!= FoundationStatusEnum.DISABLE.getStatus()){
        throw new ForbiddenOperationException("服务状态不为草稿或下架状态,无法上架");
    }
    //3.校验服务项是否为启用状态
    ServeItem serveItem = serveItemMapper.selectById(serve.getServeItemId());
    if(serveItem.getActiveStatus()!= FoundationStatusEnum.ENABLE.getStatus()){
        throw new ForbiddenOperationException("本服务所属的服务项未启用,无法上架");
    }
    //4.更新服务状态为上架
    boolean update = lambdaUpdate()
            .eq(Serve::getId, id)
            .set(Serve::getSaleStatus, FoundationStatusEnum.ENABLE.getStatus())
            .update();
    if(!update){
        throw new CommonException("服务上架失败");
    }
    return baseMapper.selectById(id);
}
1.3.2.3 controller
@PutMapping("/onSale/{id}")
@ApiOperation("区域服务上架")
@ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class)
public void onSale(@PathVariable("id") Long id) {
    serveService.onSale(id);
}

1.3.3 测试

在这里插入图片描述

上架成功

1.4 删除区域服务开发

1.4.1 接口定义

1.4.1.1 接口设计

根据业务流程、界面原型进行设计。

在区域服务列表中点击“删除”,此服务在该区域将删除。

业务流程如下:
在这里插入图片描述

在serve表中删除该服务。

下边分析接口的传入参数类型、参数内容、响应结果内容。

传入参数内容:服务Id(serve表的主键),

传入参数类型:form表单格式

响应结果内容: 内容可为空,前端根据状态码判断是否添加成功。

注意:区分 服务id和服务项id,服务id即serve表的主键,服务项id即serve_item表的主键。

接口信息如下:

接口路径:DELETE/foundations/operation/serve/{id}

请求数据类型 application/x-www-form-urlencoded

在这里插入图片描述

1.4.1.2 接口定义-form表单
@DeleteMapping("/{id}")
@ApiOperation("区域服务删除")
@ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class)
public void delete(@PathVariable("id") Long id) {
    return;
}

1.4.2 接口开发

1.4.2.1 mapper

服务上架最终修改serve表的状态,所以使用mybatisplus提供的单表CRUD方法即可无需自定义mapper接口。

1.4.2.2 service

定义service接口:

void delete(Long id);

实现:

@Override
@Transactional
public void delete(Long id) {
    //1.校验服务是否存在
    Serve serve = baseMapper.selectById(id);
    if(ObjectUtil.isNull(serve)){
        throw new ForbiddenOperationException("区域服务不存在");
    }
    //2.校验服务状态是否为草稿状态
    if(serve.getSaleStatus()!= FoundationStatusEnum.INIT.getStatus()){
        throw new ForbiddenOperationException("服务状态不为草稿状态,无法删除");
    }
    //3.删除服务
    baseMapper.deleteById(id);
}
1.4.2.3 controller
@DeleteMapping("/{id}")
@ApiOperation("区域服务删除")
@ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class)
public void delete(@PathVariable("id") Long id) {
    serveService.delete(id);
}

1.4.3 测试

在这里插入图片描述

1.5 区域服务下架开发

业务流程:

接口文档:

在这里插入图片描述

1.5.1 mapper

服务上架最终修改serve表的状态,所以使用mybatisplus提供的单表CRUD方法即可无需自定义mapper接口。

1.5.2 service

接口:

void offSale(Long id);

实现:

@Override
@Transactional
public void offSale(Long id) {
    //1.校验服务是否存在
    Serve serve = baseMapper.selectById(id);
    if(ObjectUtil.isNull(serve)){
        throw new ForbiddenOperationException("区域服务不存在");
    }
    //2.校验服务状态是否为上架状态
    if(serve.getSaleStatus()!= FoundationStatusEnum.ENABLE.getStatus()){
        throw new ForbiddenOperationException("服务状态不为上架状态,无法下架");
    }
    //3.更新服务状态为下架
    boolean update = lambdaUpdate()
            .eq(Serve::getId, id)
            .set(Serve::getSaleStatus, FoundationStatusEnum.DISABLE.getStatus())
            .update();
    if(!update){
        throw new CommonException("服务下架失败");
    }
}

1.5.3 controller

@PutMapping("/offSale/{id}")
@ApiOperation("区域服务下架")
@ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class)
public void offSale(@PathVariable("id") Long id) {
    serveService.offSale(id);
}

1.5.4 测试

在这里插入图片描述

1.6 设置热门开发

要求:实现更新serve表的是否热门字段。

接口文档:

在这里插入图片描述

1.6.1 mapper

服务上架最终修改serve表的状态,所以使用mybatisplus提供的单表CRUD方法即可无需自定义mapper接口。

1.6.2 service

接口:

Serve onHot(Long id);

实现:

@Override
@Transactional
public Serve onHot(Long id) {
    //1.校验服务是否存在
    Serve serve = baseMapper.selectById(id);
    if(ObjectUtil.isNull(serve)){
        throw new ForbiddenOperationException("区域服务不存在");
    }
    //2.校验服务状态是否为上架状态
    if(serve.getSaleStatus()!= FoundationStatusEnum.ENABLE.getStatus()){
        throw new ForbiddenOperationException("服务状态不为上架状态,无法设置热门");
    }
    //3.更新服务状态为热门
    boolean update = lambdaUpdate()
            .eq(Serve::getId, id)
            .set(Serve::getIsHot, FoundationStatusEnum.ONHOT.getStatus())
            .update();
    if(!update){
        throw new CommonException("服务设置热门失败");
    }
    return baseMapper.selectById(id);
}

1.6.3 controller

@PutMapping("/onHot/{id}")
@ApiOperation("区域服务设置热门")
@ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class)
public void onHot(@PathVariable("id") Long id) {
    serveService.onHot(id);
}

1.6.4 测试

在这里插入图片描述

在这里插入图片描述

1.7 取消热门开发

要求:实现更新serve表的是否热门字段。

接口文档:

在这里插入图片描述

1.7.1 mapper

服务上架最终修改serve表的状态,所以使用mybatisplus提供的单表CRUD方法即可无需自定义mapper接口。

1.7.2 service

接口:

Serve offHot(Long id);

实现:

@Override
@Transactional
public Serve offHot(Long id) {
    //1.校验服务是否存在
    Serve serve = baseMapper.selectById(id);
    if(ObjectUtil.isNull(serve)){
        throw new ForbiddenOperationException("区域服务不存在");
    }
    //2.校验服务状态是否为上架状态
    if(serve.getSaleStatus()!= FoundationStatusEnum.ENABLE.getStatus()){
        throw new ForbiddenOperationException("服务状态不为上架状态,无法取消热门");
    }
    //3.更新服务状态为非热门
    boolean update = lambdaUpdate()
            .eq(Serve::getId, id)
            .set(Serve::getIsHot, FoundationStatusEnum.OFFHOT.getStatus())
            .update();
    if(!update){
        throw new CommonException("服务取消热门失败");
    }
    return baseMapper.selectById(id);
}

1.7.3 controller

@PutMapping("/offHot/{id}")
@ApiOperation("区域服务取消热门")
@ApiImplicitParam(name = "id", value = "服务id", required = true, dataTypeClass = Long.class)
public void offHot(@PathVariable("id") Long id) {
    serveService.offHot(id);
}

1.7.4 测试

同1.6.4

1.8 启用区域功能完善

业务流程:

在这里插入图片描述

增加校验:区域下存在上架的服务方可启用。

1.8.1 创建按区域id和状态查询的mapper

在com.jzo2o.foundations.mapper.ServeMapper中创建

List<ServeResDTO> queryServeListByRegionIdAndStatus(@Param("regionId") Long regionId, @Param("status") Integer status);

xml

<select id="queryServeListByRegionIdAndStatus"
        resultType="com.jzo2o.foundations.model.dto.response.ServeResDTO">
    SELECT
    st.id serve_type_id,
        si.NAME serve_item_name,
        s.update_time update_time,
        s.sale_status sale_status,
        si.id serve_item_id,
        si.reference_price reference_price,
        s.create_time create_time,
        s.region_id region_id,
        s.price price,
        s.id id,
        s.is_hot is_hot,
        st.NAME serve_type_name
    FROM
        serve s
            INNER JOIN serve_item si ON s.serve_item_id = si.id
            INNER JOIN serve_type st ON si.serve_type_id = st.id
    WHERE
        region_id = #{regionId} AND sale_status = #{status}
</select>

1.8.2 增加校验逻辑

在com.jzo2o.foundations.service.impl.RegionServiceImpl#active方法中

//如果需要启用区域,需要校验该区域下是否有上架的服务
List<ServeResDTO> serveResDTOS = serveMapper.queryServeListByRegionIdAndStatus(region.getId(), FoundationStatusEnum.ENABLE.getStatus());
if (serveResDTOS.size() == 0) {
    throw new ForbiddenOperationException("区域内无可用的上架服务,无法启用");
}

1.9 禁用区域功能完善

业务流程:
在这里插入图片描述

增加校验:区域下不存在上架的服务方可禁用。

1.9.1 增加校验逻辑

在com.jzo2o.foundations.service.impl.RegionServiceImpl#deactivate方法中

List<ServeResDTO> serveResDTOS = serveMapper.queryServeListByRegionIdAndStatus(region.getId(), FoundationStatusEnum.ENABLE.getStatus());
if (serveResDTOS.size() > 0) {
    throw new ForbiddenOperationException("区域内有上架服务,无法禁用");
}

1.10 禁用服务项功能完善

业务流程

在这里插入图片描述

1.10.1 创建按服务项id和状态查询的mapper

在com.jzo2o.foundations.mapper.ServeMapper中创建

List<ServeResDTO> queryServeListByServeItemIdAndStatus(@Param("serveItemId") Long serveItemId, @Param("status") Integer status);

xml

<select id="queryServeListByServeItemIdAndStatus"
        resultType="com.jzo2o.foundations.model.dto.response.ServeResDTO">
    SELECT
        st.id serve_type_id,
        si.NAME serve_item_name,
        s.update_time update_time,
        s.sale_status sale_status,
        si.id serve_item_id,
        si.reference_price reference_price,
        s.create_time create_time,
        s.region_id region_id,
        s.price price,
        s.id id,
        s.is_hot is_hot,
        st.NAME serve_type_name
    FROM
        serve s
            INNER JOIN serve_item si ON s.serve_item_id = si.id
            INNER JOIN serve_type st ON si.serve_type_id = st.id
    WHERE
        serve_item_id = #{serveItemId} AND sale_status = #{status}
</select>

1.10.2 增加校验逻辑

在com.jzo2o.foundations.service.impl.ServeItemServiceImpl#deactivate中

//有区域在使用该服务将无法禁用(存在关联的区域服务且状态为上架表示有区域在使用该服务项)
List<ServeResDTO> serveResDTOS = serveMapper.queryServeListByServeItemIdAndStatus(id, FoundationStatusEnum.ENABLE.getStatus());
if (serveResDTOS.size() > 0) {
    throw new ForbiddenOperationException("存在关联的区域服务且状态为上架表示有区域在使用该服务项");
}

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

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

相关文章

【RAG入门教程01】Langchian框架 v0.2介绍

LangChain 是一个开源框架&#xff0c;旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…

动态规划(多重背包+完全背包)

P2851 [USACO06DEC] 最少的硬币 G 题解&#xff1a;从题目上看到那个有n种不同的货币&#xff0c;对于买家来说每个货币有C[ i ]个&#xff0c;是有限个数的&#xff0c;但是对于卖家来说 每个货币都是无限的&#xff0c;题目中要我们求的是买到这个物品的最小交易的货币数&…

电子设计入门教程硬件篇之集成电路IC(二)

前言&#xff1a;本文为手把手教学的电子设计入门教程硬件类的博客&#xff0c;该博客侧重针对电子设计中的硬件电路进行介绍。本篇博客将根据电子设计实战中的情况去详细讲解集成电路IC&#xff0c;这些集成电路IC包括&#xff1a;逻辑门芯片、运算放大器与电子零件。电子设计…

燃料电池汽车践行者

前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 见《燃料电池发电系统详解》 见《燃料电池电动汽车详解》 见《氢燃料电池汽车行业发展》 现代汽车&#xff08;中国&#xff09; 现代汽车集团&#xff0c;自1998年成立氢燃料电池研发小组以来深耕氢燃料电池技术&am…

计算机操作系统基础知识:操作系统体系结构图,操作系统的内核,大内核与微内核的区别和优缺点,时钟管理,原语

1.操作系统体系结构图&#xff1a; 2.操作系统的内核&#xff1a; 时钟管理&#xff1a;利用时钟中断实现计时功能。 原语&#xff1a;原语是一种特殊的程序&#xff0c;具有原子性。也就是说&#xff0c;这段程序运行必须一气呵成&#xff0c;不能被中断。 ubuntu、centos的…

VUE3 学习笔记(13):VUE3 下的Element-Plus基本使用

UI是页面的门面&#xff0c;一个好的UI自然令人赏心悦目&#xff1b;国人团队开发的ElementUI在众多UI中较为常见&#xff0c;因此通过介绍它的使用让大家更好的了解第三方UI的使用。 安装 Npm install element-plus --save 或 Cnpm install element-plus --save 配置 全局配置…

Vitis HLS 学习笔记--循环边界包含变量

目录 1. 简介 2. 分析与详解 2.1 未优化 2.2 LOOP_TRIPCOUNT 优化指令 2.3 重写变量循环边界 3. 总结 1. 简介 在硬件设计中&#xff0c;循环的迭代次数通常需要是固定的&#xff0c;因为这有助于资源的预分配和时序分析。 循环边界包含变量意味着循环的迭代次数不是固…

MySQL之多表查询—表子查询

一、引言 上一篇博客学习了行子查询。&#xff08;看弹幕&#xff1a;同一张表用or,不同张表用union&#xff09; 下面接着学习子查询当中的最后一种——表子查询。 表子查询 1、概念 子查询返回的结果是多行多列&#xff0c;这种子查询称为表子查询。 2、常用的操作符 IN 3、…

2024海南省大数据教师培训-Hadoop集群部署

前言 本文将详细介绍Hadoop分布式计算框架的来源&#xff0c;架构和应用场景&#xff0c;并附上最详细的集群搭建教程&#xff0c;能更好的帮助各位老师和同学们迅速了解和部署Hadoop框架来进行生产力和学习方面的应用。 一、Hadoop介绍 Hadoop是一个开源的分布式计算框架&…

使用Nextjs学习(学习+项目完整版本)

创建项目 运行如下命令 npx create-next-app next-create创建项目中出现的各种提示直接走默认的就行,一直回车就行了 创建完成后进入到项目运行localhost:3000访问页面,如果和我下面页面一样就是创建项目成功了 整理项目 将app/globals.css里面的样式都删除,只留下最上面三…

盲盒抽卡机小程序的特点,互联网下市场发展前景

近几年&#xff0c;盲盒抽卡成为了年轻人的新宠&#xff0c;也受到了未成年人的喜爱&#xff0c;卡牌的内容更是丰富多样&#xff0c;涵盖了动漫、漫画、影视等&#xff0c;因此吸引了各类消费者和越来越多的创业者。 目前&#xff0c;随着市场的发展&#xff0c;抽卡机小程序…

2024HW面试 中高级面试面经背诵笔记(持续更新)

常见数据库的端口&#xff0c;Vnc的端口等 参考答案地址&#xff1a;常见数据库默认端口号_数据库端口-CSDN博客 MySQL 3306 Oracle 1521 DB2 5000 PostgreSQL 5432 MongoDB 27017 Redis 6379 SQL Server 1433 vnc的端口是&#xff1a;5900 推荐一个很好的护网笔记&#xff…

代码随想录刷题笔记-哈希表篇

文章目录 242 有效的字母异位词(easy)力扣地址题目描述题目实例解题思路代码实现 383 赎金信(easy)力扣地址题目描述题目实例解题思路代码实现 49 字母异位词分组(mid)力扣地址题目描述题目实例解题思路代码实现 438 找到字符串中所有字母异位词(mid)力扣地址题目描述题目实例解…

802.11漫游流程简单解析与笔记_Part1

最近在进行和802.11漫游有关的工作&#xff0c;需要对wpa_supplicant认证流程和漫游过程有更多的了解&#xff0c;所以通过阅读论文等方式&#xff0c;记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

Leetcode3040. 相同分数的最大操作数目 II

Every day a Leetcode 题目来源&#xff1a;3040. 相同分数的最大操作数目 II 解法1&#xff1a;记忆化搜索 第一步可以做什么&#xff1f;做完后&#xff0c;剩下要解决的问题是什么&#xff1f; 删除前两个数&#xff0c;剩下 nums[2] 到 nums[n−1]&#xff0c;这是一个…

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台+数字人)的简介、安装和使用方法、案例应用之详细攻略

AIGC之MetaHuman&#xff1a;HeyGen(基于AI驱动的视频生成平台数字人)的简介、安装和使用方法、案例应用之详细攻略 目录 HeyGen的简介 1、HeyGen是一款AI视频生成平台&#xff0c;它提供以下关键功能&#xff1a; HeyGen的安装和使用方法 1、使用方法 01创建或选择一个头…

2003远程桌面端口修改,远程桌面端口修改的方法有哪些

方法一&#xff1a;通过修改注册表 1、打开注册表编辑器&#xff1a; 打开“开始”菜单&#xff0c;点击“运行”&#xff0c;输入“regedit”&#xff0c;然后按下“Enter”键。 2、导航到远程桌面服务的注册表项&#xff1a; 依次展开以下路径&#xff1a; HKEY_LOCAL_M…

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架&#xff0c;因此C的语法和数据类型在Qt中都是被支持的&#xff0c;但是Qt中也是定义了一些属于自己的数据类型&#xff0c;不过&#xff0c;好多数据类型都是对C的数据类型进行封装&#xff0c;下面来简要介绍一下这些基…

6.切蛋糕

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/71 题目描述 一个圆型的蛋糕,切 𝑛n 刀…

Rust-06-所有权

所有权&#xff08;系统&#xff09;是 Rust 最为与众不同的特性&#xff0c;它让 Rust 无需垃圾回收即可保障内存安全&#xff0c;下面是所有权以及相关功能&#xff1a;借用&#xff08;borrowing&#xff09;、slice 以及 Rust 如何在内存中布局数据。 通过所有权系统管理内…