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

【云岚到家】-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("存在关联的区域服务且状态为上架表示有区域在使用该服务项");
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git发布正式

一般我们开发都是在测试环境开发&#xff0c;开发完成后再发布到正式环境。 一.分支代码合并到主分支1.首先切换到自己的分支(比如分支叫&#xff1a;dev)git checkout dev2.把本地分支拉取下来git pull 或者 git pull origin dev3.切换到主分支mastergit checkout master4.更新…

地图商家数据怎么查看?揭秘采集软件工作原理!

地图商家数据怎么查看&#xff1f;其实主要就是两种方法&#xff1a; 1. 直接使用地图服务提供的API&#xff1a;大多数地图提供商&#xff08;如Google地图&#xff0c;百度地图等&#xff09;都会提供一些API&#xff0c;通过这些API&#xff0c;可以获取到它们所拥有的商家…

FlashBrowser

本例&#xff1a;windows10 下载FlashBrowser 解决flash失效问题&#xff0c;更换浏览器 https://www.flash.cn/ 下载FlashBrowser浏览器

Uber 提升 Presto 集群稳定性的 GC 调优方法

Presto at Uber Uber 利用开源的 Presto 查询各种数据源&#xff0c;无论是流式还是归档数据。Presto 的多功能性赋予我们做出基于数据的明智商业决策的能力。我们在两个地区运行了大约20个 Presto 集群&#xff0c;总共超过10,000个节点。我们有大约12,000个每周活跃用户&…

数字孪生智慧水利:精准管理与智能决策的新时代

图扑数字孪生技术在智慧水利中的应用&#xff0c;通过虚拟模型与真实水利系统的无缝连接&#xff0c;实现对水资源和水利工程的全面监控和精细管理。实时数据采集与动态模拟提升了水利系统的预测和响应能力&#xff0c;从洪水预警到水质监测&#xff0c;数字孪生助力各项决策更…

Unity 从0开始编写一个技能编辑器_02_Buff系统的生命周期

工作也有一年了&#xff0c;对技能编辑器也有了一些自己的看法&#xff0c;从刚接触时的惊讶&#xff0c;到大量工作时觉得有一些设计的冗余&#xff0c;在到特殊需求的修改&#xff0c;运行效率低时的优化&#xff0c;技能编辑器在我眼中已经不再是神圣不可攀的存在的&#xf…

使用Puppeteer生成echarts图片

Puppeteer简介 Puppeteer 是一个用于控制 Headless Chrome 或 Chromium 浏览器的 Node.js 库。它提供了一个高层次的 API&#xff0c;能够让你以编程方式操作浏览器&#xff0c;从而实现自动化任务&#xff0c;比如生成页面截图和 PDF、抓取网页内容、自动化表单提交、UI 测试…

燃料电池汽车践行者

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

Android14 WMS-窗口绘制之relayoutWindow流程(二)-Server端

本文接着如下文章往下讲 Android14 WMS-窗口绘制之relayoutWindow流程(一)-Client端-CSDN博客 然后就到了Server端WMS的核心实现方法relayoutWindow里 WindowManagerService.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server…

【Linux】匿名管道的应用场景 --- 进程池

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

体素技术在AI绘画中的革新作用

随着人工智能技术的不断进步&#xff0c;AI绘画已经成为艺术创作和视觉设计领域的一大趋势。在众多推动AI绘画发展的技术中&#xff0c;体素技术以其独特的优势&#xff0c;正在逐渐改变着我们对计算机生成图像的认识。本文旨在探讨体素技术在AI绘画中的应用与影响&#xff0c;…

【车载开发系列】MCU选型

【车载开发系列】MCU选型 【车载开发系列】MCU选型 【车载开发系列】MCU选型一. 重要概念二. MCU选型的风险风险1风险2 三. MCU选型要点四. MCU选型维度五. MCU 选型需要考虑的因素1&#xff09;ROM/RAM2&#xff09;速度/主频3&#xff09;分析外设需求4&#xff09;工作电压(…

DNS域名解析服务和bond网卡

DHS域名解析 概述 DNS是域名系统的简称&#xff0c;它的作用就是域名和ip地址之间的映射关系。 在互联网中&#xff0c;ip地址是通信的唯一标识。&#xff08;逻辑地址&#xff09; 访问网站需要一个域名 域名解析的目的就是为了实现访问域名就等于访问ip地址。 在访问域…

【数据结构】前缀树(字典树)汇总

基础 {“a”,“abc”,“bac”,“bbc”,“ca” }的字典树如下图&#xff1a; 最主用的应用&#xff1a;一&#xff0c;字符串编码。二&#xff0c;位运算。 字符串编码 相比利用哈希映射编码&#xff0c;优点如下&#xff1a; 依次查询长度为n的字符串s的前缀时间复杂度是O(…

直接用sql语句来查询和分析excel表,不需要导数据,提供了sql语句自动生成,不会sql也能用

用sql语句来查询excel表&#xff0c;我们需要把excel表格导入到数据库中&#xff0c;然后用数据库的管理工具写sql语句来进行查询。方法有很多&#xff0c;我们不一一描述。 今天我们要说的是直接用sql语句来查询和分析excel表。为什么有这么一个想法呢&#xff1f;程…

《软件定义安全》之五:软件定义的安全架构

第5章 软件定义的安全架构 1.软件定义安全架构 安全控制平台&#xff0c;主要负责安全设备的资源池化管理、各类安全信息源的收集和分析、与客户业务系统对接&#xff0c;以及相应安全应用的策略解析和执行。 安全应用是根据特定的安全需求所开发的程序&#xff0c;它利用安全…

LabVIEW进行图像拼接的实现方法与优化

在工业检测和科研应用中&#xff0c;对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具&#xff0c;能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…

上位机图像处理和嵌入式模块部署(f407 mcu项目开发、产品开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和做项目、产品相比较&#xff0c;做技术还是比较简单的。一般来说&#xff0c;所谓的技术&#xff0c;就是把相关的功能实现即可。但是做项目和产…

月薪70-100k,京东招ML算法工程师和运筹优化专家!

Datawhale分享 推荐&#xff1a;黄玉琳&#xff0c;京东&#xff0c;Datawhale成员 团队介绍 我们是京东零售集团供应链算法优化团队&#xff0c;通过在人工智能与运筹优化领域的持续性技术革新,为京东自营千万级商品提供算法策略支持,实现了以用户为中心的供应链管理和更高效…

这两款kimi和豆包插件,用来辅助文献阅读和总结,太香了!娜姐亲测好用

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 ChatGPT刚出来的时候&#xff0c;几款速读PDF的AI工具ChatDoc、ChatPDF也跟着火了起来&#xff0c;可见大家对于速读文献、总结文档需求很高。 我记得ChatPDF只有几次免费机会…