当前位置: 代码网 > it编程>编程语言>Java > 基于SpringBoot和Vue实现头像上传与回显功能

基于SpringBoot和Vue实现头像上传与回显功能

2024年08月30日 Java 我要评论
技术栈介绍spring boot:一个基于spring框架的开源项目,用于简化spring应用的初始搭建以及开发过程。它通过提供默认配置减少开发中的配置工作,使得开发者能够快速启动和部署spring应

技术栈介绍

  • spring boot:一个基于spring框架的开源项目,用于简化spring应用的初始搭建以及开发过程。它通过提供默认配置减少开发中的配置工作,使得开发者能够快速启动和部署spring应用。

  • vue.js:一个渐进式javascript框架,用于构建用户界面。vue的核心库只关注视图层,易于上手,同时也能够配合其他库或现有项目使用。vue.js以其轻量级、高效性和灵活性而广受欢迎。

后端实现

后端使用spring boot框架,通过@restcontroller注解定义一个控制器uploadcontroller,提供/upload端点处理文件上传请求。代码中使用了multipartfile来接收上传的文件,并将其保存到服务器的指定目录。

添加依赖

        <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 "图片上传失败";
    }
}

前端实现

前端使用vue.js框架,通过封装axios请求和全局配置,实现与后端的通信。同时,使用vite作为构建工具,配置代理解决跨域问题。

代码注释

全局配置封装

// config/index.ts
export const baseurl = '/api'; // 基础url
export const timeout = 10000; // 请求超时时间
export const headers = { 'x-custom-header': 'foobar' }; // 自定义请求头

axios二次封装

// request/index.ts
const request = axios.create({
    // 配置axios实例
    baseurl,
    timeout,
    headers
});
// 添加请求和响应拦截器
request.interceptors.request.use((config) => {
    // 请求拦截器逻辑
    return config;
}, (error) => {
    // 响应拦截器逻辑
    return promise.reject(error);
});

api接口请求

//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";

// 响应接口
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";

// 参数接口
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;
}

// 响应接口
export interface updateuserres {
    message: string;
    success: boolean;
    code: number;
    data: record<string, unknown>;
}

/**
 * 修改-账号
 * @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 账号
 * @param {string} params.pwd 密码
 * @param {string} params.phone 电话号码
 * @param {string} params.email 电子邮件
 * @param {string} params.dept 用户部门
 * @param {string} params.post 用户岗位
 * @param {string} params.status 状态(0正常 1停用)
 * @param {string} params.createby 创建者
 * @param {object} params.createtime 创建时间
 * @param {string} params.updateby 更新者
 * @param {object} params.updatetime 更新时间
 * @param {string} params.remark 备注
 * @returns
 */
export function updateuser(params: updateuserparams): promise<updateuserres> {
    return request.post(`/userentity/update`, params);
}

解决cors跨域问题

// vite.config.ts
export default defineconfig({
    server: {
        proxy: {
            "/api": {
                target: "http://localhost:9090/", // 后端服务地址
                changeorigin: true, // 是否改变源
                rewrite: (path) => path.replace(/\/api/, ""), // 重写路径
            },
        },
    },
});

业务处理代码

<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> 点击 </em> 或<em> 拖动文件 </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";

// 响应式引用,用于存储用户信息
const user = ref({});

// 生命周期钩子,初始化时获取用户信息
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));
        //更新左侧描述列表
        user.value = res.data;
      })
    })
  })
};
</script>

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

功能演示

在文章的最后,我们将展示上传头像功能的完整流程,包括前端的上传界面、后端的文件保存逻辑,以及成功上传后的头像回显效果。

结语

通过本文的介绍,我们学习了如何使用spring boot和vue.js实现一个完整的头像上传与回显功能。这种前后端分离的开发模式不仅提高了开发效率,也使得系统更加模块化和易于维护。随着技术的不断进步,我们期待未来能够有更多类似的协同工作解决方案出现,以满足不同场景下的开发需求。

以上就是基于springboot和vue实现头像上传与回显功能的详细内容,更多关于springboot vue头像上传与回显的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com