Springboot——导入用户地址簿相关功能代码

news2024/11/15 11:59:24

目录

一、导入用户地址簿相关功能代码

1.1 需求分析

1.2 数据库对应的表

1.3 实体类

1.4 控制层

二、菜品展示

2.1 修改列表接口

2.2  设置对应接口查询套餐信息

三、购物车

3.1  购物车数据模型

3.2 代码开发

3.2.1 实体类

3.2.2 添加购物车

3.2.3 查看购物车

3.2.4 清空购物车

四、用户下单

4.1 数据模型

 4.1.1 订单表

 4.1.2 订单明细表

4.2 用户下单代码开发

4.2.1 订单实体类

4.2.2  订单明细实体类

4.2.3 代码开发


一、导入用户地址簿相关功能代码

1.1 需求分析

     地址簿,指的是移动消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。同一个用户可以有多个地址信息,但是只能有一个默认地址。



1.2 数据库对应的表

  

1.3 实体类

/**
 * 地址簿
 */
@Data
public class AddressBook implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;


    //用户id
    private Long userId;


    //收货人
    private String consignee;


    //手机号
    private String phone;


    //性别 0 女 1 男
    private String sex;


    //省级区划编号
    private String provinceCode;


    //省级名称
    private String provinceName;


    //市级区划编号
    private String cityCode;


    //市级名称
    private String cityName;


    //区级区划编号
    private String districtCode;


    //区级名称
    private String districtName;


    //详细地址
    private String detail;


    //标签
    private String label;

    //是否默认 0 否 1是
    private Integer isDefault;

    //创建时间
    @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;


    //是否删除
    private Integer isDeleted;
}

1.4 控制层


/**
 * 地址簿管理
 */
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController {

    @Autowired
    private AddressBookService addressBookService;

    /**
     * 新增
     */
    @PostMapping
    public R<AddressBook> save(@RequestBody AddressBook addressBook) {

        addressBook.setUserId(BaseContext.getCurrentId());

        log.info("addressBook:{}", addressBook);

        addressBookService.save(addressBook);

        return R.success(addressBook);
    }

    /**
     * 设置默认地址
     */
    @PutMapping("default")
    public R<AddressBook> setDefault(@RequestBody AddressBook addressBook) {
        log.info("addressBook:{}", addressBook);
        LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
        wrapper.set(AddressBook::getIsDefault, 0);
        //SQL:update address_book set is_default = 0 where user_id = ?
        addressBookService.update(wrapper);

        addressBook.setIsDefault(1);
        //SQL:update address_book set is_default = 1 where id = ?
        addressBookService.updateById(addressBook);
        return R.success(addressBook);
    }

    /**
     * 根据id查询地址
     */
    @GetMapping("/{id}")
    public R get(@PathVariable Long id) {
        AddressBook addressBook = addressBookService.getById(id);
        if (addressBook != null) {
            return R.success(addressBook);
        } else {
            return R.error("没有找到该对象");
        }
    }

    /**
     * 查询默认地址
     */
    @GetMapping("default")
    public R<AddressBook> getDefault() {
        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
        queryWrapper.eq(AddressBook::getIsDefault, 1);

        //SQL:select * from address_book where user_id = ? and is_default = 1
        AddressBook addressBook = addressBookService.getOne(queryWrapper);

        if (null == addressBook) {
            return R.error("没有找到该对象");
        } else {
            return R.success(addressBook);
        }
    }

    /**
     * 查询指定用户的全部地址
     */
    @GetMapping("/list")
    public R<List<AddressBook>> list(AddressBook addressBook) {
        addressBook.setUserId(BaseContext.getCurrentId());
        log.info("addressBook:{}", addressBook);

        //条件构造器
        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());
        queryWrapper.orderByDesc(AddressBook::getUpdateTime);

        //SQL:select * from address_book where user_id = ? order by update_time desc
        return R.success(addressBookService.list(queryWrapper));
    }
}

二、菜品展示

   页面左侧的分栏其实根据内容分成了两部分,一部分是菜品的分类,另一部分是套餐的分类

 

2.1 修改列表接口


//    /**
//     * 根据条件查询对应的菜品数据
//     * <p>
//     * 传入一个Dish对象 比传入一个 categoryId通用性更好
//     *
//     * @param dish
//     * @return
//     */
//    @GetMapping("/list")
//    public R<List<Dish>> list(Dish dish) {
//        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(dish.getCategoryId() != null, Dish::getCategoryId, dish.getCategoryId())
               起售
//                .eq(Dish::getStatus, 1)
//                .orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
//        List<Dish> dishList = dishService.list(queryWrapper);
//
//        return R.success(dishList);
//    }
    /**
     * 根据条件查询对应的菜品数据
     * <p>
     * 传入一个Dish对象 比传入一个 categoryId通用性更好
     *
     * @param dish
     * @return
     */
    @GetMapping("/list")
    public R<List<DishDto>> list(Dish dish) {
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(dish.getCategoryId() != null, Dish::getCategoryId, dish.getCategoryId())
//               起售
                .eq(Dish::getStatus, 1)
                .orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
        List<Dish> dishList = dishService.list(queryWrapper);

        List<DishDto> dishDtoList = dishList.stream().map(item -> {
            DishDto dishDto = new DishDto();

            BeanUtils.copyProperties(item, dishDto);

            Long categoryId = item.getCategoryId();   //分类id
//       根据id查询分类对象
            Category category = categoryService.getById(categoryId);
            if (category != null) {
                String categoryName = category.getName();
                dishDto.setCategoryName(categoryName);
            }

//        查询对应的口味数据
            Long dishId = item.getId();// 当前菜品id
            LambdaUpdateWrapper<DishFlavor> queryWrapperFlavor = new LambdaUpdateWrapper<>();
            queryWrapperFlavor.eq(DishFlavor::getDishId, dishId);

            List<DishFlavor> list = dishFlavorService.list(queryWrapperFlavor);
            dishDto.setFlavors(list);

            return dishDto;
        }).collect(Collectors.toList());

        return R.success(dishDtoList);
    }
}

 

2.2  设置对应接口查询套餐信息


    /**
     *   根据条件查询套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    public R<List<Setmeal>> list(Setmeal setmeal){
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId())
                .eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus())
                .orderByDesc(Setmeal::getUpdateTime);

        List<Setmeal> list = setmealService.list(queryWrapper);


        return R.success(list);
    }

三、购物车

       移动端用户可以将菜品或者套餐添加到购物车。

       对于菜品来说,如果设置了口味信息,则需要选择规格后才能加入购物车;

       对于套餐来说,可以直接点击“+”将当前套餐加入购物车。在购物车中可以修改菜品和套餐的数量也可以清空购物车。  

3.1  购物车数据模型

3.2 代码开发

页面需要发送三次请求

  •   点击 “加入购物车” 或者 “+”按钮,页面发送ajax请求,请求服务端,将菜品或者套餐添加到购物车
  •   点击购物车图标,页面发送ajax请求,请求服务端查询购物车中的菜品和套餐
  •   点击清空购物车按钮,页面发送ajax请求,请求服务端来执行清空购物车操作

3.2.1 实体类


/**
 * 购物车
 */
@Data
public class ShoppingCart implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    //名称
    private String name;

    //用户id
    private Long userId;

    //菜品id
    private Long dishId;

    //套餐id
    private Long setmealId;

    //口味
    private String dishFlavor;

    //数量
    private Integer number;

    //金额
    private BigDecimal amount;

    //图片
    private String image;

    private LocalDateTime createTime;
}

3.2.2 添加购物车

  /**
     * 添加购物车
     *
     * @param shoppingCart
     * @return
     */
    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart) {
        log.info("购物车数据:{}", shoppingCart);

//      设置用户id,指定当前是哪个用户的购物车数据
        Long userId = BaseContext.getCurrentId();

//      查询当前菜品或者套餐是否在购物车当中
//         判断是菜品还是套餐的方法很简单,如果dishId是空,那就是套餐,反之则是菜品
        Long dishId = shoppingCart.getDishId();

        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId, userId);

        if (dishId != null) {
//           添加菜品
            queryWrapper.eq(ShoppingCart::getDishId, dishId);
//            ShoppingCart cartServiceOne = shoppingCartService.getOne(queryWrapper);
        } else {
//           添加套餐
            queryWrapper.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());
//            ShoppingCart cartServiceOne =  shoppingCartService.getOne(queryWrapper);
        }
//      查询
        ShoppingCart cartServiceOne = shoppingCartService.getOne(queryWrapper);

//      如果有,就在原来数量的基础上+1
       if (cartServiceOne!=null){
           Integer number = cartServiceOne.getNumber();
           cartServiceOne.setNumber(number+1);
           shoppingCartService.updateById(cartServiceOne);
       }else {
//       如果没有,就默认数量为1
           shoppingCart.setNumber(1);
           shoppingCart.setUserId(userId);
           shoppingCart.setCreateTime(LocalDateTime.now());
           shoppingCartService.save(shoppingCart);
//         这一步是为了下面的返回值铺垫
           cartServiceOne = shoppingCart;
       }

        return R.success(cartServiceOne);
    }

3.2.3 查看购物车

    /**
     * 查看购物车
     * @return
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> list() {
        log.info("查看购物车");
        LambdaQueryWrapper<ShoppingCart> queryWrapper =  new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());
        queryWrapper.orderByAsc(ShoppingCart::getCreateTime);

        List<ShoppingCart> list = shoppingCartService.list(queryWrapper);

        return R.success(list);
    }

 

3.2.4 清空购物车

    /**
     * 清空购物车
     *
     * @return
     */
    @DeleteMapping
    public R<String> clean() {
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        shoppingCartService.remove(queryWrapper);

        return R.success("清空购物车成功");
    }

四、用户下单

      移动端用户将菜品或者套餐加入购物车后,可以点击购物车中的“去结算”按钮,页面跳转到订单确认页面,点击“去支付”按钮则完成下单的操作。

 

4.1 数据模型

 用户下单业务对应的数据表为orders表和order_detail表:

  •  orders: 订单表
  •  order_detail: 订单明细表

4.1.1 订单表

 4.1.2 订单明细表

 

4.2 用户下单代码开发

  •  在购物车中点击 “去结算” 按钮,页面跳转到订单确认页面
  •  在订单确认页面,发送ajax请求,请求服务端获取当前登录用户的默认地址
  •  在订单确认页面,发送ajax请求,请求服务端获取当前登录用户的购物车数据
  •  在订单确认页面点击"去支付",发送ajax请求,请求服务端完成下单操作(还没有写)

4.2.1 订单实体类

/**
 * 订单
 */
@Data
public class Orders implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    //订单号
    private String number;

    //订单状态 1待付款,2待派送,3已派送,4已完成,5已取消
    private Integer status;


    //下单用户id
    private Long userId;

    //地址id
    private Long addressBookId;


    //下单时间
    private LocalDateTime orderTime;


    //结账时间
    private LocalDateTime checkoutTime;


    //支付方式 1微信,2支付宝
    private Integer payMethod;


    //实收金额
    private BigDecimal amount;

    //备注
    private String remark;

    //用户名
    private String userName;

    //手机号
    private String phone;

    //地址
    private String address;

    //收货人
    private String consignee;
}

4.2.2  订单明细实体类

/**
 * 订单明细
 */
@Data
public class OrderDetail implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    //名称
    private String name;

    //订单id
    private Long orderId;


    //菜品id
    private Long dishId;


    //套餐id
    private Long setmealId;


    //口味
    private String dishFlavor;


    //数量
    private Integer number;

    //金额
    private BigDecimal amount;

    //图片
    private String image;
}

4.2.3 代码开发

    /**
     *
     * @param orders  仅提交addressBookId、payMethod、remark三项
     *                并没有提交购物车中的数据和用户的id
     *                对于用户的id,我们可以从登录的用户的session中获取
     *                对于购物车的数据,当我们知道用户id后,我们就可以进入数据库查询
     * @return
     */
    @PostMapping("/submit")
    public R<String> submit(@RequestBody Orders orders){
        ordersService.submit(orders);

        return R.success("下单成功");
    }
    @Autowired
    private OrderDetailService orderDetailService;

    @Override
    @Transactional
    public void submit(Orders orders) {
//        获取当前用户id
        Long currentId = BaseContext.getCurrentId();

//        查询当前用户的购物车数据
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId, currentId);
        List<ShoppingCart> shoppingCarts = shoppingCartService.list(queryWrapper);

        if (shoppingCarts == null || shoppingCarts.size() == 0) {
            throw new CustomException("购物车为空,不能下单");
        }

//        查询用户数据
        User user = userService.getById(currentId);

//        查询地址数据
        Long addressBookId = orders.getAddressBookId();
        AddressBook addressBook = addressBookService.getById(addressBookId);

        if (addressBook == null) {
            throw new CustomException("地址信息有误,不能下单");
        }
//      AtomicInteger是Java中的一个原子变量类,用于实现原子操作,保证多线程环境下的线程安全。它在数值操作上是整型的。
        AtomicInteger amount = new AtomicInteger(0); //初始值为0,能保证在多线程的计算下也是没有问题的,使用int或者double在多线程的情况下会出现计算错误
        List<OrderDetail> OrderDetails = shoppingCarts.stream().map((item) -> {
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setOrderId(currentId);
            orderDetail.setNumber(item.getNumber());
            orderDetail.setDishFlavor(item.getDishFlavor());
            orderDetail.setDishId(item.getDishId());
            orderDetail.setSetmealId(item.getSetmealId());
            orderDetail.setName(item.getName());
            orderDetail.setImage(item.getImage());
            orderDetail.setAmount(item.getAmount());  //单份金额
//          addAndGet 进行累加的,每次遍历都会加上item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue()这个值
//              item.getAmount() 是单份的金额, multiply是乘    new BigDecimal(item.getNumber())  这个是份数
//              intValue()  最后转成intValue
            amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());

            return orderDetail;

        }).collect(Collectors.toList());

//        向订单表插入数据(一条数据)
        long orderId = IdWorker.getId(); //订单号
        orders.setNumber(String.valueOf(orderId));
        orders.setId(orderId);
        orders.setOrderTime(LocalDateTime.now());
        orders.setCheckoutTime(LocalDateTime.now());
        orders.setStatus(2);  //待派送
        orders.setAmount(new BigDecimal(amount.get())); //订单总价
        orders.setUserId(currentId);
        orders.setNumber(String.valueOf(orderId));
        orders.setUserName(user.getName());
        orders.setConsignee(addressBook.getConsignee());
        orders.setPhone(addressBook.getPhone());
        orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName())
                + (addressBook.getCityName() == null ? "" : addressBook.getCityName())
                + (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName())
                + (addressBook.getDetail() == null ? "" : addressBook.getDetail()));

        this.save(orders);

//        向订单明细表插入数据(可能多条数据)
         orderDetailService.saveBatch(OrderDetails);

//        清空购物车数据
         shoppingCartService.remove(queryWrapper);
    }
}

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

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

相关文章

clickhouse 为什么快?

文章目录 [TOC](文章目录) 前言一、什么是列式数据库&#xff1f;为什么要用列式数据库,优点是什么? 二、clickhouse入门1. 个人猜想2. 使用clickhouse引入依赖yml配置扫描mapper 2.生成相应代码,执行测试用例查询结果 总结 前言 例如&#xff1a;随着人工智能的不断发展&…

还在玩传统终端,不妨来试试全新 AI 终端 Warp

壹 ❀ 引 最近一段时间&#xff0c;AI领域如同雨后春笋般开始猛烈生长&#xff0c;processon&#xff0c;sentry&#xff0c;一些日常使用的工具都在积极接入AI&#xff0c;那么正好借着AI的风头&#xff0c;今天给大家推荐一款非常不错的智能终端 warp&#xff08;目前仅限ma…

Servlet配置与高效部署

作出网页后端的核心目标就是 , 基于 tomcat 编程进行网站后端的开发 , 肯定需要对 http 协议进行一系列操作 , 幸运的是 tomcat 已经把这些 http 相关的底层操作封装好了(监听端口 , 接收连接 , 读取请求 , 解析请求 , 构造请求对象等一系列操作) , 只需调用 tomcat 为我们提供…

VMware虚拟机安装Linux教程(Windows版)

VMware虚拟机安装Linux教程&#xff08;Windows版&#xff09; 第一步、安装 VM &#x1f4e2;&#x1f4e2;&#xff1a;VMware下载以及Linux系统镜像需要的小伙伴可以私信我&#xff0c;也可以去官网上下载&#xff0c;文章中不能涉及安装包啥的&#xff0c;不然显示侵权&a…

如何一键免费压缩PDF文件?最好的 PDF 阅读器免费下载!

PDF&#xff08;便携式文档格式&#xff09;是一种独立于应用程序和平台的通用文件格式。它确保不同的用户可以在各种软件、硬件或操作系统中接收具有相同格式和视觉呈现的相同内容。您还可以在需要时对 PDF 进行电子签名。因此&#xff0c;PDF 文档在学术和正式用途中具有普遍…

Idea Git 分支合并全部文件或指定文件

这里有两个分支&#xff0c;一个 master 主分支&#xff0c;一个 hy-master 分支 一、将 hy-master 全部合并到 master 1、先回到 master 分支 2、在当前工作目录的分支为 master 的基础上&#xff0c;点击 hy-master 分支 点击 Merge into Current&#xff0c;就会将 hy-mas…

真题详解(MTTR)-软件设计(五十七)

设计模式详解-软件设计&#xff08;五十六)https://blog.csdn.net/ke1ying/article/details/130327216 采用DMA方式传送数据的时候&#xff0c;都是占用 存储周期。 解析&#xff1a; 因为不需要与cpu交互&#xff0c;所以不是指令周期&#xff0c;与外设交互&#xff0c;所…

nodejs+python+php+springboot+vue 女生穿衣搭配系统

本文研究的女生穿衣搭配管理基于当前较为流行的B/S结构 通过本系统&#xff0c;实现了不同权限的用户登录&#xff0c;包括用户和管理员。管理员:用户管理、类型信息管理、服饰单品管理、今日搭配管理、论坛管理、系统管理、我的收藏管理。用户&#xff1a;类型信息管理、服饰单…

【项目实战】一个赛事组队交流分享平台——微信小程序 uniapp+springboot微服务

前言 去年微信小程序国三&#xff0c;今年这个比赛绝版了&#xff0c;把这个项目开源出来给大家学习一下吧&#xff0c;整个架构还是比较完善的&#xff0c;特别适合学习。&#xff08;开源不易&#xff0c;求个star&#xff09; 项目地址&#xff1a;https://github.com/Unde…

【独具匠心设计】全网最好的国学,历代文学,名著,小说网推荐

极力推荐一个功能简单、易用、访问快捷、界面大气,清爽、资源丰富、设计专业、完全免费的文学网站。它的名字叫“历代文学”&#xff0c;是由成都心海科技公司所研发&#xff0c;设计真可谓独具匠心。 “历代文学”收录了来自古今中外 20 多个朝代&#xff0c;近 30个 国家的作…

Mysql列的完整性约束详解(主键约束)

文章目录 前言一、设置表字段的主键约束&#xff08;PRIMARY KEY&#xff0c;PK&#xff09; 1.单字段主键2.多字段主键总结 前言 完整性约束条件是对字段进行限制&#xff0c;要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件&#xff0c;数据库系统将不再…

AUTOSAR文档如何阅读 -- 这些缩写是干嘛的!!!

目录 1 Autosar BSW Module List 2 Autosar规范文档的类型 2.1 Autosar文档中提到的缩写 3 如何快速查看相邻CP Autosar版本之间的差异 结尾 优质博文推荐阅读&#xff08;单击下方链接&#xff0c;即可跳转&#xff09;&#xff1a; 点击返回「《Autosar从入门到精通-实…

[入门必看]数据结构5.2:二叉树的概念

[入门必看]数据结构5.2&#xff1a;二叉树的概念 第五章 树与二叉树5.2 二叉树的概念知识总览5.2.1_1 二叉树的定义和基本术语5.2.1_2 二叉树的性质5.2.2 二叉树的存储结构 5.2.1_1 二叉树的定义和基本术语二叉树的基本概念二叉树的五种状态几个特殊的二叉树满二叉树&#xff1…

智慧医院的信息集成平台建设与配电设计方案

摘要&#xff1a;随着云计算、5G、大数据、物联网等技术的不断发展与进步&#xff0c;推动着智慧医院建设的飞速发展。智慧医院建设强调医院内部业务的多流程联动和医疗信息互联互通的高协同效率&#xff0c;突出了数据驱动下构建高质量数据的必要性。文章提出并分析智慧医院发…

操作Redis只有RedisTemplate吗?

还在只用 RedisTemplate 访问 Redis 吗&#xff1f;这几种方式给你安排上&#xff01; 开始准备RedisTemplateJPA RepositoryCache总结 开始准备 开始之前我们需要有Redis安装&#xff0c;我们采用本机Docker运行Redis&#xff0c;主要命令如下 docker pull redis docker ru…

细数Java集合List的10个坑

1 Arrays.asList转换基本类型数组的坑 在实际的业务开发中&#xff0c;我们通常会进行数组转List的操作&#xff0c;通常我们会使用Arrays.asList来进行转换 但是在转换基本类型的数组的时候&#xff0c;却出现转换的结果和我们想象的不一致。 上代码 int[] arr {1, 2, 3}…

Centos安装python3详细教程

Centos安装python3详细教程 转载&#xff1a;https://blog.csdn.net/qq_32742573/article/details/119849634?spm1001.2014.3001.5502 文章目录 Centos安装python3详细教程 1、先查看系统python的位置在哪儿2、下载python3的包之前&#xff0c;要先安装相关的依赖包&#xff0…

接打电话的蓝牙耳机哪个牌子好?接听电话蓝牙耳机推荐

耳机已经成为人们生活中不可或缺的重要物件&#xff0c;乘坐公共交通&#xff0c;在图书馆学习&#xff0c;在操场上运动&#xff0c;可以看到许多不同种类的蓝牙耳机&#xff0c;可知耳机品牌、种类众多&#xff0c;质量良莠不齐&#xff0c;耳机产品的价格区间也相差巨大&…

DAB-Deformable-DETR代码学习记录之模型构建

DAB-DETR的作者在Deformable-DETR基础上&#xff0c;将DAB-DETR的思想融入到了Deformable-DETR中&#xff0c;取得了不错的成绩。今天博主通过源码来学习下DAB-Deformable-DETR模型。 首先我么看下Deformable的创新之处&#xff1a; Deformable-DETR创新 多尺度融合 首先便是…

如何真正认识 Linux 系统结构?这篇文章告诉你

Linux 系统一般有 4 个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell 和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 Linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;…