苍穹外卖项目DAY03

news2024/9/20 5:56:12

苍穹外卖项目Day03

1、菜品管理

1.1、公共字段自动填充

1.1.1、问题分析

业务表中的公共字段:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

问题:代码冗余、不便于后期维护

1.1.2、实现思路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法
  • 自定义切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过反射为公共字段赋值
  • 在Mapper的方法加上AutoFill注解

技术点:枚举、注解、AOP、反射

1.1.3、代码开发

AutoFill

/**
 * 自定义注解,用于标识某个方法需要进行功能字段自动填充处理
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    //数据库操作类型:UPDATE 、INSERT
    OperationType value();

}

AutoFillAspect

/**
 * 自定义切点,实现公共字段自动填充处理逻辑
 */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
    /**
     * 切入点
     */
    //直接Annotation会扫描全部,影响效率,加上Execution就只会扫描mp里面带AutoFill注解的方法
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
    public void autoFillPointCut(){

    }

    /**
     * 前置通知,在通知中进行公共字段的赋值
     * @param joinPoint
     */
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        log.info("开始进行公共字段自动填充...");

        //获取当前被拦截方法上的数据库操作类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法签名对象
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
        OperationType operationType = autoFill.value(); //获得数据库操作类型

        //获取到当前被拦截的方法的参数---实体对象
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0){
            return;
        }

        Object entity = args[0];
        //准备赋值的数据

        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();

        //根据当前不同的操作类型,为对应的属性通过反射来赋值
        if (operationType == OperationType.INSERT){
            //为四个公共字段赋值
            Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
            Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

            //通过反射为对象属性赋值
            setCreateTime.invoke(entity,now);
            setCreateUser.invoke(entity,currentId);
            setUpdateTime.invoke(entity,now);
            setUpdateUser.invoke(entity,currentId);
        }else {
            //为两个公共字段赋值
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

            //通过反射为对象属性赋值
            setUpdateTime.invoke(entity,now);
            setUpdateUser.invoke(entity,currentId);
        }


    }
}

Mapper层

@AutoFill(value = OperationType.INSERT)
void insert(Category category);

@AutoFill(value = OperationType.UPDATE)
void update(Category category);

Impl层注释掉之前的公共字段

1.1.4、功能测试

测试时间的创建人更新人的数据是否正确

1.2、新增菜品

1.2.1、需求分析和设计

业务规则:

  • 菜品名称必须是唯一的
  • 菜品必须属于某个分类下,不能单独存在
  • 新增菜品时可以根据情况选择菜品的口味
  • 每个菜品必须对应一张图片

接口设计:

  • 根据类型查询分类(已完成)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 文件上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 新增菜品

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据库设计(dish菜品表和dish_favor口味表):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2.2、代码开发

开发文件上传接口:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置阿里云:

application.yaml:

sky:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: itcast
    # 设置jwt过期时间
    admin-ttl: 7200000
    # 设置前端传递过来的令牌名称
    admin-token-name: token
  alioss:
   endpoint: ${sky.alioss.endpoint}
   access-key-id: ${sky.alioss.access-key-id}
   access-key-secret: ${sky.alioss.access-key-secret}
   bucket-name: ${sky.alioss.bucket-name}

application-dev.yaml

alioss:
  endpoint: oss-cn-beijing.aliyuncs.com
  access-key-id: LTAI5tCbpEZCVVnr2z9sEEQ6
  access-key-secret: nNZeAsoyR9eyTX2ReUoLpJj7jP9F1R
  bucket-name: sky-jjq

CommonController

/**
 * 通用接口
 */
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {

    @Autowired
    private AliOssUtil aliOssUtil;


    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file){
        log.info("文件上传:{}",file);

        //文件请求路径
        try {
            //原始文件名
            String originalFilename = file.getOriginalFilename();
            //截图原始文件名的后缀 dsa.png
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            //构造新文件名称
            String objectName = UUID.randomUUID().toString() + extension;


            String filePath = aliOssUtil.upload(file.getBytes(), objectName);

            return Result.success(filePath);
        } catch (IOException e) {
           log.info("文件上传失败:{}",e);
        }

        return null;
    }

}

OssConfiguration

/**
 * 配置类,用于创建AliOssUtil对象
 */
@Configuration
@Slf4j
public class OssConfiguration {


    @Bean
    @ConditionalOnMissingBean
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
        log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());


    }

}

DishController

@RestController
@Slf4j
@RequestMapping("/admin/dish")
@Api(tags = "菜品相关接口")
public class DishController {

    @Autowired
    private DishService dishService;

    /**
     * 新增菜品
     * @param dishDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增菜品")
    public Result save(@RequestBody DishDTO dishDTO){
        log.info("新增菜品:{}",dishDTO);
        dishService.saveWithFalvor(dishDTO);
        return Result.success();
    }

DishService

public interface DishService {

    /**
     * 新增菜品和对应的口味数据
     * @param dishDTO
     */
    void saveWithFalvor(DishDTO dishDTO);
}

DishServiceImpl

@Service
@Slf4j
public class DishServiceImpl implements DishService {

    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private DishFlavorMapper dishFlavorMapper;

    /**
     * 新增菜品和对应的口味数据
     * @param dishDTO
     */
    //涉及多个表的应用,保证数据的一致性
    @Transactional
    @Override
    public void saveWithFalvor(DishDTO dishDTO) {

        //向菜品表插入1条数据,因为DishDTO中包含了口味数据,我不需要,所以在这样用dish实体
        Dish dish = new Dish();

        BeanUtils.copyProperties(dishDTO,dish);

        //向菜品表插入1条数据
        dishMapper.insert(dish);

        //获取insert语句生成的主键值
        Long dishId = dish.getId();

        //向口味表插入n条数据
        List<DishFlavor> flavors = dishDTO.getFlavors();
        if (flavors !=null && flavors.size() > 0){
            flavors.forEach(dishFlavor -> {
                dishFlavor.setDishId(dishId);
            });


            dishFlavorMapper.insertBatch(flavors);
        }

    }
}

DishMapper

@Mapper
public interface DishMapper {

    /**
     * 根据分类id查询菜品数量
     * @param categoryId
     * @return
     */
    @Select("select count(id) from sky_take_out.dish where category_id = #{categoryId}")
    Integer countByCategoryId(Long categoryId);

    /**
     * 新增菜品
     * @param dish
     */
    @AutoFill(value = OperationType.INSERT)
    void insert(Dish dish);
}

DishMapper.xml

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sky.mapper.DishMapper">

<!--插入完成的属性值会赋给id-->
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
         insert into sky_take_out.dish (name, category_id, price, image, description, create_time, update_time, create_user, update_user)
         VALUES (#{name},#{categoryId},#{price},#{image},#{description},#{createTime},#{updateTime},#{createUser},#{updateUser})
    </insert>

</mapper>

DishFlavorMapper

@Mapper
public interface DishFlavorMapper {

    /**
     * 批量插入口味数据
     * @param flavors
     */
    void insertBatch(List<DishFlavor> flavors);
}

DishFlavorMapper.xml

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sky.mapper.DishFlavorMapper">


    <insert id="insertBatch">
    insert into sky_take_out.dish_flavor (dish_id, name, value) VALUES
        <foreach collection="flavors" item="df" separator=",">
            (#{df.dishId},#{df.name},#{df.value})
        </foreach>
    </insert>
</mapper>
1.2.3、功能测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.3、菜品分页查询

1.3.1、需求分析和设计

业务规则:

  • 根据页码展示菜品信息
  • 每页展示10条数据
  • 分页查询时可以根据需要输入菜品名称、菜品分类、菜品状态进行查询

接口设计:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.3.2、代码开发

根据菜品分页查询接口定义设计对应的DTO:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据菜品分页查询接口定义设计对应的VO:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DishController

@GetMapping("/page")
@ApiOperation("菜品分页查询")
public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO){
    log.info("菜品分页查询:{}",dishPageQueryDTO);
    PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);
    return Result.success(pageResult);
}

DishService

PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO);

Impl

@Override
public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {
    PageHelper.startPage(dishPageQueryDTO.getPage(),dishPageQueryDTO.getPageSize());
    Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);
    return new PageResult(page.getTotal(),page.getResult());
}

DishMapper

Page<DishVO> pageQuery(DishPageQueryDTO dishPageQueryDTO);

DishMapper.xml

<select id="pageQuery" resultType="com.sky.vo.DishVO">
    SELECT d.*,c.name as categoryName FROM dish d left join category c on d.category_id = c.id
    <where>
        <if test="name != null">and d.name like concat('%',#{name},'%')</if>
        <if test="categoryId != null">d.category_id = #{categoryId}</if>
        <if test="status != null">d.status = #{status}</if>

    </where>
    order by d.create_time desc
</select>
1.3.3、功能测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.4、删除菜品

1.4.1、需求分析和设计

业务规则:

  • 可以一次删除一个菜品,也可以批量删除菜品
  • 起售中的菜品不能删除
  • 被套餐关联的菜品不能删除
  • 删除菜品后,关联的口味数据页需要删除掉

接口设计:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据库设计:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.4.2、代码开发

DishController

/**
 *菜品批量删除
 * @param ids
 * @return
 */
@DeleteMapping
@ApiOperation("菜品批量删除")
public Result delete(@RequestParam List<Long> ids){
    log.info("菜品批量删除:{}",ids);
    dishService.deleteBatch(ids);
    return Result.success();
}

DishService

void deleteBatch(List<Long> ids);

DishServiceImpl

   @Transactional
    @Override
    public void deleteBatch(List<Long> ids) {
        //判断当前菜品是否能够删除--是否存在起售中的菜品
        for (Long id : ids) {
            Dish dish = dishMapper.getById(id);
            if (dish.getStatus() == StatusConstant.ENABLE){
                //当前菜品处于起售中,不能删除
                throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);
            }
        }
        //判断当前菜品是否能删除--是否被套餐关联了
        List<Long> setmealIds = setMealDishMapper.getSetmealIdsByDishIds(ids);
        if (setmealIds != null && setmealIds.size() > 0){
            //当前菜品被套餐关联了,不能删除
            throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);
        }
        //删除菜品关联的菜品数据
//        for (Long id : ids) {
//            dishMapper.deleteById(id);
//            //删除菜品关联的口味数据
//            dishFlavorMapper.deleteByDishId(id);
//        }
        //根据菜品id集合批量删除菜品数据
        dishMapper.deleteByIds(ids);
        //根据菜品id集合批量删除关联的口味数据
        dishFlavorMapper.deleteByDishIds(ids);
    }

DishMapper

void deleteByIds(List<Long> ids);

DishFlavorMapper

void deleteByDishIds(List<Long> dishIds);

DishMapper.xml

<delete id="deleteByIds">
    delete from dish where id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
</delete>

DishFlavorMapper.xml

<delete id="deleteByDishIds">
    delete from sky_take_out.dish_flavor where dish_id in
    <foreach collection="dishIds" item="dishId" separator="," open="(" close=")">
        #{dishId}
    </foreach>
</delete>
1.4.3、功能测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.5、修改菜品

1.5.1、需求分析与设计

接口设计:

  • 根据id查询菜品

  • 根据类型查询分类(已实现)
  • 文件上传(已实现)
  • 修改菜品状态
  • 修改菜品

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.5.2、代码开发

1、根据id查询菜品

DishController

@GetMapping("/{id}")
@ApiOperation("根据id查询菜品")
public Result<DishVO> getById(@PathVariable Long id){
    log.info("根据id查询菜品:{}",id);
    DishVO dishVO = dishService.getByIdWithFlavor(id);
    return Result.success(dishVO);
}

DishService

DishVO getByIdWithFlavor(Long id);

DishServiceImpl

@Override
public DishVO getByIdWithFlavor(Long id) {
    //根据id查询菜品数据
    Dish dish = dishMapper.getById(id);

    //根据菜品id查询口味数据
    List<DishFlavor> dishFlavors = dishFlavorMapper.getByDishid(id);

    //将查询到的数据封装到Vo
    DishVO dishVO = new DishVO();
    BeanUtils.copyProperties(dish,dishVO);
    dishVO.setFlavors(dishFlavors);

    return dishVO;
}

DishFlavorMapper

@Select("select * from sky_take_out.dish_flavor where dish_id = #{dishId}")
List<DishFlavor> getByDishid(Long dishId);

2、修改菜品和菜品状态

DishController

/**
 * 修改菜品
 * @param dishDTO
 * @return
 */
@PutMapping
@ApiOperation("修改菜品")
public Result update(@RequestBody DishDTO dishDTO){
    log.info("修改菜品:{}",dishDTO);
    dishService.updateWithFlavor(dishDTO);
    return Result.success();
}

/**
 * 启用禁用菜品
 * @param status
 * @param id
 * @return
 */
@PostMapping("/status/{status}")
@ApiOperation("启用禁用菜品")
public Result startOrStop(@PathVariable Integer status,Long id){
    log.info("启用禁用菜品:{},{}",status,id);
    dishService.startOrStop(status,id);
    return Result.success();
}

DishService

/**
 * 根据id修改菜品基本信息和对应的口味信息
 * @param dishDTO
 * @return
 */
void updateWithFlavor(DishDTO dishDTO);

/**
 * 启用禁用菜品
 * @param status
 * @param id
 */
void startOrStop(Integer status, Long id);

DishServiceImpl

/**
 * 根据id修改菜品基本信息和对应的口味信息
 * @param dishDTO
 * @return
 */
@Override
public void updateWithFlavor(DishDTO dishDTO) {
    Dish dish = new Dish();
    BeanUtils.copyProperties(dishDTO,dish);

    //修改菜品表基本信息
    dishMapper.update(dish);
    //删除所有的口味数据
    dishFlavorMapper.deleteByDishId(dishDTO.getId());
    //重新插入如口味数据
    List<DishFlavor> flavors = dishDTO.getFlavors();
    if (flavors !=null && flavors.size() > 0){
        flavors.forEach(dishFlavor -> {
            dishFlavor.setDishId(dishDTO.getId());
        });
        dishFlavorMapper.insertBatch(flavors);
    }
}

/**
 * 启用禁用菜品
 * @param status
 * @param id
 */
@Override
public void startOrStop(Integer status, Long id) {
    Dish dish = Dish.builder()
            .status(status)
            .id(id)
            .build();
    dishMapper.update(dish);
}

DishMapper

/**
 * 根据菜品id集合批量删除菜品
 * @param ids
 */
void deleteByIds(List<Long> ids);

/**
 * 根据id动态修改菜品数据
 * @param dish
 */
@AutoFill(value = OperationType.UPDATE)
void update(Dish dish);

DishMapper.xml

<update id="update">
    update dish
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="categoryId != null">category_id = #{categoryId},</if>
        <if test="price != null">price = #{price},</if>
        <if test="image != null">image = #{image},</if>
        <if test="description != null">description = #{description},</if>
        <if test="status != null">status = #{status},</if>
        <if test="updateTime!= null">update_time = #{updateTime},</if>
        <if test="updateUser != null">update_user = #{updateUser},</if>
    </set>
    where id = #{id}
</update>
1.5.3、功能测试

@AutoFill(value = OperationType.UPDATE)
void update(Dish dish);


DishMapper.xml

```xml
<update id="update">
    update dish
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="categoryId != null">category_id = #{categoryId},</if>
        <if test="price != null">price = #{price},</if>
        <if test="image != null">image = #{image},</if>
        <if test="description != null">description = #{description},</if>
        <if test="status != null">status = #{status},</if>
        <if test="updateTime!= null">update_time = #{updateTime},</if>
        <if test="updateUser != null">update_user = #{updateUser},</if>
    </set>
    where id = #{id}
</update>
1.5.3、功能测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

Mybatis和Mybatis-plus区别和联系

MyBatis 和 MyBatis-Plus 是两个用于 Java 数据持久层的框架&#xff0c;它们在功能和使用场景上有所不同。如果项目需要高度自定义和复杂的 SQL 逻辑处理&#xff0c;且开发团队熟悉 SQL&#xff0c;那么 MyBatis 是一个更好的选择。相反&#xff0c;如果希望提高开发效率&…

EPLAN P8 2024-操作记录

目录 设备标识符包含页面 效果如下​编辑 步骤如下 连接点代号的分隔符创建 效果如下 步骤如下 中断点连接排序 效果如下 步骤如下 触点关联参考位置调整、 效果如下 步骤如下 端子排定义 效果如下 步骤如下 端子排连接 效果如下 离散端子操作如下 连接…

操作系统基础知识:调度器、闲逛进程,闲逛进程的特性,什么事件会触发“调度程序”?

被调度程序选中和时间用完由调度程序引起&#xff0c;调度程序决定&#xff1a; 让谁运行由调度算法决定&#xff1b;运行多长时间由时间片大小决定。 什么事件会触发“调度程序”? 1.创建新进程 2.进程退出 3.运行进程阻塞 4.I/0中断发生(可能唤醒某些阻塞进程) 非抢占式调…

「每周只上一天班」谷歌散漫制度遭前CEO怒斥:输给OpenAI,再下去要输创业公司了

「谷歌决定拥抱生活与工作平衡&#xff1a;更早下班、远程工作&#xff0c;胜过在竞争中取胜。」施密特说道。「而说到初创公司&#xff0c;他们之所以能成功&#xff0c;是因为人们在拼命地工作。」 在本周三公布的一份斯坦福大学公开课视频中&#xff0c;谷歌前 CEO 埃里克・…

机器学习 之 sklearn的使用介绍和如何找到API

scikit-learn&#xff08;简称 sklearn&#xff09;是基于python语言的一个第三方机器学习库&#xff0c;它提供了简单而有效的工具来进行数据分析和建模。建立在numpy pandas SciPy和Malpotlib库上&#xff0c;下面是对如何使用 sklearn 以及如何找到其 API 的一个基本介绍&am…

算法:DFS解决FloodFill算法

目录 题目一&#xff1a;图像渲染 题目二&#xff1a;岛屿数量 题目三&#xff1a;岛屿的最大面积 题目四&#xff1a;被围绕的区域 题目五&#xff1a;太平洋大西洋水流问题 题目六&#xff1a;扫雷游戏 题目七&#xff1a;衣橱整理 题目一&#xff1a;图像渲染 有一幅…

Unity MessagePack代替Json让你的数据更小还更快

Unity MessagePack代替Json让你的数据更小还更快 前言项目下载并安装MessagePack编写测试代码添加并设置脚本生成AOT代码编写加载AOT代码文件运行效果 参考 前言 前端给后端发的Json数据有点大&#xff0c;使用MessagePack优化一下&#xff08;MessagePack原理官网解释的很清晰…

前端案例:极速问诊项目(移动端自适应)(HTML+CSS+JS)

一个简单的移动端案例&#xff0c;模拟不同设备下逻辑分辨率不同&#xff0c;宽高自适应 正常打开整体布局 打开 f12 &#xff08;ctrl shift M&#xff09;或者点击左上角图标,将其模拟为移动端设备 在移动设备iPhone6/7/8&#xff0c;逻辑分辨率375的整体布局 其banner图尺…

1.9万亿字节跳动,没钱了?

字节再融资 近期投行圈热度最高的事情&#xff0c;是字节跳动正在积极与相关金融机构展开洽谈&#xff0c;期望对其现有的 50 亿美元贷款进行再融资&#xff0c;期限三年。 若是再融资能成&#xff0c;大概率会成为中国借款人年内进行的最大规模贷款再融资交易事件。 这下可好了…

Cesium for Unreal 打包像素流去掉 CLICK TO START

文章目录 1. 像素流去掉 CLICK TO START问题分析1. 像素流去掉 CLICK TO START 问题 分析 在后缀添加参数:MatchViewportRes=true&HoveringMouse=true 例如: http://192.168.0.106:5027/?MatchViewportRes=true&HoveringMouse

【课程总结】day24(上):大模型三阶段训练方法(LLaMa Factory)

前言 本章我们将通过 LLaMA-Factory 具体实践大模型训练的三个阶段&#xff0c;包括&#xff1a;预训练、监督微调和偏好纠正。 大模型训练回顾 训练目标 训练一个医疗大模型 训练过程实施 准备训练框架 LLaMA Factory是一款开源低代码大模型微调框架&#xff0c;集成了业…

Spring Security 01.两个功能

在 Spring Security 的架构设计中&#xff0c;认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;是分开 的&#xff0c;在本书后面的章节中读者可以看到&#xff0c;无论使用什么样的认证方式&#xff0c;都不会影响授权&#xff0c;这是…

国际网络组网如何布署?

国际网络组网的布署涉及多个关键的步骤和注意事项&#xff0c;以确保网络的可靠性、可扩展性和安全性。通过深入分析网络需求、基础设施选择、网络设备配置、数据安全及灾难恢复计划等方面&#xff0c;可以实现有效的国际网络组网布署。 在网络需求分析的阶段&#xff0c;首先需…

Flow Simulator 案例分享:换热器的一维仿真

换热器的 CFD 仿真 换热器广泛用于动力设备、空调系统和电子设备等冷、热介质的热量交换。由于结构上存在大量的管束和翅片结构&#xff0c;在 CFD 仿真中通常不会创建全细节模型&#xff0c;而是采用多孔介质和换热效率模型来简化。 各种类型的换热器 Flow Simulator中的换热器…

探索Python的隐秘武器:itsdangerous的威力与妙用

文章目录 **探索Python的隐秘武器&#xff1a;itsdangerous的威力与妙用**第一部分&#xff1a;背景介绍第二部分&#xff1a;itsdangerous是什么&#xff1f;第三部分&#xff1a;如何安装itsdangerous&#xff1f;第四部分&#xff1a;itsdangerous的五个简单函数第五部分&am…

DVWA中文件上传漏洞之High渗透测试

1、代码分析 我们可以看到DVWA中文件上传漏洞的代码&#xff0c;现在我们对这个进行渗透测试。 方法1&#xff1a;直接用脚本改成图片格式看是否可行。改成jpg或者jpeg或者png 通过这种方式&#xff0c;我们发现上传的时候会被拦截&#xff0c;所以这个方式不可取 方法2&…

【MATLAB源码-第248期】基于matlab的EMD算法+ICA算法轴承故障分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 经验模态分解&#xff08;EMD&#xff09;与轴承故障识别 EMD的基本原理 EMD 是一种自适应的信号分解技术&#xff0c;最初由 Huang 等人在 1998 年提出&#xff0c;旨在分析非线性和非平稳信号。传统的信号处理方法通常假…

Spring框架的应用(面试题)

目录 14. Spring框架中的Bean的作用域 通过XML方式设置bean的作用域 通过注解方式设置bean的作用域 15. Spring框架中的Bean的线程安全 16.Spring 框架中的Bean生命周期 17.Spring 框架如何解决循环依赖? 18.Spring 框架中有哪些注解? 19.Spring 框架中用到的设计模式…

uniapp在线下载安装包更新app

首先用getSystemInfo判断平台、 再通过json文件模拟接口 判断版本号是否一致 不一致则下载服务器apk进行更新 外加网络波动导致失败重新下载更新包 uni.getSystemInfo({success: function (e) {// #ifndef H5// 获取手机系统版本const system e.system.toLowerCase();const pl…

博世(BOSCH)× Milvus:智能驾驶领域的数据挖掘革新

01.博世智能驾控&#xff1a;智能驾驶技术的领航者 博世&#xff08;BOSCH&#xff09;智能驾控是全球汽车技术领域的领导者&#xff0c;以其在自动驾驶技术上的创新和深厚历史而闻名。博世的自动驾驶解决方案&#xff0c;包括先进的驾驶辅助系统&#xff08;ADAS&#xff09;…