【黑马】瑞吉外卖-Day03、04笔记

news2024/9/25 13:16:38

瑞吉外卖Day03、04

公共字段自动填充

使用MybatisPlus实现

问题分析

请添加图片描述

代码实现

Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。

实现步骤:

  1. 在实体类的属性上加入@TableField注解,指定自动填充的策略

  2. 按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口

对公共的字段加入注解,指定其自动填充的策略

    @TableField(fill =  FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;

编写自定义元数据对象处理器

将之前controller中的公共字段手动填充注释掉

功能完善

前面我们已经完成了公共字段自动填充功能的代码开发,但是还有一个问题没有解决,就是我们在自动填充createUser和updateUser时设置的用户id是固定值,现在我们需要改造成动态获取当前登录用户的id。
有的同学可能想到,用户登录成功后我们将用户id存入了HttpSession中,现在我从HttpSession中获取不就行了?
注意,我们在MyMetaObjectHandler类中是不能获得HttpSession.对象的,所以我们需要通过其他方式来获取登录用户id。可以使用ThreadLocals来解决此问题,它是)DK中提供的一个类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zag7YbYn-1673267797811)(瑞吉外卖Day03、04.assets/image-20230107140339052.png)]

什么是ThreadLocal?

ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocali为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

ThreadLocal常用方法:

  • public void set(T value) 设置当前线程的线程局部变量的值
  • public T get() 返回当前线程所对应的线程局部变量的值

我们可以在LoginCheckFilter的doFilter方法中获取当前登录用户id,并调用ThreadLocal的set方法来设置当前线程的线程局部变量的值(用户id),然后在MyMetaObjectHandler的updateFill方法中调用ThreadLocal的get方法来获得当前线程所对应的线程局部变量的值(用户id)。

实现步骤:

  1. 编写BaseContext.工具类,基于ThreadLocal封装的工具类
  2. 在LoginCheckFilterl的doFilter,方法中调用BaseContext:来设置当前登录用户的id:
  3. 在MyMetaObjectHandler的方法中调用BaseContext获取登录用户
/**
 * 自定义元数据对象处理器
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段填充-INSERT");
       // log.info(metaObject.toString());

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("createUser",new Long(BaseContext.getCurrentId()));
        metaObject.setValue("updateUser",new Long(BaseContext.getCurrentId()));
    }

    /**
     * 更新自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段填充-UPDATE");
       // log.info(metaObject.toString());
       // log.info("当前线程的id:{}",Thread.currentThread().getId());
        metaObject.setValue("updateTime",LocalDateTime.now());

        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}
/**
 * 基于ThreadLocak封装工具类,用户保存和获取当前session中的id
 * 作用范围为一个线程之内,一次请求一个线程
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }

    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

新增分类功能

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOUJe6uU-1673267797812)(瑞吉外卖Day03、04.assets/image-20230107143233970.png)]

数据模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s5wGbRwm-1673267797813)(瑞吉外卖Day03、04.assets/image-20230107143400391.png)]

代码开发

在开发业务功能前,先将需要用到的类和接口基本结构创建好:

  • 实体类Category(直接从课程资料中导入即可)

  • Mapper接口CategoryMapper

  • 业务层接口CategoryService

  • 业务层实现类CategoryServicelmpl

  • 控制层CategoryController

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n4Ccl0KK-1673267797813)(瑞吉外卖Day03、04.assets/image-20230107144619885.png)]

@RestController
@Slf4j
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;

    /**
     * 新增分类
     * @param category
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("新增菜品为:{}",category.toString());
        categoryService.save(category);
        return R.success("新增菜品成功");
    }
}

分类信息分页查询

代码开发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yeS582hg-1673267797813)(瑞吉外卖Day03、04.assets/image-20230107145724393.png)]

    /**
     * 分类分页查询
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        //分页构造器
        Page<Category> pageinfo = new Page<>(page,pageSize);
        //条件构造器
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        //添加排序条件,根据sort进行排序
        queryWrapper.orderByAsc(Category::getSort);
        // 调用service进行排序
        categoryService.page(pageinfo,queryWrapper);
        return R.success(pageinfo);

    }

删除分类功能

需求分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oLYRhox-1673267797813)(瑞吉外卖Day03、04.assets/image-20230107175652691.png)]

代码开发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NIaiCKXS-1673267797814)(瑞吉外卖Day03、04.assets/image-20230107175731098.png)]

功能完善

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wml8s2EL-1673267797814)(瑞吉外卖Day03、04.assets/image-20230107181403360.png)]

@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
    @Autowired
    private DishService dishService;
    @Autowired
    private SetmealService setmealService;
    /**
     * 删除分类,删除之前要进行判断
     * @param id
     */
    @Override
    public void remove(Long id) {
        LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
        dishLambdaQueryWrapper.eq(Dish::getCategoryId,id);
        int count = dishService.count(dishLambdaQueryWrapper);
        //查询当前的分类是否关联了菜品,如果关联直接抛出异常
        if (count > 0){
            //抛出异常
            throw  new CustomException("当前分类下关联了菜品,无法删除");
        }
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
        int count1 = setmealService.count(setmealLambdaQueryWrapper);

        //查询当前分类是否关联了套餐,如果关联直接抛出异常
        if (count1 > 0){
            throw  new CustomException("当前分类下关联了套餐,无法删除");
        }
        // 如果判断都没有成功,那么直接删除
        super.removeById(id);
    }
}
    /**
     * 根据ID删除分类
     * @param id
     * @return
     */
    @DeleteMapping
    public R<String> delete(Long id){
        log.info("删除分类的id:{}",id);
        categoryService.remove(id);
        return R.success("删除成功");
    }

自定义异常

/**
 * 自定义业务异常
 */
public class CustomException extends RuntimeException{
    public CustomException(String message){
        super(message);
    }
}

将自定义异常添加到全局异常处理类当中,这样就可以在前端页面提示具体的错误信息

@ExceptionHandler(CustomException.class)
public R<String> exceptionHandler(CustomException exception){
    log.info(exception.getMessage());
    return R.error(exception.getMessage());//页面上就会显示提示信息
}

修改分类

需求分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RfqofoM9-1673267797814)(瑞吉外卖Day03、04.assets/image-20230107184154124.png)]

    /**
     * 修改分类信息
     * @param category
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("修改分类信息:{}",category.toString());
        categoryService.updateById(category);
        return R.success("修改分类信息成功");
    }

文件上传下载功能

文件上传介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGj8WF4d-1673267797814)(瑞吉外卖Day03、04.assets/image-20230107185729369.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQTON0Fr-1673267797815)(瑞吉外卖Day03、04.assets/image-20230107185815338.png)]

文件下载介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EQvTje11-1673267797815)(瑞吉外卖Day03、04.assets/image-20230107190055623.png)]

文件上传代码实现

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
    @Value("${reggie.path}")
    private String basePath;

    @PostMapping("/upload")
    //file名字要和前端name里面的名字一样
    public R<String> upload(MultipartFile file){
        // file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件将会删除
        log.info("上传文件");
        // 新的文件名字
        String fileName = UUID.randomUUID().toString()+
                file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        // 创建一个目录文件
        File dir = new File(basePath);
        if (!dir.exists()){
            dir.mkdirs();
        }
        try {

            file.transferTo(new File(basePath+fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.success(fileName);
    }
}
reggie:
  path: D:\reggieimg\

文件下载代码实现

    /**
     * 文件下载
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void dowanload(String name, HttpServletResponse response){

        try {
            // 输入流来读取文件内容
            FileInputStream inputStream = new FileInputStream(new File(basePath+name));
            // 输出流将文件写回浏览器
            ServletOutputStream outputStream = response.getOutputStream();
            // 设置相应文件的格式
            response.setContentType("image/jepg");
            int len = 0;
            // 将读到的数据写入到byte数组中
            byte[] bytes = new byte[1024];
            while ((len = inputStream.read(bytes)) != -1){
                // 如果len不等于-1,那就继续读,直到len=-1,表示已经读取完毕
                // 将读取到的数据通过输出流写回浏览器
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }

            inputStream.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

新增菜品功能

需求分析

后台系统中可以管理菜品信息,通过新增功能来添加一个新的菜品,在添加菜品时需要选择当前菜品所属的菜品分类,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

数据模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-14Qn1ljj-1673267797815)(瑞吉外卖Day03、04.assets/image-20230108123618696.png)]

代码开发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UUWfPgKJ-1673267797816)(瑞吉外卖Day03、04.assets/image-20230108124025620.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qlm9PAuG-1673267797816)(瑞吉外卖Day03、04.assets/image-20230108130539201.png)]

导入DTO

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QcXV8MR1-1673267797816)(瑞吉外卖Day03、04.assets/image-20230108132344945.png)]

菜品下拉框的实现

/**
 * 菜品下拉框
 * @param category
 * @return
 */
@GetMapping("/list")
public R<List<Category>> list(Category category){
    log.info("菜品分类下拉框.");
    LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
    //添加条件
    queryWrapper.eq(category.getType() != null,Category::getType,category.getType());
    //添加排序条件
    queryWrapper.orderByAsc(Category::getSort);
    queryWrapper.orderByDesc(Category::getUpdateTime);
    //通过MybatisPlus使用list方法查询到所有符合条件的菜品,并封装为list传递给前端
    List<Category> list = categoryService.list(queryWrapper);
    return R.success(list);
}

传输的数据和实体类的属性并不是一一对应,需要引入DTO对象来进行传输

@Data
public class DishDto extends Dish {

    private List<DishFlavor> flavors = new ArrayList<>();

    private String categoryName;

    private Integer copies;
}

在service新增一个方法来将菜品和菜品口味存储到不同的表中

@Service
@Slf4j
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
    @Autowired
    private DishFlavorService dishFlavorService;
    /**
     * 新增菜品和口味数据
     * @param dishDto
     */
    @Override
    @Transactional
    public void saveWithFlavor(DishDto dishDto) {
        // 保存菜品到菜品表
        this.save(dishDto);
        // 保存菜品口味数据到口味表
        Long dishId = dishDto.getId();

        List<DishFlavor> flavors = dishDto.getFlavors();
        flavors = flavors.stream().map((item)->{
            item.setDishId(dishId);
            return item;
        }).collect(Collectors.toList());

        dishFlavorService.saveBatch(flavors);

    }
}

涉及到多张表,这里面需要开始事务操作,并且在启动类中加入@EnableTransactionManagement注解开启事务

@RestController
@Slf4j
@RequestMapping("/dish")
public class DishController {
    @Autowired
    private DishService dishService;

    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        dishService.saveWithFlavor(dishDto);
        return R.success("新增菜品成功..");
    }
}

菜品信息分页查询

与之前不同的是,需要展示菜品的图片和分类

代码开发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AIsDJYug-1673267797817)(瑞吉外卖Day03、04.assets/image-20230108141024440.png)]

    /**
     * 分页条件查询
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name){
        //分页构造器
        Page<Dish> pageInfo = new Page<Dish>(page,pageSize);
        Page<DishDto> dishDtoPage = new Page<>();

        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        //添加过滤条件
        queryWrapper.like(name != null,Dish::getName,name);

        //增加排序条件
        queryWrapper.orderByDesc(Dish::getUpdateTime);
        dishService.page(pageInfo,queryWrapper);
        //进行对象拷贝,将上面的page拷贝到下面的page中去
        BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
        List<Dish> records = pageInfo.getRecords();
        //基于stream流的方式,通过lambda表达式,将records中的属性拷贝到Dishdto对象中,并且通过service层查询到categotyId所对应的
        //分类名称,设置到DishDto对象当中,返会一个DishDto的list对象到前端页面
        List<DishDto> list = records.stream().map((item)->{
            DishDto dishDto = new DishDto();
            Long categoryId = item.getCategoryId();//分类id
            String categoryName = categoryService.getById(categoryId).getName();
            dishDto.setCategoryName(categoryName);
            BeanUtils.copyProperties(item,dishDto);
            return dishDto;
        }).collect(Collectors.toList());
        dishDtoPage.setRecords(list);
        return R.success(dishDtoPage);
    }

修改菜品

需求分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zyyT9yEl-1673267797817)(瑞吉外卖Day03、04.assets/image-20230109201308389.png)]

代码开发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQQf72hw-1673267797817)(瑞吉外卖Day03、04.assets/image-20230109201339823.png)]

    /**
     * 根据菜品id查询菜品和口味信息
     * @param id
     * @return
     */
    @Override
    public DishDto getByIdWithFlavor(Long id) {
        // 查询菜品基本信息
        Dish dish = this.getById(id);
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(dish,dishDto);
        // 查询菜品的口味信息
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DishFlavor::getDishId,dish.getId());
        // 将口味的list查询出来
        List<DishFlavor> list = dishFlavorService.list(queryWrapper);
        dishDto.setFlavors(list);
        return dishDto;
    }

    /**
     * 更新菜品和口味信息
     * @param dishDto
     */
    @Override
    @Transactional
    public void updateWithFlavor(DishDto dishDto) {
        // 更新菜品表
        this.updateById(dishDto);

        // 清理当前菜品表的口味数据-delete
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());

        dishFlavorService.remove(queryWrapper);
        // 再添加口味味表信息-insert

        List<DishFlavor> flavors = dishDto.getFlavors();
        flavors.stream().map((item)->{
            item.setDishId(dishDto.getId());
            return item;
        }).collect(Collectors.toList());

        dishFlavorService.saveBatch(flavors);
    }
    // 请求在url中
    /**
     * 根据id进行查询菜品信息并回显
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<DishDto> getById(@PathVariable Long id){
        DishDto byIdWithFlavor = dishService.getByIdWithFlavor(id);
        return R.success(byIdWithFlavor);
    }

    /**
     * 更新菜品
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody DishDto dishDto){
        dishService.updateWithFlavor(dishDto);
        return R.success("修改菜品成功");
    }

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

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

相关文章

【学习】life long learning

文章目录life long learningLLL的难点评估二、LLL的三个解法1、Selective Synaptic Plasticity选择性突触可塑性为什么会有灾难性遗忘呢&#xff1f;GEM2、Additional Neural Resource Allocation额外的神经资源分配packNet&CPG3、memory replyCurriculum Learninglife lon…

SAP 字段仍作为视图字段在视图中使用 | 更改表结构重新生成 CDS View「实例」

错误信息 Field ZPDAUSER-ZUSERID is still being used as a view field in view ZV_PDA_USER视图 ZPDAUSER-ZUSERID 仍作为视图字段在视图 ZV_PDA_USER 使用 错误原因 当前表被 CDS View 引用&#xff0c;由 CDS View 生成的「视图」已占用当前表的相关字段然而生成的视图又…

实战5:基于 Pytorch 搭建 Faster-R-CNN 实现飞机目标检测(代码+数据)

任务描述: 通过一个飞机检测的案例来对目标检测的基本概念进行介绍并且实现一个简单的目标检测方法。数据集:使用从COCO数据集抽取的飞机数据集mini-airplane,数据集中的数据均为正常的图片。https://download.csdn.net/download/qq_38735017/87374251运行环境:操作系统:l…

Day4 基于XML的Spring应用

总结java依赖注入的方式set方法注入List、map和properties的注入通过构造方法注入ref是reference的缩写&#xff0c;需要引用其他bean的id&#xff0c;value用于注入普通属性值。自定义标签和其他标签的引用自定义标签beansbeanimportalias其他标签用于引用其他命名空间1 bean的…

sqli-labs 第八关 多命通关攻略(Python3 自动化实现布尔盲注)

sqli-labs 第八关 多命通关攻略&#xff08;Python3 自动化实现布尔盲注&#xff09;描述判断注入类型正常输入不正常输入错误输入爆破方式的可行性铺垫函数 IF()关于 MySQL 数据类型之间转换的小小礼物&#xff08;仅部分&#xff09;函数 ASCII()ASCII 表&#xff08;可显示字…

火山引擎 DataTester:5 个优化思路,构建高性能 A/B 实验平台

导读&#xff1a;DataTester 是由火山引擎推出的 A/B 测试平台&#xff0c;覆盖推荐、广告、搜索、UI、产品功能等业务应用场景&#xff0c;提供从 A/B 实验设计、实验创建、指标计算、统计分析到最终评估上线等贯穿整个 A/B 实验生命周期的服务。DataTester 经过了字节跳动业务…

vivo 故障定位平台的探索与实践

作者&#xff1a;vivo 互联网服务器团队- Liu Xin、Yu Dan 本文基于故障定位项目的实践&#xff0c;围绕根因定位算法的原理进行展开介绍。鉴于算法有一定的复杂度&#xff0c;本文通过图文的方式进行说明&#xff0c;希望即使是不懂技术的同学也能理解。 一、背景介绍 1.1 程…

2023最新连锁店软件排名,国内十大连锁店管理软件新鲜出炉!

普通的数据工具、人工管理难以满足连锁店老板们的需求&#xff0c;正所谓“有需求就有市场”&#xff0c;随着连锁店、加盟店如雨后春笋般在城市里出现&#xff0c;连锁店软件也越来越多。究竟哪一款连锁店管理软件&#xff0c;才能满足老板们的需求&#xff1f;小编收集了国内…

9/365 java 数组 内存

1.数组 声明&#xff1a; int[] a;//首选 int a[];//一般不用 创建&#xff1a; int[] a new int[10]; // 需指定数组大小 初始化&#xff1a; 静态初始化&#xff1a; int[] a {8,9,10}; String[] s {new String("hello"), new String("world")…

南邮研究生考试历年真题知识点总结

下边的知识点是我在做南京邮电大学考研历年真题时遇到自己不会的题时整理出来的。第九部分是做mooc课后习题时整理出来的&#xff0c;希望对各位同学有所帮助。 md文档网址&#xff1a;https://gitee.com/infiniteStars/wang-dao-408-notes/blob/master/考研笔记/南邮数据结构知…

内存函数:学习笔记7

目录 一.前言 二. memcpy模拟实现 三. memmove模拟实现 四.memcmp模拟实现 一.前言 计算机内存的实质就是以字节为编号单元的二进制序列集合&#xff0c;操作内存时我们应具有这样的视角。 二. memcpy模拟实现 库函数memcpy函数首部&#xff1a;void *memcpy( void *dest, …

量子计算机“九章”

1.中国量子计算机“九章”实现量子霸权 2020年12月&#xff0c;中国科学技术大学宣布该校成功构建光子量子计算原型机“九章”。“九章”是中国科学技术大学潘建伟团队、中科院上海微系统所和国家并行计算机工程技术研究中心合作完成。“九章”的名字是来源于中国历史上最重要…

算法设计与分析-分支限界法习题

7-1 布线问题印刷电路板将布线区域划分成 nm 个方格阵列&#xff0c;要求确定连接方格阵列中的方格a 点到方格b 的最短布线方案。在布线时&#xff0c;电路只能沿直线布线&#xff0c;为了避免线路相交&#xff0c;已布了线的方格做了封锁标记&#xff0c;其他线路不允许穿过被…

大数据开发之利剑 -- TDengine

前言 在大数据技术全球爆炸的时代&#xff0c;以及大数据在各行各业的实际应用&#xff0c;大数据的快速发展就像计算机和互联网一样&#xff0c;很可能成为新一轮的技术革命。数据处理、机器学习、AI等新兴技术诞生&#xff0c;会改变数据世界的许多算法和理论基础&#xff0c…

DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点

目录 一、题干 &#x1f517;力扣203. 移除链表元素 二、题解 1、思路 2、完整代码 一、题干 &#x1f517;力扣203. 移除链表元素 二、题解 1、思路 题干的意思是&#xff0c;要删除链表中所有指定的元素。最暴力的方法是&#xff0c;依次遍历链表中的各个节点&#x…

Day3 XML方式的Spring应用

全文总结基于XML配置1、学习了bean标签&#xff0c;2、三种配置bean的方式&#xff1a;1、静态工厂&#xff1b;2、实例工厂和3、自定义实现factorybean1 SpringBean 的配置类inin-method 与构造方法不同&#xff0c;构造方法是创建对象的&#xff0c;等对象创建以后使用inin-m…

2023年全国最新消防设施操作员精选真题及答案

百分百题库提供消防设施操作员考试试题、消防设施操作员考试预测题、消防设施操作员考试真题、消防设施操作员证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 1、对外观目测判断,下列哪种情况不应报废?(  ) A、铭牌标志脱落 B、瓶…

pyqt5加载matplotlib图形

matplotlib的图形处理非常强大。今天花了很长时间才将matplotlib图形嵌入到pyqt5中。在这里记录一下&#xff0c;便于以后查寻。有些可能还理解不到位。开始要导入几个模块&#xff1a;from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasFigur…

tomcat下载和配置(简单,详细)

下载 官网&#xff1a;http://tomcat.apache.org/ 找到需要的版本&#xff0c;点击download 在download页面&#xff0c;选择需要下载的。&#xff08;分为压缩版和安装版&#xff0c;我比较推荐压缩版&#xff0c;省事解压缩就好&#xff09; 配置 首先&#xff01;&…

[ 数据结构 ] 集合覆盖问题(贪心算法)

0 集合覆盖问题 假设存在如下表的需要付费的广播台&#xff0c;以及广播台信号可以覆盖的地区。 如何选择最少的广播台&#xff0c;让所有的地区都可以接收到信号 广播台覆盖地区K1北京,上海,天津K2广州,北京,深圳K3成都,上海,杭州K4上海,天津K5杭州,大连 思路分析①:穷举法,…