Java开发:Spring Boot 实战教程

序言

随着技术的快速发展和数字化转型的深入推进,软件开发领域迎来了前所未有的变革。在众多开发框架中,Spring Boot凭借其“约定大于配置”的核心理念和快速开发的能力,迅速崭露头角,成为当今企业级应用开发的首选框架之一。

《Spring Boot实战教程》旨在为广大开发者提供一本系统、全面且实用的学习指南。本教程不仅深入解析了Spring Boot的核心特性和最佳实践,还通过大量的实战案例,帮助读者快速掌握Spring Boot的应用开发技巧,从而能够高效、稳定地构建出符合业务需求的Web应用。

1、为何选择Spring Boot?

在众多的开发框架中,Spring Boot以其独特的优势赢得了开发者的青睐。首先,Spring Boot简化了Spring应用的初始搭建和开发过程,通过提供大量的默认配置和自动化配置,使开发者能够快速地启动和运行应用。其次,Spring Boot支持各种主流的开发工具和平台,如Maven、Gradle、IntelliJ IDEA等,方便开发者根据自己的习惯和需求选择最适合的开发环境。最后,Spring Boot拥有庞大的社区支持和丰富的生态系统,开发者可以轻松找到所需的库和插件,实现各种复杂的功能需求。

2、本教程的特点

系统全面:本教程从Spring Boot的基础知识讲起,逐步深入到高级特性和实战应用,涵盖了Spring Boot的各个方面。
实战导向:通过大量的实战案例和示例代码,帮助读者更好地理解和掌握Spring Boot的应用开发技巧。
图文并茂:教程中穿插了大量的图表和示意图,使内容更加生动直观,易于理解。
深入浅出:对于复杂的概念和技术,本教程采用深入浅出、循序渐进的讲解方式,使读者能够轻松掌握。

3、本教程的内容结构

本教程共分为以下几个部分:

基础篇:介绍Spring Boot的基本概念、发展历程和核心特性,以及如何搭建一个基础的Spring Boot项目。
进阶篇:深入解析Spring Boot的高级特性和最佳实践,包括数据访问、Web开发、安全控制、性能优化等方面。
实战篇:通过多个实战案例,展示如何使用Spring Boot构建符合业务需求的Web应用,包括电商网站、企业门户、社交应用等。
高级篇:介绍Spring Boot与微服务架构、云计算、容器化等技术的结合应用,以及如何进行Spring Boot应用的测试和部署。

4、结语

《Spring Boot实战教程》不仅是一本学习指南,更是一本实战手册。通过本教程的学习,你将能够全面掌握Spring Boot的应用开发技巧,并能够在实际项目中灵活运用这些技巧,构建出高效、稳定且符合业务需求的Web应用。让我们一起踏上Spring Boot的实战之旅吧!

一、创建Springboot项目

  1. 创建Maven工程
  2. 导入spring-boot-stater-web起步依赖
  3. 编写Controller
  4. 提供启动类

二、手动创建SpringBoot工程

在这里插入图片描述

在这里插入图片描述

三、编写配置文件application.properties

删除application.properties配置文件,新建application.yml或application.yaml配置文件【两者区别请自行查询】
在这里插入图片描述
在这里插入图片描述

四、编写Controller

在这里插入图片描述

启动项目后在控制台会显示配置的端口

在这里插入图片描述

可以根据需要将pom文件中的jdk17改为jdk8【注意mybatis等三方依赖库的版本也需要降低】

在这里插入图片描述

五、提供启动类

在这里插入图片描述

六、启动服务,在浏览器调用http://localhost:8080/hello

页面返回Hello World~表示调用成功,项目搭建正常

------------接下来就可以进行业务相关接口开发了------------

七、执行sql语句【在navicat、idea或者dos窗口执行sql语句】

-- 创建数据库
create database big_event;

-- 使用数据库
use big_event;

-- 用户表
create table user (
                      id int unsigned primary key auto_increment comment 'ID',
                      username varchar(20) not null unique comment '用户名',
                      password varchar(32)  comment '密码',
                      nickname varchar(10)  default '' comment '昵称',
                      email varchar(128) default '' comment '邮箱',
                      user_pic varchar(128) default '' comment '头像',
                      create_time datetime not null comment '创建时间',
                      update_time datetime not null comment '修改时间'
) comment '用户表';

-- 分类表
create table category(
                         id int unsigned primary key auto_increment comment 'ID',
                         category_name varchar(32) not null comment '分类名称',
                         category_alias varchar(32) not null comment '分类别名',
                         create_user int unsigned not null comment '创建人ID',
                         create_time datetime not null comment '创建时间',
                         update_time datetime not null comment '修改时间',
                         constraint fk_category_user foreign key (create_user) references user(id) -- 外键约束
);

-- 文章表
create table article(
                        id int unsigned primary key auto_increment comment 'ID',
                        title varchar(30) not null comment '文章标题',
                        content varchar(10000) not null comment '文章内容',
                        cover_img varchar(128) not null  comment '文章封面',
                        state varchar(3) default '草稿' comment '文章状态: 只能是[已发布] 或者 [草稿]',
                        category_id int unsigned comment '文章分类ID',
                        create_user int unsigned not null comment '创建人ID',
                        create_time datetime not null comment '创建时间',
                        update_time datetime not null comment '修改时间',
                        constraint fk_article_category foreign key (category_id) references category(id),-- 外键约束
                        constraint fk_article_user foreign key (create_user) references user(id) -- 外键约束
)

八、整合mysql

在这里插入图片描述

九、整合mybatis

在这里插入图片描述

十、配置application.yml文件

在这里插入图片描述

十一、在包名下新建业务分类包

在这里插入图片描述

十二、通用实体类

返回结果实体类:

package com.source.bigevent2.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    private Integer code;//状态码0成功;1失败
    private String msg;//提示信息
    private T data;//响应数据

    public static Result success() {
        return new Result(0, "操作成功", null);
    }

    public static <E> Result<E> success(E data) {
        return new Result<>(0, "操作成功", data);
    }

    public static Result<String> error(String msg) {
        return new Result<>(1, msg, null);
    }
}

分页返回结果实体类:

package com.source.bigevent2.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

//分页返回结果对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean<T>{
    private Long total;//总条数
    private List<T> items;//当前页数据集合
}

十三、注册用户

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如果只添加正则校验参数不合格时会被校验,并抛出异常,如下:

在这里插入图片描述

这时候可以添加全局异常捕获
【参考:https://huaweicloud.csdn.net/638754d5dacf622b8df8b03d.html】,如下:

在这里插入图片描述

十四、登录认证

令牌就是一段字符串
承载业务数据, 减少后续请求查询数据库的次数
防篡改, 保证信息的合法性和有效性
JWT
JWT依赖:

在这里插入图片描述

在这里插入图片描述

JWT详细步骤:

在这里插入图片描述

在这里插入图片描述

JWT工具类:

package com.source.bigevent.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtil {

    private static final String KEY = "itheima";
	
	//接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
                .withClaim("claims", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
                .sign(Algorithm.HMAC256(KEY));
    }

	//接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }

}

登录返回token

    @PostMapping("/login")
    public Result login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {
        User user = userService.findByUserName(username);
        if (user == null) {
            return Result.error("用户名错误");
        }
        if (Md5Util.checkPassword(password, user.getPassword())) {
            Map<String, Object> claims = new HashMap<>();
            claims.put("userId", user.getId());
            claims.put("userName", username);
            String token = JwtUtil.genToken(claims);
            //使用redis对token进行进一步校验,登录成功存一份token到redis中
            redisTemplate.opsForValue().set("Token", token, 12, TimeUnit.HOURS);
            return Result.success(token);
        }
        return Result.error("密码错误");
    }

十五、拦截器认证Token

步骤一、使用拦截器统一验证令牌
在这里插入图片描述

步骤二、登录和注册接口需要放行

主要实现逻辑为WebConfig类【注意路径中有两个”/”】

在这里插入图片描述

十六、使用ThreadLocal进行局部变量存储

可以存储userId等,ThreadLocalUtil见附录一
在这里插入图片描述

在这里插入图片描述

十七、获取用户信息

在这里插入图片描述

通过ThreadLocal可以获取到userName、userId

在这里插入图片描述

十八、更新用户信息

在这里插入图片描述

注意:如果方法的参数是实体类,那么不能存在与之并列的其他参数,也就是说参数只能有实体类一个参数。如果是入参形式为json则必须添加@RequestBody注解,否则无法解析传参数据。
实体类参数校验:实体类成员变量上添加注解【@NotNull、@NotEmpty、@Email】、接口参数的实体参数上添加@Validated注解

在这里插入图片描述

在这里插入图片描述

十九、更新用户头像

在这里插入图片描述
参数校验,必须是url地址

在这里插入图片描述

二十、修改密码

在这里插入图片描述

在这里插入图片描述

二十一、新增文章分类

在这里插入图片描述

二十二、文章分类列表

在这里插入图片描述

二十三、更新文章分类

在这里插入图片描述

在这里插入图片描述

二十四、新增文章【自定义校验】

在这里插入图片描述

参数校验

在这里插入图片描述

自定义校验【@State】

在这里插入图片描述

package com.source.bigevent.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.source.bigevent.annotation.State;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;
import java.time.LocalDateTime;

/**
 * 文章
 */
@Data
public class Article {
    @NotNull(groups = Edit.class)
    private Integer id;
    @NotEmpty
    private String title;
    @NotEmpty
    private String content;
    @URL
    private String coverImg;
    @State
    private String state;
    @NotNull
    private Integer categoryId;
    @NotNull(groups = Add.class)
    private Integer createUser;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    public interface Add extends Default {
    }

    public interface Edit extends Default {
    }
}

二十五、文章列表【条件分页】

引入依赖pagehelper

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在resources文件夹下新建包名和mapper相同的目录并新建ArticelMapper.xml同名文件

在这里插入图片描述

二十六、文件上传

文件上传分两种,一种是存在服务器磁盘,另一种是存在三方云服务器上。

在这里插入图片描述

在这里插入图片描述

A、将文件存在本地磁盘

在这里插入图片描述

B、三方文件存储服务器阿里云OSS
https://blog.csdn.net/m0_72853403/article/details/134611445
https://gitcode.csdn.net/65ec53451a836825ed7988ad.html

在这里插入图片描述

二十七、登录优化【Redis】

Springboot集成redis
在这里插入图片描述

令牌主动失效机制
A、 登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中【这里使用token的值做为key存入redis,避免所有用户使用同一个key来存取值】
在这里插入图片描述

B、 LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌
在这里插入图片描述

C、 当用户修改密码成功后,删除redis中存储的旧令牌
在这里插入图片描述

代码编辑完成后,启动redis安装包中的redis-server.exe即可使用redis

二十八、SpringBoot项目部署

在这里插入图片描述

A、如何生成jar包?
执行package命令即可
B、如何运行jar包?
Java –jar jar包位置
C、如何停止正在运行的服务?
Dos窗口中Ctrl+C
D、Jar包部署对服务器有什么要求?
必须有jre环境
E、启动redis
启动redis安装包中的redis-server.exe才可以使用redis

二十九、属性配置方式【优先级从低到高依次为ABCD】

A、 项目中resources目录下的application.yml
在这里插入图片描述
B、 Jar包所在目录下的application.yml【Window环境下测试不生效】
在这里插入图片描述
C、 操作系统环境变量
在这里插入图片描述

D、 命令行参数
在这里插入图片描述

三十、application配置文件相关知识

application.yml / application.yaml格式如下:
在这里插入图片描述

yml配置信息书写与获取
三方依赖库技术参数信息书写【以redis为例】

在这里插入图片描述

自定义配置参数及获取:
方式一、通过@Value(“${键名}”)

在这里插入图片描述

方式二、通过@ConfigurationProperties(prefix=“前缀”)+@Value(“${键名}”)

在这里插入图片描述

三十一、驼峰命名格式导致实体类和数据库不一致

修改application.yml配置文件
参考:
https://www.cnblogs.com/ubiquitousShare/p/12507070.html
https://blog.csdn.net/weixin_45935633/article/details/104704042
在这里插入图片描述

附录一

一、JWT工具类:

package com.source.bigevent.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtil {

    private static final String KEY = "itheima";
	
	//接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
                .withClaim("claims", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
                .sign(Algorithm.HMAC256(KEY));
    }

	//接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }

}

二、ThreadLocal工具类

package com.source.bigevent.utils;

/**
 * ThreadLocal 工具类
 */
@SuppressWarnings("all")
public class ThreadLocalUtil {
    //提供ThreadLocal对象,
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static <T> T get() {
        return (T) THREAD_LOCAL.get();
    }

    //存储键值对
    public static void set(Object value) {
        THREAD_LOCAL.set(value);
    }


    //清除ThreadLocal 防止内存泄漏
    public static void remove() {
        THREAD_LOCAL.remove();
    }
}

三、Md5工具类

package com.source.bigevent.utils;


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5Util {
    /**
     * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合
     */
    protected static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    protected static MessageDigest messagedigest = null;

    static {
        try {
            messagedigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException nsaex) {
            System.err.println(Md5Util.class.getName() + "初始化失败,MessageDigest不支持MD5Util。");
            nsaex.printStackTrace();
        }
    }

    /**
     * 生成字符串的md5校验值
     *
     * @param s
     * @return
     */
    public static String getMD5String(String s) {
        return getMD5String(s.getBytes());
    }

    /**
     * 判断字符串的md5校验码是否与一个已知的md5码相匹配
     *
     * @param password  要校验的字符串
     * @param md5PwdStr 已知的md5校验码
     * @return
     */
    public static boolean checkPassword(String password, String md5PwdStr) {
        String s = getMD5String(password);
        return s.equals(md5PwdStr);
    }


    public static String getMD5String(byte[] bytes) {
        messagedigest.update(bytes);
        return bufferToHex(messagedigest.digest());
    }

    private static String bufferToHex(byte bytes[]) {
        return bufferToHex(bytes, 0, bytes.length);
    }

    private static String bufferToHex(byte bytes[], int m, int n) {
        StringBuffer stringbuffer = new StringBuffer(2 * n);
        int k = m + n;
        for (int l = m; l < k; l++) {
            appendHexPair(bytes[l], stringbuffer);
        }
        return stringbuffer.toString();
    }

    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>>
        // 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同
        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
        stringbuffer.append(c0);
        stringbuffer.append(c1);
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

露营地管理小程序基于ThinkPHP+FastAdmin+UniApp开发

应用介绍 本文来自&#xff1a;露营地管理小程序基于ThinkPHPFastAdminUniApp开发 - 源码1688 基于ThinkPHPFastAdminUniApp开发的现代化的露营地管理小程序&#xff0c;是专为露营业务设计开发小程序应用。平台拥有多角色管理&#xff0c;同时具有营位预定、门票购买等功能模…

OrangePi AI Pro 测试体验

感谢CSDN活动提供的OrangePi AI Pro &#xff0c;之前一直用的树莓派&#xff0c;正好体验一下新的国产设备&#xff0c; 1、开机体验 整个设备包装不错&#xff0c;链接键盘、屏幕和鼠标&#xff0c;整体开机体验不错&#xff0c;内置OS不错&#xff0c;这个系统内嵌了中文输…

C语言,排序

前言 排序&#xff0c;可以说是数据结构中必不可缺的一环。我们创造数据存储它&#xff0c;要想知道数据之间的联系&#xff0c;比较是必不可少的。不然&#xff0c;费劲心思得来的数据若是不能有更多的意义&#xff0c;那么拿到了又有什么用&#xff1f; 排序是计算机内经常进…

老挝语翻译通App中国人出门在外都在用的老挝语翻译工具,支持老挝文OCR识别、文字转语音、老挝语背单词学习等等功能!

老挝语翻译通App&#xff0c;一款更加符合中国人用语习惯的翻译工具&#xff0c;在国内外都能正常使用的翻译器。当大家选择去东南亚国家旅游、GAP的时候&#xff0c;老挝这个国家是值得一去的&#xff0c;可以让大家感受到另一番风情。 但是&#xff0c;在去之前&#xff0c;需…

关于序列化与反序列化解题

1、[安洵杯 2019]easy_serialize_php <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["use…

Linux学习笔记:日志文件的编写

日志文件Log.hpp 日志文件的作用简单的日志文件编写 日志文件的作用 日志文件可以很好的帮我们显示出程序运行的信息,例如,进程pid,运行时间,运行状况等,通过日志记录程序的执行路径、变量值、函数调用等&#xff0c;可以帮助我们快速定位和修复代码中的错误。 简单的日志文件…

UMG绝对坐标与局部空间

在 Unreal Engine 的 UMG&#xff08;Unreal Motion Graphics&#xff09;中&#xff0c;“绝对坐标”和“局部空间”是两个常见的概念&#xff0c;主要用于描述 UI 元素的位置和大小。 概念与区别 绝对坐标&#xff08;Absolute Coordinates&#xff09;&#xff1a;这是指相…

LeetCode1137第N个泰波那契数

题目描述 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 解析 递归应该会超时&#xff0c;可以用循环&#xff0c;或者官方解法的矩阵的幂。 public int tr…

索尼CEO宣布全力推进AI电影制作,《蜘蛛侠》制片人坚称不用AI

原标题&#xff1a;索尼互娱制片人与CEO唱反调 易采游戏网6月3日消息&#xff1a;在最近的一次行业会议上&#xff0c;索尼影业高层首席执行官托尼文西奎拉向媒体透露&#xff0c;索尼正在全力推进人工智能(AI)技术的研发与应用&#xff0c;特别是在电影制作流程中。这一策略旨…

彩光大放异彩!《智慧园区以太全光网络建设技术规程》应用案例征集活动结果公布

近日,中国建筑业协会绿色建造与智能建筑分会正式公布了《智慧园区以太全光网络建设技术规程》应用案例征集活动的结果。本次活动旨在推广和应用该规程,进一步推动智慧园区的数字化、智慧化、绿色化建设。众多优秀项目在征集活动中脱颖而出,展示了规程在实际应用中的显著成效。评…

数据结构--关键路径

事件v1-表示整个工程开始&#xff08;源点&#xff1a;入度为0的顶点&#xff09; 事件v9-表示整个工程结束&#xff08;汇点&#xff1a;出度为0的顶点&#xff09; 关键路径&#xff1a;路径长度最长的路径 求解关键路径问题&#xff08;AOE网&#xff09; 定义四个描述量 …

数青蛙 ---- 模拟

题目链接 题目: 分析: 题目的意思是: 一次蛙鸣是一个完整的字符串"croak", 给你一个字符串, 让你求出最少的青蛙数目 示例一: 两次完整的"croak", 可以由一只青蛙完成, 所以答案为1 示例二: 第一次蛙鸣还没有结束, 又出现了"c", 说明有第二只青…

迪丽热巴与大姐的璀璨友情

迪丽热巴与“大姐”的璀璨友情&#xff1a;星光熠熠&#xff0c;友谊长存在娱乐圈的繁华舞台上&#xff0c;有两位耀眼的女星&#xff0c;她们如同夜空中亮的两颗星&#xff0c;交相辉映&#xff0c;共同谱写着一段段动人的佳话。她们&#xff0c;一个是被亲切称为“迪迪”的迪…

03_初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念&#xff1a;路由&#xff08;Route&#xff09;2.2 核心概念&#xff1a;断言&#xff08;Predicate&#xff09;2.3 核心概念&#…

【算法训练记录——Day24】

Day24——回溯算法Ⅰ 77.组合 今日内容&#xff1a; ● 理论基础 ● 77. 组合 理论&#xff1a;代码随想录 77.组合 思路&#xff1a;k层for循环&#xff0c;不会 回溯&#xff0c;将组合问题抽象成n叉树&#xff0c;for循环控制宽度&#xff0c;递归的深度控制二叉树的深度 …

云原生架构案例分析_3.某快递公司核心业务系统云原生改造

名称解释&#xff1a; 阿里云ACK&#xff1a;阿里云容器服务 Kubernetes 版 ACK&#xff08;Container Service for Kubernetes&#xff09;集成Kubernetes网络、阿里云VPC、阿里云SLB&#xff0c;提供稳定高性能的容器网络。本文介绍ACK集群网络及阿里云网络底层基础设施的重要…

抄袭瓜!斯坦福作者已删库跑路!面壁和刘知远老师的最新回应

好家伙&#xff0c;AI大模型圈爆料不断&#xff0c;没想到今天最猛的料还是抄袭的瓜啊。 5月29日&#xff0c;一个斯坦福团队高调宣称&#xff0c;只需要500美元&#xff0c;就可以通过他们的新产品&#xff1a;Llama3-v &#xff0c;就可以通过Llama3&#xff0c;训练出一个全…

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites&#xff0c;通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中&#xff0c;再利用css“background-image”&#xff0c; “background-repeat”,“background-position”的组…

C++命名空间(详解)

C基础语法 C基于C语言的改进&#xff1a;c在C语言的基础上引入并扩充了面向对象的概念 C基础概念&#xff1a;C是基于C语言而产生的,它即可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计 在1998年 出现C98…

文件同步软件,PanguFlow局域网横着走

说到文件同步&#xff0c;它对企业来说及其重要&#xff0c;因为有了文件同步&#xff0c;这个文件数据它才能备份起来&#xff0c;才能用来抵抗自然灾害&#xff0c;比如服务器硬盘损坏了&#xff0c;你要是不备份&#xff0c;这损失可就大了&#xff0c;一款合适的文件同步软…