最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于SpringBoot和Vue實(shí)現(xiàn)頭像上傳與回顯功能

 更新時(shí)間:2024年08月30日 09:19:12   作者:洛可可白  
在現(xiàn)代Web應(yīng)用中,用戶個(gè)性化體驗(yàn)尤為重要,其中頭像上傳與回顯是一個(gè)常見的功能需求,本文將詳細(xì)介紹如何使用Spring Boot和Vue.js構(gòu)建一個(gè)前后端協(xié)同工作的頭像上傳系統(tǒng),并實(shí)現(xiàn)圖片的即時(shí)回顯,需要的朋友可以參考下

技術(shù)棧介紹

  • Spring Boot:一個(gè)基于Spring框架的開源項(xiàng)目,用于簡(jiǎn)化Spring應(yīng)用的初始搭建以及開發(fā)過(guò)程。它通過(guò)提供默認(rèn)配置減少開發(fā)中的配置工作,使得開發(fā)者能夠快速啟動(dòng)和部署Spring應(yīng)用。

  • Vue.js:一個(gè)漸進(jìn)式JavaScript框架,用于構(gòu)建用戶界面。Vue的核心庫(kù)只關(guān)注視圖層,易于上手,同時(shí)也能夠配合其他庫(kù)或現(xiàn)有項(xiàng)目使用。Vue.js以其輕量級(jí)、高效性和靈活性而廣受歡迎。

后端實(shí)現(xiàn)

后端使用Spring Boot框架,通過(guò)@RestController注解定義一個(gè)控制器UploadController,提供/upload端點(diǎn)處理文件上傳請(qǐng)求。代碼中使用了MultipartFile來(lái)接收上傳的文件,并將其保存到服務(wù)器的指定目錄。

添加依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

代碼注釋

@RestController
public class UploadController {
    @Operation(summary = "上傳圖片到本地")
    @PostMapping("/upload")
    public String upload(MultipartFile file) {
        if (file.isEmpty()) {
            return "圖片為空";
        }
        String originalFilename = file.getOriginalFilename();
        String fileNamePrefix = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
        assert originalFilename != null;
        String fileNameSuffix = "." + originalFilename.split("\\.")[1];
        String fileName = fileNamePrefix + fileNameSuffix;
        ApplicationHome applicationHome = new ApplicationHome(this.getClass());
        //String pre = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\images\\";
        String pre = applicationHome.getDir().getParentFile().getParentFile().getParentFile().getAbsolutePath() + "\\spring-ui\\src\\assets\\avatar\\";
        String path = pre + fileName;
        try {
            file.transferTo(new File(path));
            String replace = path.replace(applicationHome.getDir().getParentFile().getParentFile().getParentFile().getAbsolutePath() + "\\spring-ui\\src", "/src");
            return replace.replace("\\", "/");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "圖片上傳失敗";
    }
}

前端實(shí)現(xiàn)

前端使用Vue.js框架,通過(guò)封裝axios請(qǐng)求和全局配置,實(shí)現(xiàn)與后端的通信。同時(shí),使用Vite作為構(gòu)建工具,配置代理解決跨域問(wèn)題。

代碼注釋

全局配置封裝

// config/index.ts
export const baseURL = '/api'; // 基礎(chǔ)URL
export const timeout = 10000; // 請(qǐng)求超時(shí)時(shí)間
export const headers = { 'X-Custom-Header': 'foobar' }; // 自定義請(qǐng)求頭

Axios二次封裝

// request/index.ts
const request = axios.create({
    // 配置axios實(shí)例
    baseURL,
    timeout,
    headers
});
// 添加請(qǐng)求和響應(yīng)攔截器
request.interceptors.request.use((config) => {
    // 請(qǐng)求攔截器邏輯
    return config;
}, (error) => {
    // 響應(yīng)攔截器邏輯
    return Promise.reject(error);
});

Api接口請(qǐng)求

//api/index.ts
import * as common from '@/api/common'
import * as user from '@/api/user'

const api = {
    common,
    user,
}

export default api;
//api/common.ts
import request from "@/request";

// 響應(yīng)接口
export interface UploadRes {}

/**
 * 上傳圖片到本地
 * @param {string} file
 * @returns
 */
export function upload(file: object): Promise<UploadRes> {
    return request.post(`/upload`, file);
}
//api/user.ts
import request from "@/request";

// 參數(shù)接口
export interface UpdateUserParams {
    id?: number;
    name?: string;
    sex?: string;
    age?: number;
    pic?: string;
    acc?: string;
    pwd?: string;
    phone?: string;
    email?: string;
    dept?: string;
    post?: string;
    status?: string;
    createBy?: string;
    createTime?: string | unknown;
    updateBy?: string;
    updateTime?: string | unknown;
    remark?: string;
}

// 響應(yīng)接口
export interface UpdateUserRes {
    message: string;
    success: boolean;
    code: number;
    data: Record<string, unknown>;
}

/**
 * 修改-賬號(hào)
 * @param {object} params $!{table.comment}
 * @param {number} params.id
 * @param {string} params.name 姓名
 * @param {string} params.sex 性別
 * @param {number} params.age 年齡
 * @param {string} params.pic 頭像
 * @param {string} params.acc 賬號(hào)
 * @param {string} params.pwd 密碼
 * @param {string} params.phone 電話號(hào)碼
 * @param {string} params.email 電子郵件
 * @param {string} params.dept 用戶部門
 * @param {string} params.post 用戶崗位
 * @param {string} params.status 狀態(tài)(0正常 1停用)
 * @param {string} params.createBy 創(chuàng)建者
 * @param {object} params.createTime 創(chuàng)建時(shí)間
 * @param {string} params.updateBy 更新者
 * @param {object} params.updateTime 更新時(shí)間
 * @param {string} params.remark 備注
 * @returns
 */
export function updateUser(params: UpdateUserParams): Promise<UpdateUserRes> {
    return request.post(`/userEntity/update`, params);
}

解決CORS跨域問(wèn)題

// vite.config.ts
export default defineConfig({
    server: {
        proxy: {
            "/api": {
                target: "http://localhost:9090/", // 后端服務(wù)地址
                changeOrigin: true, // 是否改變?cè)?
                rewrite: (path) => path.replace(/\/api/, ""), // 重寫路徑
            },
        },
    },
});

業(yè)務(wù)處理代碼

<template>
    <!-- 上傳組件和提示信息 -->
    <el-upload drag :show-file-list="false" :limit="1" action="#" :auto-upload="false" accept=".png"
               :on-change="handleChanges">
      <el-icon class="el-icon--upload">
        <upload-filled/>
      </el-icon>
      <div class="el-upload__text">
        <em> 點(diǎn)擊 </em> 或<em> 拖動(dòng)文件 </em>上傳
      </div>
      <template #tip>
        <div class="el-upload__tip">
          僅支持 jpg/png 格式文件大小小于 2MB
        </div>
      </template>
    </el-upload>
</template>

<script setup>
import { ref } from "vue";
import api from "@/api";

// 響應(yīng)式引用,用于存儲(chǔ)用戶信息
const user = ref({});

// 生命周期鉤子,初始化時(shí)獲取用戶信息
onMounted(() => {
    user.value = JSON.parse(localStorage.getItem("user"));
});

// 處理文件變化,上傳文件并更新用戶信息

//修改頭像
const handleChanges = (file) => {
  if (file.raw.type !== 'image/png') {//限制文件類型
    ElMessage.error({message: "只能上傳png格式的文件", grouping: true, showClose: true});
    return false;
  }
  if (file.raw.size / 1024 / 1024 > 5) {
    ElMessage.error('文件大于 5MB!')
    return false;
  }
  const param = new FormData();
  param.append('file', file.raw);
  api.common.upload(param).then((res: any) => {
    if (res !== null) ElMessage.success("上傳成功");
    if (res === null) ElMessage.error("上傳失敗");
    api.user.updateUser({id: user.value.id, pic: res}).then((res: any) => {
      api.user.selectUserByAcc(user.value.acc).then((res: any) => {
        //更新緩存
        localStorage.setItem("user", JSON.stringify(res.data));
        //更新左側(cè)描述列表
        user.value = res.data;
      })
    })
  })
};
</script>

<style scoped>
:deep(.el-descriptions__label) {
  min-width: 60px !important;
}
</style>

功能演示

在文章的最后,我們將展示上傳頭像功能的完整流程,包括前端的上傳界面、后端的文件保存邏輯,以及成功上傳后的頭像回顯效果。

結(jié)語(yǔ)

通過(guò)本文的介紹,我們學(xué)習(xí)了如何使用Spring Boot和Vue.js實(shí)現(xiàn)一個(gè)完整的頭像上傳與回顯功能。這種前后端分離的開發(fā)模式不僅提高了開發(fā)效率,也使得系統(tǒng)更加模塊化和易于維護(hù)。隨著技術(shù)的不斷進(jìn)步,我們期待未來(lái)能夠有更多類似的協(xié)同工作解決方案出現(xiàn),以滿足不同場(chǎng)景下的開發(fā)需求。

以上就是基于SpringBoot和Vue實(shí)現(xiàn)頭像上傳與回顯功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Vue頭像上傳與回顯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JVM中如何做到STW使程序暫停

    JVM中如何做到STW使程序暫停

    STW,即Stop The World,這篇文章來(lái)為大家詳細(xì)介紹了JVM中是如何做到STW使程序暫停的原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例

    java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Java中抽象類和接口介紹

    Java中抽象類和接口介紹

    大家好,本篇文章主要講的是Java中抽象類和接口介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 修改SpringBoot啟動(dòng)圖標(biāo)banner的兩種方式

    修改SpringBoot啟動(dòng)圖標(biāo)banner的兩種方式

    Banner即橫幅標(biāo)語(yǔ),我們?cè)趩?dòng)SpringBoot項(xiàng)目時(shí)會(huì)將Banner信息打印至控制臺(tái),我們可以輸出一些圖形、SpringBoot版本信息等內(nèi)容,有很多小伙伴想知道如何修改SpringBoot啟動(dòng)圖標(biāo)banner,接下來(lái)由小編給大家介紹一下吧
    2024-08-08
  • springboot如何配置多kafka

    springboot如何配置多kafka

    這篇文章主要介紹了springboot如何配置多kafka問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java 服務(wù)端消息推送的實(shí)現(xiàn)小結(jié)

    Java 服務(wù)端消息推送的實(shí)現(xiàn)小結(jié)

    本文主要介紹了Java 服務(wù)端消息推送的實(shí)現(xiàn)小結(jié),主要包括四種常見的消息實(shí)時(shí)推送方案:短輪詢、長(zhǎng)輪詢、SSE?和?WebSocket,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • springboot啟動(dòng)時(shí)運(yùn)行代碼詳解

    springboot啟動(dòng)時(shí)運(yùn)行代碼詳解

    在本篇內(nèi)容中我們給大家整理了關(guān)于在springboot啟動(dòng)時(shí)運(yùn)行代碼的詳細(xì)圖文步驟以及需要注意的地方講解,有興趣的朋友們學(xué)習(xí)下。
    2019-06-06
  • SpringBoot實(shí)現(xiàn)接口數(shù)據(jù)加解密的三種解決方案

    SpringBoot實(shí)現(xiàn)接口數(shù)據(jù)加解密的三種解決方案

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)接口數(shù)據(jù)加解密的三種解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • SpringBoot集成Redis實(shí)現(xiàn)消息隊(duì)列的方法

    SpringBoot集成Redis實(shí)現(xiàn)消息隊(duì)列的方法

    這篇文章主要介紹了SpringBoot集成Redis實(shí)現(xiàn)消息隊(duì)列的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • IDEA不能生成SerialVersionUID,alt+enter不提示沒(méi)有效果問(wèn)題

    IDEA不能生成SerialVersionUID,alt+enter不提示沒(méi)有效果問(wèn)題

    文章介紹了在使用IntelliJ IDEA時(shí),通過(guò)安裝AutoFillingJavaCallArguments插件并導(dǎo)入Serializable接口后,遇到無(wú)法自動(dòng)生成序列ID的問(wèn)題,解決方法是在設(shè)置中搜索serial,勾選“不帶'serialVersionUID'的可序列化類”選項(xiàng)
    2025-01-01

最新評(píng)論

江北区| 平谷区| 丹凤县| 沭阳县| 延津县| 连城县| 贡嘎县| 江西省| 南投市| 甘孜| 精河县| 拉孜县| 惠安县| 上饶市| 咸阳市| 荥阳市| 鹤庆县| 福海县| 桂阳县| 资中县| 隆尧县| 北宁市| 肥西县| 新安县| 吕梁市| 桦南县| 二连浩特市| 柳河县| 贺州市| 广饶县| 宝山区| 绥芬河市| 彭泽县| 富顺县| 汝城县| 莲花县| 原平市| 齐齐哈尔市| 云浮市| 东阿县| 蓬安县|