SpringBoot+SSM项目实战 苍穹外卖(4) day4作业

news2024/11/27 11:30:26

继续上一节的内容,本节是作业课程,要求独立完成套餐管理模块所有业务功能,包括:新增套餐、套餐分页查询、删除套餐、修改套餐、起售停售套餐。

目录

  • 新增套餐
    • 根据分类id查询菜品功能
    • 新增套餐功能
  • 套餐分页查询
  • 删除套餐
    • 根据id查询套餐功能
    • 删除套餐功能
  • 修改套餐
  • 起售停售套餐
    • 起售停售菜品
    • 起售停售套餐
      • 写法一
      • 写法二

新增套餐

页面原型:

请添加图片描述

其中的文件上传、和套餐分类查询已经完成。套餐分类查询的接口地址为/admin/category/list,根据请求参数的type值区分查询的分类类型:1为菜品分类,2为套餐分类,这里前端查询的是套餐分类。这些功能前面已经完成不再赘述。

请添加图片描述

在新增套餐时需要选择套餐里包含的菜品,所以需要先完成根据分类id查询菜品功能。

根据分类id查询菜品功能

根据分类id查询菜品接口:

请添加图片描述

先来完成根据分类id查询菜品:

Controller层

DishController.java

/**
 * 根据分类id查询菜品
 *
 * @param categoryId
 * @return
 */
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<Dish>> getByCategory(Long categoryId){
    log.info("根据分类id查询菜品:{}", categoryId);
    List<Dish> list = dishService.getByCategoryID(categoryId);
    return Result.success(list);
}

Service层实现类

DishServiceImpl.java

/**
 * 根据分类id查询菜品信息
 *
 * @param categoryId
 */
public List<Dish> getByCategoryID(Long categoryId) {
    return dishMapper.getByCategoryID(categoryId);
}

Mapper层

/**
 * 根据分类id查询菜品
 *
 * @param categoryId
 */
@Select("select * from dish where status = 1 and category_id = #{categoryId} order by create_time desc")
List<Dish> getByCategoryID(Long categoryId);

完成之后测试新增套餐时往套餐中加入菜品:

请添加图片描述

按道理来说,这里前端写了输入菜品名称进行搜索的,后端应该开发出动态条件查询菜品的功能,输入数据是分类id还有菜品名等,但是这里因为前后端的接口文档里这个接口只传入了一个分类id,所以楼主就没有写动态查询的功能,因此前端的添加菜品里的按名称进行搜索也是无法使用的,有兴趣的可以自己修改前端源码修改接口。

新增套餐功能

新增套餐接口:

请添加图片描述

下面来完成新增套餐:

Controller层

SetmealController

/**
 * 套餐管理
 */
@RestController
@RequestMapping("/admin/setmeal")
@Slf4j
@Api(tags= "套餐相关接口") //描述类的作用
public class SetmealController {
    @Autowired
    private SetmealService setmealServices;

    /**
     * 新增套餐
     *
     * @param setmealDTO
     * @return
     */
    @PostMapping
    @ApiOperation(value = "新增套餐")
    public Result save(@RequestBody SetmealDTO setmealDTO){
        log.info("新增套餐:{}",setmealDTO);
        setmealServices.save(setmealDTO);
        return Result.success();
    }
}

Service层实现类

SetmealServiceImpl

@Service
public class SetmealServiceImpl implements SetmealService {

    @Autowired
    private SetmealMapper setmealMapper;

    @Autowired
    private SetmealDishMapper setmealDishMapper;

    /**
     * 新增套餐,同时需要保存套餐和菜品的关联关系
     *
     * @param setmealDTO
     * @return
     */
    @Transactional // 事务
    public void save(SetmealDTO setmealDTO) {
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, setmeal); //套餐
        List<SetmealDish> setmealDishlist = setmealDTO.getSetmealDishes(); // 套餐菜品关系

        setmealMapper.insert(setmeal);

        long setmealId = setmeal.getId(); //返回自动生成的套餐菜品表主键id

        if (setmealDishlist != null && setmealDishlist.size() > 0) {
            setmealDishlist.forEach(setmealDish -> {
                setmealDish.setSetmealId(setmealId);
            });
            //向套餐菜品关系表插入n条数据
            setmealDishMapper.insertBatch(setmealDishlist);
        }
    }
}

Mapper层

SetmealMapper

/**
 * 新增套餐数据
 *
 * @param setmeal
 */
@AutoFill(OperationType.INSERT) // 公共字段填充
void insert(Setmeal setmeal);

SetmealMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.SetmealMapper">

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into setmeal (category_id, name, price, status, description, image, create_time, update_time, create_user, update_user)
        values (#{categoryId},#{name},#{price},#{status},#{description},#{image},#{createTime},#{updateTime},#{createUser},#{updateUser})
    </insert>
</mapper>

SetmealDishMapper

/**
 * 向套餐菜品关系表批量插入数据
 *
 * @param setmealDishlist
 * @return
 */
void insertBatch(List<SetmealDish> setmealDishlist);

SetmealDishMapper.xml

<insert id="insertBatch">
    insert into setmeal_dish (setmeal_id, dish_id, name, price, copies) VALUES
    <foreach collection="setmealDishlist" item="sd" separator=",">
        (#{sd.setmealId},#{sd.dishId},#{sd.name},#{sd.price},#{sd.copies})
    </foreach>
</insert>

前后端联调测试新增套餐功能,由于未开发套餐分页查询功能,固在数据库中查看数据是否插入成功:

请添加图片描述

请添加图片描述

测试通过,提交代码。





套餐分页查询

接口信息:

请添加图片描述

Controller层

SetmealController

/**
 * 套餐分页查询
 * @param setmealPageQueryDTO
 * @return
 */
@GetMapping("/page")
@ApiOperation("套餐分页查询")
public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO){
    log.info("套餐分页查询,参数为:{}", setmealPageQueryDTO);
    PageResult pageResult = setmealServices.pageQuery(setmealPageQueryDTO);
    return Result.success(pageResult);
}

Service层实现类

SetmealServiceImpl

/**
 * 套餐分页查询
 *
 * @param setmealPageQueryDTO
 * @return
 */
public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO){
    // select * from setmeal limit 0,10
    //开始分页查询
    PageHelper.startPage(setmealPageQueryDTO.getPage(), setmealPageQueryDTO.getPageSize());

    Page<SetmealVO> page = setmealMapper.pageQuery(setmealPageQueryDTO);

    long total = page.getTotal();
    List<SetmealVO> records = page.getResult();

    return new PageResult(total, records);
}

Mapper层

SetmealMapper

    /**
     * 套餐分页查询
     * @param setmealPageQueryDTO
     * @return
     */
    Page<SetmealVO> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);

SetmealMapper.xml

<select id="pageQuery" resultType="com.sky.vo.SetmealVO">
    select
    s.*,c.name categoryName
    from
    setmeal s
    left join
    category c
    on
    s.category_id = c.id
    <where>
        <if test="name != null">
            and s.name like concat('%',#{name},'%')
        </if>
        <if test="status != null">
            and s.status = #{status}
        </if>
        <if test="categoryId != null">
            and s.category_id = #{categoryId}
        </if>
    </where>
    order by s.create_time desc
</select>

测试:

请添加图片描述

测试通过,提交代码。





删除套餐

接口传入的套餐ids包含多个id,所以需要开发批量删除功能。

删除套餐的时候需要判断当前套餐是否在起售状态,否则不能删除,需要使用到根据id查询套餐功能里的查询套餐功能,根据id查询套餐功能里还包括了根据套餐id查询对应菜品的功能,所以干脆先把根据id查询套餐的功能开发了。

根据id查询套餐功能

接口如下:

请添加图片描述

Controller层

SetmealController

@GetMapping("/{id}")
@ApiOperation("根据id查询套餐")
public Result<SetmealVO> getById(@PathVariable Long id){
    log.info("根据id查询套餐:{}", id);
    SetmealVO setmealVO = setmealServices.getByIdWithDishes(id);
    return Result.success(setmealVO);
}

Service层实现类

SetmealServiceImpl

/**
 * 根据套餐id查询套餐和其对应菜品
 * @param id
 * @return
 */
@Override
public SetmealVO getByIdWithDishes(Long id) {
    //根据id查询套餐数据
    Setmeal setmeal = setmealMapper.getById(id);

    //根据套餐id查询菜品数据
    List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);

    //将查询到的数据封装到VO
    SetmealVO setmealVO = new SetmealVO();
    BeanUtils.copyProperties(setmeal, setmealVO);
    setmealVO.setSetmealDishes(setmealDishes);

    return setmealVO;
}

Mapper层

SetmealMapper

/**
 * 根据套餐id查询套餐数据
 * @param id
 * @return
 */
@Select("select * from setmeal where id=#{id}")
Setmeal getById(Long id);

SetmealDishMapper

/**
 * 根据套餐id查询菜品数据
 * @param setmealId
 * @return
 */
@Select("select * from setmeal_dish where setmeal_id=#{setmealId}")
List<SetmealDish> getBySetmealId(Long setmealId);

删除套餐功能

接口如下:

请添加图片描述

Controller层

SetmealController

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

Service层实现类

SetmealServiceImpl

/**
 * 套餐批量删除
 * @param ids
 */
@Transactional //事务
public void deleteBatch(List<Long> ids) {
    //判断当前套餐是否能够删除---是否存在起售中的套餐??
    for (Long id : ids) {
        Setmeal setmeal = setmealMapper.getById(id); //在这里需要使用到根据id查询套餐功能的查询套餐
        if (setmeal.getStatus() == StatusConstant.ENABLE) {
            //当前菜品处于起售中,不能删除
            throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
        }
    }

    for (Long id : ids) {
        setmealMapper.deleteById(id);//删除套餐数据
        setmealDishMapper.deleteBySetmealId(id);//删除套餐菜品关系表中套餐关联的菜品数据
    }
}

Mapper层

SetmealMapper

/**
 * 根据套餐id删除套餐数据
 * @param id
 */
@Delete("delete from setmeal where id = #{id}")
void deleteById(Long id);

SetmealDishMapper

/**
 * 根据套餐id删除套餐菜品关系表中的菜品数据
 * @param setmealId
 */
@Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
void deleteBySetmealId(Long setmealId);

测试略,由于还未开发套餐起售状态修改功能,固可以去数据库直接修改套餐的销售状态,然后去swagger或者前端测试删除起售中的套餐,同时测试批量删除功能。
测试通过后提交代码到git。






修改套餐

共涉及到5个接口:根据id查询套餐(在删除套餐里已完成)、根据类型查询分类(已完成)、根据分类id查询菜品(已完成)、图片上传(已完成)、修改套餐

修改套餐接口信息如下,传入的参数和新增套餐是一致的,只不过从insert改成了update。

请添加图片描述

Controller层

SetmealController

/**
 * 修改套餐
 *
 * @param setmealVO
 * @return
 */
@PutMapping
@ApiOperation("修改菜品")
public Result update(@RequestBody SetmealVO setmealVO) {
    log.info("修改菜品:{}", setmealVO);
    setmealServices.updateWithDishes(setmealVO);
    return Result.success();
}

Service层实现类

SetmealServiceImpl

/**
 * 根据id修改套餐基本信息和对应的菜品信息
 * @param setmealVO
 */
@Transactional //事务
public void updateWithDishes(SetmealVO setmealVO) {
    Setmeal setmeal = new Setmeal();
    BeanUtils.copyProperties(setmealVO, setmeal);

    //修改套餐表基本信息
    setmealMapper.update(setmeal);

    //删除原有的套餐菜品关系表数据
    setmealDishMapper.deleteBySetmealId(setmealVO.getId());

    //重新插入套餐菜品关系数据
    List<SetmealDish> setmealDishes = setmealVO.getSetmealDishes();
    if (setmealDishes != null && setmealDishes.size() > 0) {
        setmealDishes.forEach(setmealDish -> {
            setmealDish.setSetmealId(setmealVO.getId());
        });
        //向套餐菜品关系表插入n条数据
        setmealDishMapper.insertBatch(setmealDishes);
    }
}

Mapper层

SetmealMapper

/**
 * 根据id动态修改套餐数据
 * @param setmeal
 */
@AutoFill(OperationType.UPDATE) // 公共字段填充
void update(Setmeal setmeal);

SetmealMapper.xml

<update id="update">
    update setmeal
    <set>
        <if test="categoryId != null">category_id = #{categoryId},</if>
        <if test="name != null">name = #{name},</if>
        <if test="price != null">price = #{price},</if>
        <if test="status != null">status = #{status},</if>
        <if test="description != null">description = #{description},</if>
        <if test="image != null">image = #{image},</if>
        <if test="updateTime != null">update_time = #{updateTime},</if>
        <if test="updateUser != null">update_user = #{updateUser},</if>
    </set>
    where id = #{id}
</update>

测试:

请添加图片描述

数据库:

请添加图片描述

请添加图片描述

测试通过,提交代码到github。






起售停售套餐

写这一块的时候发现菜品管理里面的起售停售菜品好像老师也没有带我们写,所以干脆一块写了吧。

起售停售菜品

请添加图片描述

Controller层

DishController

@PostMapping("/status/{status}")
@ApiOperation("修改菜品销售状态")
public Result updateStatus(@PathVariable Integer status,Long id){
    log.info("根据分类id修改菜品销售状态:{}", status);
    dishService.updateStatusById(status,id);
    return Result.success();
}

Service层实现类

DishServiceImpl

/**
 * 根据菜品id修改菜品销售状态
 * @param status
 * @param id
 */
public void updateStatusById(Integer status, Long id) {
    Dish dish = Dish.builder()
            .id(id)
            .status(status)
            .build();
    dishMapper.update(dish);//直接调用以前的根据id动态修改菜品数据接口就行
}

Mapper层

这里直接调用以前的菜品修改的Mapper层接口。

DishMapper

/**
 * 根据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>

起售停售套餐

接口:

请添加图片描述

写法一

Controller层

SetmealController

@PostMapping("/status/{status}")
@ApiOperation("修改套餐销售状态")
public Result updateStatus(@PathVariable Integer status,Long id){
    log.info("根据套餐id修改套餐销售状态:{}", status);
    setmealServices.updateStatusById(status,id);
    return Result.success();
}

Service层实现类

SetmealServiceImpl

@Autowired
private DishMapper dishMapper;

/**
 * 根据套餐id修改套餐销售状态
 *
 * @param status
 * @param id
 */
public void updateStatusById(Integer status, Long id) {
    //如果是将套餐的销售状态修改为起售,则需要保证套餐里所有的菜品的销售状态也是起售 否则抛出异常
    if(status==StatusConstant.ENABLE){
        List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);//根据套餐id去套餐菜品关系表里找到所有的菜品
        if(setmealDishes == null || setmealDishes.size()==0) return; //这里其实可以抛出一个异常给前端 套餐里没有菜品
        setmealDishes.forEach(setmealDish -> {//再根据菜品id去菜品表里找到菜品的销售状态
            if(dishMapper.getById(setmealDish.getDishId()).getStatus()==StatusConstant.DISABLE){
                throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
            }
        });
    }

    Setmeal setmeal=Setmeal.builder()
            .id(id)
            .status(status)
            .build();

    setmealMapper.update(setmeal);//直接调用之前写好的根据id动态修改套餐数据接口
}

Mapper层

这里直接调用之前写好的根据id动态修改套餐数据接口就行

SetmealMapper

/**
 * 根据id动态修改套餐数据
 * @param setmeal
 */
@AutoFill(OperationType.UPDATE) // 公共字段填充
void update(Setmeal setmeal);
<update id="update">
    update setmeal
    <set>
        <if test="categoryId != null">category_id = #{categoryId},</if>
        <if test="name != null">name = #{name},</if>
        <if test="price != null">price = #{price},</if>
        <if test="status != null">status = #{status},</if>
        <if test="description != null">description = #{description},</if>
        <if test="image != null">image = #{image},</if>
        <if test="updateTime != null">update_time = #{updateTime},</if>
        <if test="updateUser != null">update_user = #{updateUser},</if>
    </set>
    where id = #{id}
</update>

测试:

请添加图片描述

测试通过,提交代码。




写法二

这里再分享另外一种写法,上面这种写法其实比较偷懒,因为调用的都是现成的mapper接口,得先通过套餐id去套餐菜品关系表里找到套餐菜品关联数据,然后拿到所有的菜品id去菜品表里拿到菜品的销售状态。

其实可以直接通过套餐id、套餐表联合菜品表直接拿到菜品数据,把逻辑写在sql语句就行:

SetmealServiceImpl

@Autowired
private DishMapper dishMapper;

/**
     * 套餐起售、停售
     * @param status
     * @param id
*/
public void startOrStop(Integer status, Long id) {
    //起售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未启售菜品,无法启售"
    if(status == StatusConstant.ENABLE){
        //select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = ?
        List<Dish> dishList = dishMapper.getBySetmealId(id);
        if(dishList != null && dishList.size() > 0){
            dishList.forEach(dish -> {
                if(StatusConstant.DISABLE == dish.getStatus()){
                    throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
                }
            });
        }
    }

    Setmeal setmeal = Setmeal.builder()
        .id(id)
        .status(status)
        .build();
    setmealMapper.update(setmeal);
}

DishMapper

/**
     * 根据套餐id查询菜品
     * @param setmealId
     * @return
*/
@Select("select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = #{setmealId}")
List<Dish> getBySetmealId(Long setmealId);

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

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

相关文章

2023年8月14日 Go生态洞察:向后兼容性、Go 1.21与Go 2

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

echarts中option个参数的含义

var option {title: {text: ECharts 入门示例},tooltip: {},legend: {data: [数量]},xAxis: {data: [衬衫, 羊毛衫, 雪纺衫, 裤子, 高跟鞋, 袜子]},yAxis: {},series: [{name: 数量,type: bar,data: [5, 20, 36, 10, 10, 20]}] }; title&#xff1a;主要控制图表的标题 legen…

python-04(入门基础篇4——lists相关的部分语法)

python-04&#xff08;入门基础篇4——lists相关的部分语法&#xff09; 1. 前言1.1 python入门1.2 参考官网 2. 关于索引和切片3. 在列表追加元素3.1 支持拼接3.2 使用list.append() 方法在列表末尾添加新项 4. 列表是可变类型4.1 更改其中某元素内容4.2 使用切片更改列表大小…

el-table-column 添加 class类

正常添加class 发现没有效果 class"customClass" 发现并没有添加上去 看了一下官网发现 class-name 可以实现 第一步: :class-name"customClass" 第二步 : customClass: custom-column-class, 然后就发现可以了

数据中心:保障企业运营安全可靠的关键

随着人工智能与云计算的爆发&#xff0c;数据中心行业迎来了前所未有的需求增长。然而&#xff0c;这也带来了一系列的挑战。各地政府机构对数据中心建设出台了更为完善和严格的地方标准&#xff0c;企业面临着运营成本高、人才短缺和节能减排等困难。同时&#xff0c;过去频频…

Shrio 安全框架

目录 前言 1.介绍 2.整合 Shiro 到 Spring Boot 3.Shiro 相关配置 总结 前言 几乎所有涉及用户的系统都需要进行权限管理&#xff0c;权限管理涉及到一个系统的安全。Spring Boot 的安全框架整合方案中还有一个璀璨的明珠&#xff1a;Shrio。 1.介绍 Shiro是一款由Java 编…

除了Microsoft的账户密码之外,PIN也有满满的“安全感”,不复杂却更安全

本文介绍如何在Windows 11上更改你的PIN。本说明适用于所有Windows 11电脑&#xff0c;不考虑制造商&#xff08;戴尔、惠普、联想等&#xff09;。 如何在Windows 11上更改PIN 按照以下步骤在Windows 11上更改或创建电脑的PIN&#xff1a; 1、打开Windows设置。右键单击任务…

节省时间,提高效率:深入解析MyBatis Plus

1. MyBatis Plus 概述 将Mybatis 通用Mapper PageHelper 升级成 MyBatis Plus 1.1 简介 官网&#xff1a;https://baomidou.com/ 参考教程&#xff1a;https://baomidou.com/pages/24112f/ MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#…

记录 | 使用samba将ubuntu文件夹映射到windows实现共享文件夹

一、ubuntu配置 1. 安装 samba samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议。 sudo apt-…

解决 Xshell 无法使用 root 账户远程登录 Linux 的问题

文章目录 问题描述问题原因解决办法 笔者出问题时的运行环境&#xff1a; Red Hat Enterprise Linux 9.2 x86_64 Xshell 7 问题描述 笔者在新安装的 Red Hat Enterprise Linux 中发现一个问题。在 RHEL 安装完之后&#xff0c;无法在 Xshell 中使用 root 账户远程登录此 Lin…

光学式雨量监测站-雨量监测的得力助手

随着科技的发展&#xff0c;人们对天气的预测和监测越来越依赖现代化的设备。光学式雨量监测站作为一种雨量监测仪器&#xff0c;能够实现对降雨量的测量&#xff0c;为天气预报和气候研究提供数据支持。 一、光学式雨量监测站的工作原理 WX-YJ3 光学式雨量监测站主要利用光学…

软件测试卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff…

探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展

★人工智能&#xff1b;大数据技术;AIGC;Turbo;DALLE 3;多模态大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;国产GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能计算机&#xff1b;边缘计算&#xff1b;大模型显存占用&#xff1b;5G…

今日问题:解决最新Chrome和chromedriver版本对不上的问题

from selenium import webdriver #from .chrome.webdriver import WebDriver as Chrome from selenium.webdriver.common.by import By from time import sleep driver webdriver.Chrome()driver.get("https://www.baidu.com/") driver.maximize_window()#窗口最大化…

英文论文查重复率网址

大家好&#xff0c;今天来聊聊英文论文查重复率网址&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 英文论文查重复率网址 在撰写英文论文时&#xff0c;查重是确保论文原创性和质量的重要环节快码论文…

01.项目简介

开源数字货币交易所&#xff0c;基于Java开发的货币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所 | 交易平台 | 撮合交易引擎。本项目基于SpringCloudAlibaba微服务开发&#xff0c;可用来搭建和二次开发数字货币交易所。 项目特色&#xff1a; 基于内存撮合引擎&#xf…

快速实现入门HarmonyOS开发

本文档适用于HarmonyOS应用开发的初学者。编写两个简单的页面&#xff0c;实现在第一个页面点击按钮跳转到第二个页面。开始前&#xff0c;请参考下载与安装软件、配置开发环境和运行HelloWorld&#xff0c;完成开发工具的安装和开发环境的配置。 开发Ability 概述&#xff1…

ZStack Cloud构建青州市中医院核心业务云平台

青州市中医院通过ZStack Cloud云平台构建云基础设施&#xff0c;实现对原有物理机和分布式存储平台的利旧和纳管&#xff0c;有效将HIS&#xff08;医院管理系统&#xff09;、PACS&#xff08;影像系统&#xff09;等核心业务系统进行统一管理&#xff1b;同时&#xff0c;借助…

批量AI人工智能写作软件下载【2024最新】

在当今数字化的浪潮中&#xff0c;人工智能技术为各行各业带来了颠覆性的变革。其中&#xff0c;AI在文案创作领域的应用尤为引人瞩目&#xff0c;而批量AI人工智能写作更是成为文案创作者们关注的热点。本文将深入探讨批量AI人工智能写作的概念、其在不同领域的应用&#xff0…

硬件开发笔记(十四):RK3568底板电路LVDS模块、MIPI模块电路分析、LVDS硬件接口、MIPI硬件接口详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134634186 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…