菜鸟之路Day38一一Web开发综合案例(三)

简介: 本文介绍了Web开发中的文件上传与员工信息修改的综合案例,涵盖前端到后端的完整流程。重点讲解了阿里云OSS的集成,包括Bucket创建、密钥获取及SDK使用,并通过Spring Boot实现文件上传功能。同时,详细描述了员工信息查询与修改的操作逻辑,涉及Controller、Service和Mapper层代码实现。最后探讨了配置文件的优化,对比@Value与@ConfigurationProperties注解,展示了如何通过实体类批量注入配置参数,提升代码可维护性与灵活性。

菜鸟之路Day38一一Web开发综合案例(三)

时间:2025.6.1

作者:blue

文章内容学习自黑马程序员BV1m84y1w7Tb

1.文件上传

1.1内容介绍

文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。

文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。

文件上传前端三要素

image-20250601101726681.png

前端与后端数据交互

image-20250601101414456.png

1.2阿里云OSS

阿里云对象存储0ss(0bject storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

image-20250601103711617.png

准备流程

image-20250601104100439.png

Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间

SDK:软件开发工具包,包括辅助软件开发的依赖(jar包),代码示例等,都可以叫做SDK

开通对象存储服务OSS

image-20250601110451986.png

创建bucket

image-20250601110804808.png

获取AccessKey(密钥)

image-20250601110842411.png

参照官方SDK编写入门程序

image-20250601111002040.png

pom文件中引入相关依赖

<!--阿里云OSS-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

<!--Java9以上-->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

1.3阿里云OSS集成

image-20250601153336956.png

UploadController

@RestController
public class UploadController {
   
    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
   
        //调用阿里云OSS工具类,将上传上来的文件存入阿里云
        String url = aliOSSUtils.upload(image);
        //将图片上传后的url返回,用于浏览器回显展示
        return Result.success(url);
    }
}

如果在此图片没有显示,可能是访问权限的问题,将阻止公共访问关闭,然后将读写权限修改为公共读

image-20250601163744418.png

2.修改员工

很明显修改员工着部分操作是分两步进行的,首先要将员工的信息查询出来,回显到页面上,然后再对员工的信息进行修改

2.1查询回显

Controller

@GetMapping("/emps/{id}")
public Result getById(@PathVariable("id") Integer id) {
   
    log.info("根据id查询员工信息");
    Emp emp = empService.getById(id);
    return Result.success(emp);
}

EmpService

@Override
public Emp getById(Integer id) {
   
    Emp emp = empMapper.getById(id);
    return emp;
}

Mapper

@Select("select * from emp where id = #{id}")
Emp getById(Integer id);

2.2修改员工

Controller

@PutMapping("/emps")
public Result update(@RequestBody Emp emp) {
   
    log.info("修改员工信息");
    empService.update(emp);
    return Result.success();
}

EmpService

@Override
public void update(Emp emp) {
   
    empMapper.update(emp);
}

Mapper

    <!--更新员工-->
    <update id="update">
        update emp
        <set>
            <if test="username != null and username != ''" >
                username=#{
   username},
            </if>
            <if test="password != null and password != ''">
                password=#{
   password},
            </if>
            <if test="name != null and username != ''">
                name=#{
   name},
            </if>
            <if test="gender != null">
                gender=#{
   gender},
            </if>
            <if test="image != null">
                image=#{
   image},
            </if>
            <if test="job != null">
                job = #{
   job},
            </if>
            <if test="entryDate != null">
                entry_date=#{
   entryDate},
            </if>
            <if test="updateTime != null">
                update_time=#{
   updateTime},
            </if>
            <if test="deptId != null">
                dept_id=#{
   deptId}
            </if>
        </set>
        where id=#{
   id}
    </update>

3.配置文件

3.1参数配置化

我们可以将springboot项目中原本硬编码的参数的值,抽取到配置文件中,然后再通过@Value注解进行映射,这样就解决了参数硬编码的问题

@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;

3.2yml配置文件

image-20250603205157825.png

基本语法

大小写敏感

数值前边必须有空格,作为分隔符

使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

表示注释,从这个字符一直到行尾,都会被解析器忽略

yml数据格式

对象/Map集合:

user:
 name: zhangsan
 age: 18
 password: 123456

数组/List/Set集合:

hobby:
 - java
 - game
 - sport

3.3@ConfigurationProperties与@Value

这两个注解的相同点是:都是用来注入外部配置的属性的

这两个注解的不同点是:

​ @Value注解只能一个一个的进行外部属性的注入

​ @ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中

原本我们的代码,用@Value进行外部属性注入十分的繁琐,我们可以将这些变量抽象到一个类中,然后在类中使用@ConfigurationProperties注解批量注入,再将类交由IOC容器管理,然后再在原来的工具类中,注入我们自定义类的bean对象,达到解耦的效果。

    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

抽象到实体类

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
   
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

工具类中依赖注入

@Autowired
    AliOSSProperties Aliossproperties;

获取bean对象中的值

public String upload(MultipartFile file) throws IOException {
   
        //获取bean中的变量
        String endpoint = Aliossproperties.getEndpoint();
        String bucketName = Aliossproperties.getBucketName();
        String accessKeyId = Aliossproperties.getAccessKeyId();
        String accessKeySecret = Aliossproperties.getAccessKeySecret();

       ......
}
目录
相关文章
|
2月前
|
Java 数据库 网络架构
菜鸟之路Day36一一Web开发综合案例(部门管理)
本文详细记录了基于Spring Boot的Web开发综合案例——部门管理功能的实现过程。从环境搭建到功能开发,涵盖数据库表设计、Spring Boot项目创建、依赖引入、配置文件设置以及Mapper、Service、Controller的基础结构构建。文章重点讲解了查询、删除、新增和修改部门信息的业务逻辑实现,遵循RESTful规范设计接口,并通过统一响应结果类`Result`优化前后端交互体验。借助Spring的IoC容器管理与MyBatis的SQL映射,实现了高效的数据操作与业务处理,最终完成部门管理的全功能开发。
96 12
|
1月前
|
XML SQL 前端开发
菜鸟之路Day37一一Web开发综合案例(员工管理)
本文介绍了基于Web开发的员工管理综合案例,涵盖分页查询、条件分页查询、删除员工和新增员工四大功能模块。通过前后端交互,前端传递参数(如页码、每页记录数、查询条件等),后端使用MyBatis与PageHelper插件处理数据查询与操作。代码结构清晰,包括Controller层接收请求、Service层业务逻辑处理以及Mapper层数据访问,并结合XML动态SQL实现灵活的条件查询。此外,新增与删除功能分别通过POST与DELETE请求完成,确保系统功能完整且高效。
88 7
|
2月前
|
Web App开发 前端开发 JavaScript
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
|
11月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
463 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
10月前
|
前端开发 机器人 测试技术
【RF案例】Web自动化测试弹窗处理
在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
195 6
【RF案例】Web自动化测试弹窗处理
|
10月前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
170 6
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
10月前
|
前端开发
【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
248 11
|
10月前
|
前端开发
前端web入门第四天】03 显示模式+综合案例热词与banner效果
本文档介绍了HTML中标签的三种显示模式:块级元素、行内元素与行内块元素,并详细解释了各自的特性和应用场景。块级元素独占一行,宽度默认为父级100%,可设置宽高;行内元素在同一行显示,尺寸由内容决定,设置宽高无效;行内块元素在同一行显示,尺寸由内容决定,可设置宽高。此外,还提供了两个综合案例,包括热词展示和banner效果实现,帮助读者更好地理解和应用这些显示模式。
103 6
|
10月前
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
190 7
|
11月前
|
SQL 缓存 自然语言处理
实战案例1:基于C语言的Web服务器实现。
实战案例1:基于C语言的Web服务器实现。