【SpringBoot项目】SpringBoot项目-瑞吉外卖【day03】分类管理

news2024/11/15 11:45:11

文章目录

    • 前言
    • 公共字段自动填充
        • 问题分析
        • 代码实现
        • 功能测试
        • 功能完善
    • 新增分类
        • 需求分析
        • 模型
        • 代码开发
        • 功能测试
    • 分类信息分页查询
        • 需求分析
        • 代码开发
        • 功能测试
    • 删除分类
        • 需求分析
        • 代码开发
        • 功能完善
    • 修改分类
        • 需求分析
        • 代码实现
    • 结尾

🌕博客x主页:己不由心王道长🌕!
🌎文章说明:SpringBoot项目-瑞吉外卖【day03】分类管理🌎
✅系列专栏:SpringBoot项目
🌴本篇内容:对黑马的瑞吉外卖项目的day03进行笔记和项目实现🌴
☕️每日一语:生活不可能像你想象得那么好,但也不会像你想象得那么糟。☕️
🚩 交流社区:己不由心王道长(优质编程社区)

前言

本次文章对应所属项目的第3天,我在想,我项目进度到底是快了还是慢了。这个问题有点深奥,如果对于官方给的进度,那我项目肯定是慢了;但是项目得消化,不能做完即可,图个完成任务的心态是不可取的,所以还是慢慢来吧。

公共字段自动填充

问题分析

我们在day02已经对后台的员工管理功能进行了开发,在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段信息,在编辑员工时需要设置修改时间和修改人等字段信息。这些字段都是属于公共字段,也就是很多表中都有的字段,如下所示:

在这里插入图片描述
在这里插入图片描述

基本每个表都有以上字段,而且我们在每一个需要用到的修改、新增时都用到了这些公共字段。

在这里插入图片描述
在这里插入图片描述
这些代码十分冗余,没有技术含量,每次都写一遍是不可接受的。那么我们能不能对于这些公共字段做一个统一的处理,以便简化开发,让代码更加美观呢?可以!
MybatisPlus为我们提供了公共字段自动填充功能。
Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。
实现步骤:

1、在实体类的属性上加入@TableField注解,指定自动填充的策略
在这里插入图片描述
在这里插入图片描述
可以看到,我们能在相应的公共字段上,添加@TableField注解,然后在括号里选择方式,最后选择填充策略。填充策略有默认、插入、插入和更新、更新四种。

@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;

以上是公共字段填充,为什么填充策略不同呢?这里解释一下:

因为createTime只有在新建的时候使用,而updateTime在插入的时候就已经算更新了,在后面的更新中当然也算。所以updateTime的策略是插入和更新时填充,同理可以理解其他几个。

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

代码实现

package com.example.commons;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

/**
 * 自定义公共字段自动填充
 * @author 不止于梦想
 * @date 2022/11/15 20:23
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * insert策略填充
     * @param metaObject
     */
    @Override
    public  void insertFill(MetaObject metaObject) {
        log.info(metaObject.toString());
        log.info("insert填充策略......");
    }

    /**
     * update策略填充
     * @param metaObject
     */

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info(metaObject.toString());
        log.info("update填充策略......");
    }
}

这里没有进行任何填充,先测试一下代码是否能够走通

功能测试

我们在update策略里输出日志并且打上断点,验证我们程序是否能够执行成功。
在这里插入图片描述
这是更新策略,所以我们修改员工信息:
在这里插入图片描述
可以看到,代码是可以走通的。并且是在UPDATE之前,这就是我们想看到的
在这里插入图片描述

功能完善

这里其实把上面没写的代码一并在这里完成,这里原本是解决ThreadLocal问题的,一并解决了吧。
先把update的里面这几句注释掉,现在要用公共字段填充,这些不写了,拜拜勒:
在这里插入图片描述
重启项目发送更新请求:
在这里插入图片描述
注意看参数,update时间跟我当前时间不符合,说明了现在没有填充时间。下面依次完成需要的填充:

package com.example.commons;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 自定义公共字段自动填充
 * @author 不止于梦想
 * @date 2022/11/15 20:23
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * insert策略填充
     * @param metaObject
     */
    @Override
    public  void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime",LocalDateTime.now());
        log.info("insert填充策略......");
    }

    /**
     * update策略填充
     * @param metaObject
     */

    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime", LocalDateTime.now());
        log.info("update填充策略......");
    }
}

上面这段代码是不完整的,没有设置本次插入或者更新的人的id,我们能不能用session对象设置呢?不行,因为在方法执行的时候,真正的方法压根没有明着调用我们这个公共填充,而一次request请求你也给不了它。

解决办法,首先我们要知道的是一次request请求其实对应的是一次线程,而我们要用到的线程是JDK为我们提供的ThreadLocal.
这里我们先要确认一件事情,就是每当前台发一次http请求,我们后台对应的服务器是不是分配了一个新的线程来处理:

多余解释画蛇添足,下面是官方给的方法,我们可以试试:

在处理过程中涉及到下面类中的方法都属于相同的一个线程:
1、LoginCheckFilter的doFilter方法
2、EmployeeController的update方法
3、MyMetaObjectHandler的updateFill方法
可以在上面的三个方法中分别加入下面代码 (获取当前线程id):
long id Thread. current Thread() getId() :
Log. info(“线程id:1”,id) :
执行编辑员工功能进行验证,通过观察控制台输出可以发现,一次请求对应的线程id是相同的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以知道的是一次请求确实是对应一个线程,还得验证一件事情,就是不同请求不是一次线程。再发一次:
在这里插入图片描述
既然每次请求对应一个线程,我们不可以共有一个请求,一个线程我们是可以共享的,而且别的请求线程也影响不到你的线程。

介绍ThreadLocal:

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

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

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

有了步骤咱就整它,打它啊,打它mad!:

实现步骤:
1、编写BaseContext工具类,基于ThreadLocal封装的工具类

package com.example.commons;

/**
 * @author 不止于梦想
 * @date 2022/11/15 21:45
 */
public class BaseContext {
    //设置成静态属性
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    /**
     * 设置线程局部变量
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }

    /**
     * 获取线程局部变量的值
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

2、在LoginCheckFilter的doFilter方法中调用BaseContext来设置当前登录用户的id

if (httpServletRequest.getSession().getAttribute("employee")!=null) {
            log.info("用户已经登录"+httpServletRequest.getSession().getAttribute("employee"));
            //获取当前请求的用户id
            long empId = (long) httpServletRequest.getSession().getAttribute("employee");
           //设置当前线程的线程局部变量的值
            BaseContext.setCurrentId(empId);
            filterChain.doFilter(httpServletRequest,httpServletResponse);

只有已经登录过的用户才能获取到对应的id。
3、在MyMetaObjectHandler的方法中调用BaseContext获取登录用户的id

 metaObject.setValue("updateUser",BaseContext.getCurrentId());

测试:
在这里插入图片描述

最后把所有公共字段去掉

新增分类

需求分析

在这里插入图片描述
在我们的分类管理中,有两个新增分类,分别是新增菜品分类和新增套餐分类。
在这里插入图片描述
在这里插入图片描述
新增菜品分类和新增套餐分类其实基本无差别,只是发给后台时的type属性不同。
在这个功能中,我们需要连接前端,并且在后端区分,然后把操作数据存入数据库。
在这里插入图片描述

在这里插入图片描述
调用了axios、方法是post方法。
在这里插入图片描述
只判断了code,所以新的controller应该是String类型。

模型

在这个功能中,我们的数据模型跟前面的不一样了,不再是employee,而是category
在这里插入图片描述
两个分类模式,数据其实存入了一张表之中。

需要注意的是这里的name设置了唯一性约束,如果名字重复是会抛出异常的
在这里插入图片描述

代码开发

这里直接导入类category:

package com.example.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 分类
 */
@Data
public class Category implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;


    //类型 1 菜品分类 2 套餐分类
    private Integer type;


    //分类名称
    private String name;


    //顺序
    private Integer sort;


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

}

接下来把service、mapper弄好。
然后·写好controller:

package com.example.controller;

import com.example.commons.R;
import com.example.entity.Category;
import com.example.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 不止于梦想
 * @date 2022/11/17 18:21
 */
@RestController
@RequestMapping("/category")
@Slf4j
public class CategoryController {

    @Autowired
    CategoryService categoryService;

    /**
     * 新增分类
     * @param category
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("新增分类");
        boolean save = categoryService.save(category);
        if(save) {
            return R.success("新增分类成功");
        }
        return R.error("新增分类失败");
    }



}

功能测试

在这里插入图片描述
在这里插入图片描述
添加分类成功,接口异常是接下来要处理的信息分页查询。

这里还有一个问题就是,如果我们添加的菜品名字一样,会出异常的,因为我们设计表时就已经把name字段设置为非空了。我们测试一下
在这里插入图片描述
但是我们不会受到影响,因为我们在前面已经设置了一个全局处理异常“Duplicate entry”
在这里插入图片描述
所以会提示我们已经存在。

分类信息分页查询

需求分析

在上面的新增分类,我们已经提到了系统接口404异常,那么这个异常其实就是当我们点击分类管理时,页面就会发送请求去后台查询数据并且返回展示了:
在这里插入图片描述
由上图,当我们点击新增分类时,vue就创建了钩子函数,并调用了getCategoryPage方法。并且传入了页码和页码所在页的大小。其实就是一个分页查询,我们在employee时已经做过,所以这里直接跟进getCategoryPage:
在这里插入图片描述
细节如图。

代码开发

@GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        log.info("分页查询");
        //构造分页构造器
        Page pageInfo = new Page(page,pageSize);
        //构造条件构造器,输出时要用到
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByAsc(Category::getSort);
        //进行分页查询
        categoryService.page(pageInfo, queryWrapper);
        return R.success(pageInfo);
    }

功能测试

在这里插入图片描述

删除分类

需求分析

在这里插入图片描述
可以看到,我们的分类管理后面其实是可以操作的,而这里要介绍的操作就是删除分类。
这里需要注意是当分类关联了菜品或者套餐时,此分类是不允许删除的。这里解释一下,我们这里只是套餐分类,真正的细节并不是存在这个表里的,而是分别存在相应的表中:
在这里插入图片描述
在这里插入图片描述
如上图,分类表只能表示有没有当前种类和添加种类,删除不归它管理,如果不存在该种类,查询时自然不显示。

代码开发

我们还是先做简单的删除
在这里插入图片描述
在这里插入图片描述
注意这里通过id删除,但参数传递时是ids

  @DeleteMapping
    public R<String> delete(Long ids){
        log.info("删除操作......");
        categoryService.removeById(ids);
        return  R.success("删除成功");
    }

功能完善

这里细节就不多说了。
上代码,不过那些需要导入和构建架构的代码就不上了,太水:
CustomExcption:

package com.example.commons;

/**
 * @author 不止于梦想
 * @date 2022/11/17 21:00
 */

/**
 * 自定义异常
 */
public class CustomerExcption extends RuntimeException{
    /**
     * 传入异常信息,交给父类
     * @param msg :异常信息
     */
    public CustomerExcption(String msg){
        super(msg);
    }
}

CategoryServiceImpl:

package com.example.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.commons.CustomerExcption;
import com.example.entity.Category;
import com.example.entity.Dish;
import com.example.entity.Setmeal;
import com.example.mapper.CategoryMapper;
import com.example.service.CategoryService;
import com.example.service.DishService;
import com.example.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 不止于梦想
 * @date 2022/11/17 18:19
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
    @Autowired
    DishService dishService;
    @Autowired
    SetmealService setmealService;

    /**
     * 通过id删除分类,删除之前检查有没有关联套餐(Setmeal)或者菜品(Dish),需要用到这两者的服务,所以在上边进行注入
     * @param id
     */
    @Override
    public void remove(Long id) {
        //判断是否关联Dish,设置查询条件
        LambdaQueryWrapper<Dish> dish = new LambdaQueryWrapper<>();
        //菜品分类id
        //    private Long categoryId;比较两者id是否相等
        //设置条件判断,条件为传入id与Dish表中的属性CategoryId相等
        dish.eq(Dish::getCategoryId,id);
        //调用dishService服务,查询相等的条数
        int count1 = dishService.count(dish);
        //如果存在,则说明关联,抛出异常,提示前台
        if(count1>0){
            throw new CustomerExcption("菜品已被关联,不能删除");
        }
        //判断是否关联Dish,设置查询条件
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //分类id
        //private Long categoryId;
        //设置查询条件
        setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
        //调用setmealService服务,查询相等的条数
        int count2 = setmealService.count(setmealLambdaQueryWrapper);
        //如果存在,则说明关联,抛出异常,提示前台
        if(count2>0){
            throw new CustomerExcption("套餐已被关联,不能删除");
        }
        //否则,则没有关联,正常关联分类,调用接口的ById方法
        super.removeById(id);

    }
}


别忘了再最开始的地方更改为你刚修改的方法:
在这里插入图片描述
如果还是留着上次的方法,小心数据丢失(悲伤)。
测试:
![在这里插入图片描述](https://img-blog.csdnimg.cn/c0e1ef401fd44bb48c7be78de336424a.png
在这里插入图片描述
接下来验证没有关联的能不能删除,隆江猪脚饭是我刚添加的没有关联:
在这里插入图片描述

修改分类

需求分析

在这里插入图片描述

当我们点击修改时,前端根据id进行查询,并进行了一个回显操作,这里就不细究了,我们可以看到这里可以更新两个信息,名称和排序。
在这里插入图片描述
当点击确定时,会把以上信息作为参数进行查询。
在这里插入图片描述
参数时id,name,和sort,但是更新时间什么的都会设置,所以这里直接用对象作为参数。返回值是code、请求时put,路径明细如下:

在这里插入图片描述

代码实现

@PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("参数:{}",category.toString());
        categoryService.updateById(category);
        return R.success("修改成功");
    }

验证:
在这里插入图片描述
在这里插入图片描述

结尾

创作不易,喜欢的给个三连。

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

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

相关文章

11.17 - 每日一题 - 408

每日一句&#xff1a; 世上没有侥幸的成功&#xff0c;只有加倍的努力。 数据结构 1 一棵左右子树均不空的二叉树在先序线索化后&#xff0c;其中空的链域的个数是______ A. 0B. 1C 2D.不确定答案&#xff1a;B 解析&#xff1a;线索二叉树利用了二叉链表中的空的左右孩子指…

高通导航器软件开发包使用指南(3)

高通导航器软件开发包使用指南&#xff08;3&#xff09;3.2 实时数据查看3.3 日志分析3.4 其他日志记录系统信息3.4.1查看数据记录选项3.4.2确保日志存储3.4.3获取snav_vector版本3.2 实时数据查看 snav_sinspector控制台应用程序允许以人工方式查看日志文件中的二进制数据 …

java项目-第142期ssm美食推荐系统-ssm毕业设计_计算机毕业设计

java项目-第142期ssm美食推荐系统-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm美食推荐系统》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、热门美食、美食教程、美食店铺 、美食社区、美食资…

Arthas教程

Linux环境安装 下载地址&#xff1a;https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar 运行 quit 退出 stop 停止Arthas快速入门 一.执行一个jar包 二.通过arthas来attach&#xff08;黏附&#xff09; 三.常用命令操作 诊断demo下载http…

Oracle Primavera Unifier活动管理器(Activity Manager)

目录 一、简要介绍 二、其他相关 一、简要介绍 Oracle Primavera Unifier Activity“活动”被定义为必须按计划完成的工作或事件的一部分。 Activity也就是以上的活动&#xff0c;它从映射的 P6 项目中捕获计划数据&#xff0c;从公司级主费率表&#xff08;默认&#xff0…

大数据必学Java基础(一百零二):连接池的使用

文章目录 连接池的使用 一、连接池基础知识扩展 二、代码实战 1、定义连接池

信道划分介质访问控制ALOHA协议CSMA协议CSMA/CD协议轮询访问MAC协议

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录传输数据两种链路点对点链路广播式链路介质访问控制静态划分信道动态划分信道轮询访问介质访问控制随机访问介质访问控制---所有用户都可以随机发送信息ALOHA协议------想说就说CSMA协议------先听再说1-坚持…

【保姆级】新机器部署RabbitMQ

1、登录服务器&#xff0c;如果非root用户则切root用户 sudo su - 2、在/usr/tmp目录上传erlang、rabbitmq安装包 3、将安装包移到/usr/local/目录 mv /usr/tmp/erlang-21.3.8.2-1.el7.x86_64.rpm /usr/local/ mv /usr/tmp/rabbitmq-server-3.7.15-1.el7.noarch.rpm /usr/lo…

基础知识:临界阻尼

任何一个振动系统&#xff0c;当阻尼增加到一定程度时&#xff0c;物体的运动是非周期性的&#xff0c;物体振动连一次都不能完成&#xff0c;只是慢慢地回到平衡位置就停止了。当阻力使振动物体刚好能不作周期性振动而又能最快地回到平衡位置的情况&#xff0c;称为“临界阻尼…

JS高级(三):严格模式、闭包、递归、深拷贝和浅拷贝

JavaScript高级&#xff08;三&#xff09;一、严格模式1.开启严格模式&#xff08;1&#xff09;为脚本开启严格模式&#xff08;2&#xff09;为某个函数开启严格模式2.严格模式的一些规定&#xff08;1&#xff09;禁止变量未声明就赋值&#xff08;2&#xff09;禁止删除已…

AMD发布22.11.1驱动,支持《使命召唤:战区2.0》

他来了他来了&#xff0c;带着迷人的脚步走来了&#xff01; 《使命召唤&#xff1a;战区2.0》正式上线了。有Steam周榜三连冠的《使命召唤19》在前&#xff0c;《战区2.0》可以说是备受瞩目&#xff0c;免费大逃杀&#xff0c;谁不期待&#xff1f; &#xff08;图源自steam&…

一句话生成图片,FlagAI使用(附页面操作代码) | 机器学习

目录 前言 项目结构 页面交互调整 总结 前言 最近Text-To-Image是一个很火的话题&#xff0c;甚至更进一步的Text-To-Video话题度也在不断上升。最近看到一个开源项目FlagAI&#xff0c;是目前我觉着效果比较好的项目之一。安装操作简单&#xff0c;支持中英文&#xff0c;…

疫情防控管理系统

1、项目介绍 疫情防控管理系统拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;医护信息管理、物资管理、疫苗管理、疫站管理等 用户&#xff1a;登录注册、物资、疫苗、疫站查看 2、项目技术 后端框架&#xff1a; Servlet、mvc模式 前端技术&#xff1a;Bootst…

yolov5剪枝实战1: 论文及yolov5剪枝实战项目介绍

本系列博客介绍yolov5剪枝方法 1. 介绍 神经网络一般都存在过参数化(over-parameterized)的问题,存在冗余的神经元或权重,所以可以进行剪枝。 其实对网络可以针对不同的颗粒度进行剪枝,可以进行权重、神经元级别的剪枝,也可以基于channel, shape,filter以及layer级别的剪枝…

卷积神经网络基础

由于篇幅所限&#xff0c;本章将重点介绍计算机视觉的经典模型&#xff08;卷积神经网络&#xff09;和两个典型任务&#xff08;图像分类和目标检测&#xff09;。主要涵盖如下内容&#xff1a; 卷积神经网络&#xff1a;卷积神经网络&#xff08;Convolutional Neural Netwo…

Nginx知识汇总

一、Nginx的简介 nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff1b;同时也是一个IMAP、POP3、SMTP代理服务器&#xff1b;nginx可以作为一个HTTP服务器进行网站的发布处理&#xff0c;另外nginx可以作为反向代理进行负载均衡的实现。 二、Nginx的优…

基于微信小程序的沁园健身房预约管理系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

[附源码]Python计算机毕业设计 楼盘销售管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Linux】第十二章 多线程(线程概念+线程控制)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

UNet - 训练数据train

目录 1. train 训练数据 2. Loss 值 3. 完整代码 1. train 训练数据 训练的代码只是在之前图像分类的基础上做了一些更改&#xff0c;具体的可以看下面的文章 pytorch 搭建 LeNet 网络对 CIFAR-10 图片分类https://blog.csdn.net/qq_44886601/article/details/127498256 …