当前位置: 首页 > news >正文

怎么用dw做动态网站/seo裤子的关键词首页排名有哪些

怎么用dw做动态网站,seo裤子的关键词首页排名有哪些,苏州seo网站推广公司,在线网站软件免费下载文章目录一、背景二、vue-image-crop-upload组件三、编写前端上传头像功能四、编写后台上传用户头像接口4.1 实现前端组件上传过来的头像文件保存到服务器上4.2 将保存在服务器上的用户头像路径存放到用户信息表中4.3 编写用户更新头像信息API五、前后端联调六、源码一、背景 …

文章目录

  • 一、背景
  • 二、vue-image-crop-upload组件
  • 三、编写前端上传头像功能
  • 四、编写后台上传用户头像接口
    • 4.1 实现前端组件上传过来的头像文件保存到服务器上
    • 4.2 将保存在服务器上的用户头像路径存放到用户信息表中
    • 4.3 编写用户更新头像信息API
  • 五、前后端联调
  • 六、源码

一、背景

  • 后台系统一般会有用户个人信息的模块(见下图),为了增强用户的体验度,系统会开放自定义头像的功能,让用户可以上传自定义图片替代默认的系统头像。本文将通过Vue+SpringBoot来具体实现。
    在这里插入图片描述

二、vue-image-crop-upload组件

  • 首先我们会用到vue-image-crop-upload组件
    在这里插入图片描述
  • 一些重要的参数与事件
    在这里插入图片描述
    在这里插入图片描述

三、编写前端上传头像功能

  • 了解了vue-image-crop-upload组件的功能后,编写自定义头像前台上传功能就相当容易了,我们只需要把这个组件嵌入到个人信息页面中,并编写相应事件即可。
<template><div class="app-container">...<div slot="header" class="clearfix"><span>个人信息</span></div><div><div style="text-align: center"><div class="el-upload"><myUploadv-model="showDialog":headers="headers":url="baseApi+'/api/user/updateAvatar'"@crop-upload-success="cropUploadSuccess"/><img:src="user.avatarUrl? baseApi + '/file/' + user.avatarUrl: Avatar"title="点击上传头像"class="avatar"@click="toggleShow">...</div></div></div>..</div>
</template><script>
// 使用头像上传组件
import myUpload from 'vue-image-crop-upload'
import { mapGetters } from 'vuex'
import { getToken } from '@/utils/auth'
import store from '@/store'
import Avatar from '@/assets/images/avatar.png'
export default {name: 'Center',components: { myUpload },data() {return {showDialog: false,Avatar: Avatar,headers: {'Authorization': getToken()},...}},computed: {...mapGetters(['user','baseApi'])},methods: {// 点击头像打开上传窗口toggleShow() {this.showDialog = !this.showDialog},// 上传成功后重新载入信息cropUploadSuccess(jsonData, field) {store.dispatch('getInfo').then(() => { })},...}
}
</script>
...
  • 页面效果如下:
    在这里插入图片描述

四、编写后台上传用户头像接口

  • 有了前端页面,就需要后台实现对应的接口,想一想,该接口需要有哪些功能呢?
  1. 需要将前端组件上传过来的头像文件保存到服务器上;
  2. 需要将保存在服务器上的用户头像路径存放到用户信息表中。

4.1 实现前端组件上传过来的头像文件保存到服务器上

  • 我们需要建立一个上传文件信息表,及建立上传文件的操作服务类来实现文件的保存。
    在这里插入图片描述
  1. 上传文件信息表
/*** 文件信息表** @author zhuhuix* @date 2020-04-20*/
@ApiModel(value = "用户信息")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@TableName("upload_file")
public class UploadFile implements Serializable {@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 文件实际名称*/private String realName;/*** 文件名*/private String fileName;/*** 文件主名称*/private String primaryName;/*** 文件扩展名*/private String extension;/*** 存放路径*/private String path;/*** 文件类型*/private String type;/*** 文件大小*/private Long size;/*** 上传人*/private String uploader;private Timestamp createTime;@Overridepublic String toString() {return "UploadFile{" +"fileName='" + fileName + '\'' +", uploader='" + uploader + '\'' +", createTime=" + createTime +'}';}
}
  1. 上传文件DAO
/*** 文件上传DAO接口** @author zhuhuix* @date 2021-07-19*/
@Mapper
public interface UploadFileMapper extends BaseMapper<UploadFile> {}
  1. 上传文件工具具体实现类
/*** 文件上传接口定义** @author zhuhuix* @date 2020-04-20*/
public interface UploadFileTool {/*** 文件上传** @param uploader  上传人* @param realName  文件实际名称* @param multipartFile 文件* @return 上传信息*/UploadFile upload(String uploader, String realName, MultipartFile multipartFile);
}
/*** 文件上传实现类** @author zhuhuix* @date 2020-04-20*/
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UploadFileToolImpl implements UploadFileTool {private final UploadFileMapper uploadFileMapper;@Value("${uploadFile.path}")private String path;@Value("${uploadFile.maxSize}")private long maxSize;@Override@Transactional(rollbackFor = Exception.class)public UploadFile upload(String uploader, String realName, MultipartFile multipartFile) {//检查文件大小if (multipartFile.getSize() > maxSize * Constant.MB) {throw new RuntimeException("超出文件上传大小限制" + maxSize + "MB");}//获取上传文件的主文件名与扩展名String primaryName = FileUtil.mainName(multipartFile.getOriginalFilename());String extension = FileUtil.extName(multipartFile.getOriginalFilename());//根据文件扩展名得到文件类型String type = getFileType(extension);//给上传的文件加上时间戳LocalDateTime date = LocalDateTime.now();DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddhhmmssS");String nowStr = "-" + date.format(format);String fileName = primaryName + nowStr + "." + extension;try {String filePath = path + type + File.separator + fileName;File dest = new File(filePath).getCanonicalFile();if (!dest.getParentFile().exists()) {if (ObjectUtil.isNull(dest.getParentFile().mkdirs())) {throw new RuntimeException("上传文件失败:建立目录错误");}}multipartFile.transferTo(dest);if (ObjectUtil.isNull(dest)) {throw new RuntimeException("上传文件失败");}UploadFile uploadFile = new UploadFile(null, realName, fileName, primaryName,extension, dest.getPath(), type, multipartFile.getSize(),uploader, Timestamp.valueOf(LocalDateTime.now()));if (uploadFileMapper.insert(uploadFile) > 0) {return uploadFile;}throw new RuntimeException("上传文件失败");} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}}/*** 根据文件扩展名给文件类型** @param extension 文件扩展名* @return 文件类型*/private static String getFileType(String extension) {String document = "txt doc pdf ppt pps xlsx xls docx csv";String music = "mp3 wav wma mpa ram ra aac aif m4a";String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg";String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg";if (image.contains(extension)) {return "image";} else if (document.contains(extension)) {return "document";} else if (music.contains(extension)) {return "music";} else if (video.contains(extension)) {return "video";} else {return "other";}}
}

4.2 将保存在服务器上的用户头像路径存放到用户信息表中

  1. 在用户信息服务中增加保存头像信息的功能
/*** 用户信息** @author zhuhuix* @date 2020-04-03*/
public interface SysUserService {..../*** 修改用户头像* @param file 文件* @return json*/Map<String,String>  updateAvatar(MultipartFile file);}
/*** 用户信息实现** @author zhuhuix* @date 2020-04-03*/
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class SysUserServiceImpl implements SysUserService {private final SysUserMapper sysUserMapper;private final UploadFileTool uploadFileTool;@Override@Transactional(rollbackFor = Exception.class)public Map<String, String> updateAvatar(MultipartFile file) {SysUser sysUser = findByUserName(getCurrentLoginUserName());// 调用上传文件服务保存头像UploadFile uploadFile = uploadFileTool.upload(sysUser.getUserName(), file.getOriginalFilename(), file);// 将头像路径保存到个人信息中sysUser.setAvatarUrl(uploadFile.getType() + File.separator  + uploadFile.getFileName());update(sysUser);return new HashMap<String, String>(1) {{put("avatar", uploadFile.getFileName());}};}@Override@Transactional(rollbackFor = Exception.class)public SysUser update(SysUser user) {if (sysUserMapper.updateById(user) > 0) {return user;}throw new RuntimeException("更新用户信息失败");}@Overridepublic SysUser findByUserName(String userName) {return sysUserMapper.selectOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getUserName, userName));}private String getCurrentLoginUserName() {final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication == null) {throw new RuntimeException("登录状态已过期");}if (authentication.getPrincipal() instanceof UserDetails) {UserDetails userDetails = (UserDetails) authentication.getPrincipal();return (userDetails.getUsername());}throw new RuntimeException("找不到当前登录的信息");}}

4.3 编写用户更新头像信息API

  • 最后只需要在Controller层增加用户更新头像信息API接口供前端调用即可
@ApiOperation("修改用户头像")@PostMapping(value = "/updateAvatar")public ResponseEntity<Object> updateAvatar(@RequestParam MultipartFile avatar) {return  ResponseEntity.ok(sysUserService.updateAvatar(avatar));}

在这里插入图片描述

五、前后端联调

在这里插入图片描述

六、源码

  • 前端
    https://gitee.com/zhuhuix/startup-frontend
    https://github.com/zhuhuix/startup-frontend
  • 后端
    https://gitee.com/zhuhuix/startup-backend
    https://github.com/zhuhuix/startup-backend
http://www.lbrq.cn/news/1276039.html

相关文章:

  • 哪里做网站最好网站/最权威的品牌排行榜网站
  • 表格 wordpress/杭州seo优化公司
  • 同城购物网站怎么做/网页开发需要学什么
  • 男生做男生网站在那看/成品影视app开发
  • 首页优化的公司/鹤壁网站seo
  • 百度推广新手入门/宁波seo的公司联系方式
  • 网站建设纠纷/免费b站软件推广网站2023
  • 杭州模板建站定制网站/网络兼职平台
  • 房产网站建设价格/中国市场营销网
  • 网页设计如何设置背景/关键词优化的价格查询
  • WordPress文字添加/杭州seo推广优化公司
  • Tab标签切换wordpress/更先进的seo服务
  • 管局审核一定要能打开网站/宁德seo公司
  • 杭州品牌网站制作/关键词挖掘查询工具爱站网
  • 个人网站备案信息/超级外链推广
  • 建设部网站施工合同范本去哪找/广告语
  • 厦门谁需要网站建设/3322免费域名注册
  • 网站后台建设教程/网络推广公司北京
  • 昆山教育平台网站建设/站长工具官网域名查询
  • 可以盗链图片的网站/工程建设数字化管理平台
  • 西安教育平台网站建设/网站建设工作总结
  • 品牌网站建设小蝌蚪1a/谷歌google浏览器官方下载
  • 12数据网站建设/重庆放心seo整站优化
  • 创建网站论坛/许昌网站seo
  • 邹平做网站哪家好/交换链接营销成功案例
  • 最新新闻热点事件佩洛西/重庆关键词优化服务
  • 名聚优品一家只做正品的网站/seo运营经理
  • 微信开发者工具教程实例/武汉seo关键词排名
  • 如何做直销产品的网站/百度网盘资源共享
  • 淘宝客做网站怎样推广/舆情服务网站
  • 33.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--财务服务--记账
  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(5)
  • 洛谷刷题7.30
  • 【IDEA】JavaWeb自定义servlet模板
  • Linux - 权限的理解(深入浅出,详细细微)
  • Ubuntu卡在启动画面:显卡驱动与密码重置