day03-主页模块-修改密码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.获取用户资料在Vuex中共享
    • 登录成功跳转到主页之后,可以获取用户资料,获取的资料在Vuex中共享,这样用户就可以很方便的获取该信息
        • 获取流程
        • 在什么位置获取
        • 在导航守卫的位置,可以确定已经有了token,获取资料更佳,在页面发生跳转时触发,此时不论你从何时何地进来,如果发现没获取资料,都可以清楚直观的获取资料。判断条件也使得不会发生重复的加载。
        • 获取用户资料的api(src/api/user.js)
        • Vuex中声明用户信息状态,修改用户信息的mutations,和获取用户信息的action src/store/modules/user.js
        • 通过getters声明userId(快捷访问)-代码位置src/store/getters.js
        • 在权限拦截处调用action-代码位置(src/pemission.js)
  • 2、显式用户头像和用户名
        • 顶部组件的内部位置
        • Vuex中已经有用户资料数据,可以通过getters开发属性,直接在组件中引用即可
        • 位置src/store/getters.js 暴露属性
        • 在Navbar组件引入getters-代码位置(src/layout/components/NavBar.vue)
        • NavBar组件显示用户名和头像-代码位置(src/layout/components/NavBar.vue)
        • 🍕🍕🍕设置头像和用户名的样式-代码位置(src/layout/components/NavBar.vue)
  • 3、处理头像为空的场景
        • 🚜🚜🚜当用户没有头像时要显示用户名的第一个字
        • 🍳🍳🍳条件判断-代码位置(src/layout/components/NavBar.vue)
        • 🧀🧀🧀 ?可选链操作符,是当?前面的变量为空时,不会继续往下执行,防止报错,如果版本不支持?的编译,需升级版本
  • 4.处理token失效的问题
        • token是有时效性的,当token超时,我们需要做一下处理
        • 🌮请求拦截器处理-代码位置(src/utils/request.js)
        • 实现Vuex的登出action-代码位置(src/store/modules/user.js)
  • 5.调整下拉菜单,实现退出登录
        • 退出登录流程
        • Navbar中点击退出登录-代码位置(src/layout/components/NavBar.vue)
        • 退出方法-代码位置(src/layout/components/NavBar.vue)
        • 注意:native修饰符表示给组件的根元素注册事件
  • 6.修改密码功能实现
        • 整体流程
    • 6.1-修改密码-弹出层
        • 🍿🍿🍿注册修改密码点击事件-代码位置(src/layout/components/NavBar.vue)
        • 声明变量和方法控制弹层显示-代码位置
        • 放置弹层组件-代码位置(src/layout/components/NavBar.vue)
  • 6.2-修改密码-表单结构
        • 表单结构-代码位置(src/layout/components/NavBar.vue)
  • 6.3修改密码-表单校验
        • 声明数据和规则-代码位置(src/layout/components/NavBar.vue)
        • 绑定属性-代码位置(src/layout/components/NavBar.vue)
  • 6.4-修改密码-确定和取消
        • 确定和取消流程
        • 修改密码方法-代码位置(src/api/user.js)
        • 确定方法-代码位置(src/layout/components/NavBar.vue)
        • 取消方法-代码位置(src/layout/components/NavBar.vue)
        • 监听弹层关闭事件
        • 这里确定修改关闭弹窗,监听close事件,将表单进行重置,修改了信息,再打开的时候这些信息应该都被重置
  • 7. 清理组件和路由
        • 路由只保留登录-主页-404
        • 请求模块只保留user.js模块
  • 8.创建项目所需要的组件和路由
        • 创建模块
        • 路由模块样例
        • 路由的统一导入
        • 在src/router/index.js中集成到当前路由中
  • 9.扩展-解析左侧菜单原理
        • 左侧菜单的数据来源于路由模块的信息, 会根据路由信息的hidden属性来判断是否显示该路由信息到菜单,菜单属性中的图表和标题来源于路由meta中的icon和title属性
        • sidebar组件引入路由信息![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4e4c164dcf474af5810d769cefa411e3.png)
        • 循环渲染路由信息
        • sidebarItem组件根据条件渲染-传递icon和title属性给item组件
        • item组件接收icon和title属性,使用函数型组件完成渲染
  • 10.左侧菜单显示项目logo
        • ogo有两种展示形态,当菜单展开时,显示大图,当菜单折叠时,显示小图
        • 通过settings.js的设置,将logo显示出来-代码位置(src/settings.js)
        • 调整logo的页面结构-代码位置(src/layout/components/Sidebar/Logo.vue)
        • 调整logo样式-代码位置(src/layout/components/Sidebar/Logo.vue


1.获取用户资料在Vuex中共享

提示:这里可以添加本文要记录的大概内容:

登录成功跳转到主页之后,可以获取用户资料,获取的资料在Vuex中共享,这样用户就可以很方便的获取该信息

获取流程

在这里插入图片描述

在什么位置获取

在这里插入图片描述

在导航守卫的位置,可以确定已经有了token,获取资料更佳,在页面发生跳转时触发,此时不论你从何时何地进来,如果发现没获取资料,都可以清楚直观的获取资料。判断条件也使得不会发生重复的加载。
获取用户资料的api(src/api/user.js)
export function getUserInfo(){
  return request({
    url:'/sys/profile'
  })
}
Vuex中声明用户信息状态,修改用户信息的mutations,和获取用户信息的action src/store/modules/user.js
const state = {
  token:getToken(),
  userInfo:{}//这里一个空对象,为了防止后面取数据报错
}
const mutations = {
 setUserInfo(state,userInfo){
   state.userInfo = userInfo
  }
}
const actions = {
  async getUserInfo(context){
    const result = await getUserInfo();
    context.commit("setUserInfo",result)
   }
}
通过getters声明userId(快捷访问)-代码位置src/store/getters.js
const getters = {
	userId: state => state.user.userInfo.userId,
}
export default getters
在权限拦截处调用action-代码位置(src/pemission.js)
import router from '@/router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import store from '@/store'
/**
 *前置守卫
 *
*/
const whiteList = ['/login', '/404']
router.beforeEach(async(to,from,nex)=>{
 nprogress.start()
 if(store.getters.token){
  //存在token
  if(to.path === '/login'){
    //跳转到主页
    next('/');//中转到主页 不传地址 不会执行后置守卫
    nprogress.done()
   }else{
      if(!store.getters.userId){
        await store.dispatch("user/getUserInfo") 
      }
      next()//放行
    }
 }else{
   //没有token
   if(whiteList.includes(to.path)){
    next();
    }else{
      next('/login');//中转到登录页
      nprogress.done()
     }
  }
})

2、显式用户头像和用户名

顶部组件的内部位置

在这里插入图片描述

Vuex中已经有用户资料数据,可以通过getters开发属性,直接在组件中引用即可
位置src/store/getters.js 暴露属性
const getters = {
  token:state => state.user.token,
  userId:state =>state.user.userInfo.userId,//头像
  avatar:state=>state.user.userInfo.username,//用户名称
}
export default getters
在Navbar组件引入getters-代码位置(src/layout/components/NavBar.vue)
export default {
  computed: {
    // 引入头像和用户名称
    ...mapGetters([
      'sidebar',
      'avatar',
      'name'
    ])
  },
}
NavBar组件显示用户名和头像-代码位置(src/layout/components/NavBar.vue)
<div class="avatar-wrapper">
          <!-- 头像 -->
          <img :src="avatar" class="user-avatar">
          <!-- 用户名称 -->
          <span class="name">{{ name }}</span>
          <!-- 图标 -->
          <i class="el-icon-setting" />
</div>
🍕🍕🍕设置头像和用户名的样式-代码位置(src/layout/components/NavBar.vue)
.avatar-wrapper {
        margin-top: 5px;
        position: relative;
        display: flex;
        align-items: center;
        .name {
          //  用户名称距离右侧距离
          margin-right: 10px;
          font-size: 16px;
        }
        .el-icon-setting {
          font-size: 20px;
        }
        .user-avatar {
          cursor: pointer;
          width: 30px;
          height: 30px;
          border-radius: 50%;
        }
      }

3、处理头像为空的场景

🚜🚜🚜当用户没有头像时要显示用户名的第一个字
🍳🍳🍳条件判断-代码位置(src/layout/components/NavBar.vue)
<div class="avatar-wrapper">
          <!-- 头像 -->
          <img v-if="avatar" :src="avatar" class="user-avatar">
          <span v-else class="username">{{ name?.charAt(0) }}</span>
          <!-- 用户名称 -->
          <span class="name">{{ name }}</span>
          <!-- 图标 -->
          <i class="el-icon-setting" />
        </div>
 <style>
   .username {
          width: 30px;
          height: 30px;
          text-align: center;
          line-height: 30px;
          border-radius: 50%;
          background: #04c9be;
          color: #fff;
          margin-right: 4px;
        }
</style>
🧀🧀🧀 ?可选链操作符,是当?前面的变量为空时,不会继续往下执行,防止报错,如果版本不支持?的编译,需升级版本
npm i vue@2.7.0  vue-template-compiler@2.7.0   # 升级vue版本️

4.处理token失效的问题

token是有时效性的,当token超时,我们需要做一下处理

在这里插入图片描述

🌮请求拦截器处理-代码位置(src/utils/request.js)
//响应拦截器
service.interceptors.response.use(...,async(error)=>{
  if(error.response.status === 401){
    Message({type:'warning',message:'token超时了'})
   //说明token超时
   await store.dispatch('user/logout')//调用action退出登录
   router.push('/login');//跳转到登录页
   return Promise.reject(error)
   }
   //error.message
   Message.error(error.message)
   return Promise.reject(error)
})
实现Vuex的登出action-代码位置(src/store/modules/user.js)
const actions = {
  //退出登录
  logout(context){
    context.commit('removeToken');//删除token
    context.commit('setUserInfo',{});//设置用户信息为空对象 
  }
}

5.调整下拉菜单,实现退出登录

在这里插入图片描述

退出登录流程

在这里插入图片描述

Navbar中点击退出登录-代码位置(src/layout/components/NavBar.vue)
  <el-dropdown-item @click.native="logout">
          <span style="display:block;">登出</span>
  </el-dropdown-item>
退出方法-代码位置(src/layout/components/NavBar.vue)
export default{
  methods:{
    async logout(){
     //调用退出登录的action
     await this.$store.dispatch('user/logout')
     this.$router.push('/login')
     } 
  }
}
注意:native修饰符表示给组件的根元素注册事件

6.修改密码功能实现

整体流程

在这里插入图片描述
在这里插入图片描述

6.1-修改密码-弹出层

🍿🍿🍿注册修改密码点击事件-代码位置(src/layout/components/NavBar.vue)
<!-- prevent阻止默认事件 -->
 <a target="_blank" @click.prevent="updatePassword">
    <el-dropdown-item>修改密码</el-dropdown-item>
 </a>
声明变量和方法控制弹层显示-代码位置

(src/layout/components/NavBar.vue)

export default {
 data(){
  return {
    showDialog:false
   }
  },
  methods:{
    updatePassword(){
      this.showDialog = true
     }
   }
}
放置弹层组件-代码位置(src/layout/components/NavBar.vue)
<el-dialog width="500px" title="修改密码" :visible.sync="showDialog" >
</el-dialog>

6.2-修改密码-表单结构

在这里插入图片描述

表单结构-代码位置(src/layout/components/NavBar.vue)
  <el-form  label-width="120px" >
        <el-form-item label="旧密码" >
          <el-input  show-password size="small" />
        </el-form-item>
        <el-form-item label="新密码" >
          <el-input  show-password size="small" />
        </el-form-item>
        <el-form-item label="重复密码" >
          <el-input  show-password size="small" />
        </el-form-item>
        <el-form-item>
          <el-button size="mini" type="primary" >确认修改</el-button>
          <el-button size="mini" >取消</el-button>
        </el-form-item>
      </el-form>

6.3修改密码-表单校验

在这里插入图片描述

声明数据和规则-代码位置(src/layout/components/NavBar.vue)
export default {
  data () {
    return  {
     passForm: {
        oldPassword: '', // 旧密码
        newPassword: '', // 新密码
        confirmPassword: '' // 确认密码字段
      },
     rules: {
        oldPassword: [{ required: true, message: '旧密码不能为空', trigger: 'blur' }], // 旧密码
        newPassword: [{ required: true, message: '新密码不能为空', trigger: 'blur' }, {
          trigger: 'blur',
          min: 6,
          max: 16,
          message: '新密码的长度为6-16位之间'
        }], // 新密码
        confirmPassword: [{ required: true, message: '重复密码不能为空', trigger: 'blur' }, {
          trigger: 'blur',
          validator: (rule, value, callback) => {
            // value
            if (this.passForm.newPassword === value) {
              callback()
            } else {
              callback(new Error('重复密码和新密码输入不一致'))
            }
          }
        }] // 确认密码字段
      }
    }
  }
}
绑定属性-代码位置(src/layout/components/NavBar.vue)
      <el-form ref="passForm" label-width="120px" :model="passForm" :rules="rules">
        <el-form-item label="旧密码" prop="oldPassword">
          <el-input v-model="passForm.oldPassword" show-password size="small" />
        </el-form-item>
        <el-form-item label="新密码" prop="newPassword">
          <el-input v-model="passForm.newPassword" show-password size="small" />
        </el-form-item>
        <el-form-item label="重复密码" prop="confirmPassword">
          <el-input v-model="passForm.confirmPassword" show-password size="small" />
        </el-form-item>
        <el-form-item>
          <el-button size="mini" type="primary" >确认修改</el-button>
          <el-button size="mini" >取消</el-button>
        </el-form-item>
      </el-form>

6.4-修改密码-确定和取消

确定和取消流程

在这里插入图片描述

修改密码方法-代码位置(src/api/user.js)
/**
 * 更新密码
 * **/
export function updatePassword(data){
  return request({
     url:'/sys/user/updatePass',
     method:'put',
     data
   })
}
确定方法-代码位置(src/layout/components/NavBar.vue)
//确定
btnOk(){
  this.$refs.passForm.validate(async isOk =>{
    if(isOk){
      //调用接口
      await updatePassword(this.passForm)
      this.$message.success('修改密码成功')
      this.btnCancel()
     }
  })
}
取消方法-代码位置(src/layout/components/NavBar.vue)
btnCancel() {
      this.$refs.passForm.resetFields() // 重置表单
      // 关闭弹层
      this.showDialog = false
}
监听弹层关闭事件
    <el-dialog @close="btnCancel" width="500px" title="修改密码" :visible.sync="showDialog" >

这里确定修改关闭弹窗,监听close事件,将表单进行重置,修改了信息,再打开的时候这些信息应该都被重置

7. 清理组件和路由

在这里插入图片描述
在这里插入图片描述

路由只保留登录-主页-404
请求模块只保留user.js模块

8.创建项目所需要的组件和路由

在这里插入图片描述

创建模块

在这里插入图片描述

路由模块样例

在这里插入图片描述

路由的统一导入

在这里插入图片描述

在src/router/index.js中集成到当前路由中

在这里插入图片描述

9.扩展-解析左侧菜单原理

在这里插入图片描述

左侧菜单的数据来源于路由模块的信息, 会根据路由信息的hidden属性来判断是否显示该路由信息到菜单,菜单属性中的图表和标题来源于路由meta中的icon和title属性
sidebar组件引入路由信息在这里插入图片描述
循环渲染路由信息

在这里插入图片描述

sidebarItem组件根据条件渲染-传递icon和title属性给item组件

在这里插入图片描述

item组件接收icon和title属性,使用函数型组件完成渲染

在这里插入图片描述

10.左侧菜单显示项目logo

ogo有两种展示形态,当菜单展开时,显示大图,当菜单折叠时,显示小图

在这里插入图片描述

通过settings.js的设置,将logo显示出来-代码位置(src/settings.js)
sidebarLogo:true
调整logo的页面结构-代码位置(src/layout/components/Sidebar/Logo.vue)
<template>
  <div class="sidebar-logo-container" :class="{'collapse':collapse}">
    <transition name="sidebarLogoFade">
      <router-link key="collapse" class="sidebar-logo-link" to="/">
        <img src="@/assets/common/logo.png" class="sidebar-logo">
      </router-link>
    </transition>
  </div>
</template>
调整logo样式-代码位置(src/layout/components/Sidebar/Logo.vue
<style lang="scss" scoped>
.sidebarLogoFade-enter-active {
  transition: opacity 1.5s;
}

.sidebarLogoFade-enter,
.sidebarLogoFade-leave-to {
  opacity: 0;
}

.sidebar-logo-container {
  position: relative;
  width: 100%;
  height: 50px;
  line-height: 50px;
  text-align: center;
  overflow: hidden;

  & .sidebar-logo-link {
    height: 100%;
    width: 100%;

    & .sidebar-logo {
      width: 140px;
      vertical-align: middle;
      margin-right: 12px;
    }

    & .sidebar-title {
      display: inline-block;
      margin: 0;
      color: #fff;
      font-weight: 600;
      line-height: 50px;
      font-size: 14px;
      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
      vertical-align: middle;
    }
  }

  &.collapse {
    .sidebar-logo {
      margin-right: 0px;
      width: 32px;
      height: 32px;
    }
  }
}
</style>

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

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

相关文章

Leetcode刷题笔记 | 二叉树基本性质 | 一天的题量 | 5道题目 | 深度优先搜索 | 广度优先搜索 | 递归 | 遍历

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;本期毛毛张分享的是LeetCode关于二叉树&#x1f332;的性质的一些基础题&#xff0c;做这些题目的本质还是遍历二叉树&#x1f3c3;‍➡️的过程&#…

计算机组成原理 | 储存子系统(1)概述

三级储存体系 物理与虚拟存储器 &#xff08;抽象逻辑模型&#xff09; 存储器类型 存储器的速度指标

中国民间网络外交组织(CCND)

中国民间网络外交组织Chinese Civil Network Diplomacy简称(CCDN) 是由中国网民建立起来的一个网络外交组织&#xff0c;深度贯彻党的主张和网民意志的统一&#xff0c;为保护中国中华优秀传统文化&#xff0c;民族自信&#xff0c;国家安全&#xff0c;民族利益&#xff0c;社…

昇思MindSpore学习笔记2-04 LLM原理和实践--文本解码原理--以MindNLP为例

摘要&#xff1a; 介绍了昇思MindSpore AI框架采用贪心搜索、集束搜索计算高概率词生成文本的方法、步骤&#xff0c;并为解决重复等问题所作的多种尝试。 这一节完全看不懂&#xff0c;猜测是如何用一定范围的词造句。 一、概念 自回归语言模型 文本序列概率分布 分解为每…

76. UE5 RPG 实现场景阻挡剔除功能

在俯视角游戏中&#xff0c;我们总会碰到一个问题就是&#xff0c;建筑会遮挡住角色的问题。遇到这种问题有多种解决方案&#xff0c;厂商经常使用的一种方案是&#xff0c;如果角色被遮挡&#xff0c;则使用一种纯色或者增加一些菲涅尔的效果来实现 这种效果我之前在unity内实…

SpringBoot 项目整合 MyBatis 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatis 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisTest 五、浏览器测试结果六、…

一文了解什么是车载Tbox

目录 前言一、Tbox是什么呢?二、Tbox架构三、App——TSP——Tbox交互时序图四、汽车混合网关拓扑结构示例五、Tbox功能 前言 强烈建议提前阅读一下这篇文章&#xff1a;车机Tbox介绍 一、Tbox是什么呢? Tbox是汽车上的一个盒子&#xff0c;指的是Telematics BOX&#xff0c…

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol 0. 版本0.1 ERC1967Upgrade.sol 1. 目标合约2. 代码精读2.1 _getImplementation() internal && _upgradeTo(address newImplementation) internal2.2 _upgradeToAndCall(address newImplementation,…

常见反爬及应对

一&#xff0c;特殊混淆的还原 1.1 还原 AAEncode 与 JJEncode AAEncode是一种JavaScript代码混淆算法&#xff0c;利用它&#xff0c;可以将代码转换成 颜文字 表示的JavaScript代码。 去掉代码最后的 (‘‘)&#xff0c;这是函数的自调用&#xff0c;去除后就是函数的声明…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验13 静态路由配置错误导致的路由环路问题

一、实验目的 1.验证静态路由配置错误导致的路由环路问题&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证路由环路。 四、实验…

探囊取物之多形式登录页面(基于BootStrap4)

基于BootStrap4的登录页面&#xff0c;支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候&#xff1b;演练页面可点击查看源码 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/pr…

【AI提升】如何使用大模型:本机离线和FastAPI服务调用

大模型本身提供的功能&#xff0c;类似于windows中的一个exe小工具&#xff0c;我们可以本机离线调用然后完成具体的功能&#xff0c;但是别的机器需要访问这个exe是不可行的。常见的做法就是用web容器封装起来&#xff0c;提供一个http接口&#xff0c;然后接口在后端调用这个…

electron教程(二)控制应用程序的事件生命周期

1.will-finish-launching 当应用程序完成基础的启动的时候被触发&#xff0c;在 Windows 和 Linux 中, will-finish-launching 事件与 ready 事件是相同的; 在 macOS 中&#xff0c;这个事件相当于 NSApplication 中的 applicationWillFinishLaunching 提示。 app.on(will-fi…

Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了

昨天凌晨&#xff0c;知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想&#xff1a;完全由神经网络驱动的计算机&#xff0c;不再依赖传统的软件代码。 嗯&#xff0c;这是什么意思&#xff1f;全部原生LLM硬件设备的意思吗&#xff1f…

机械设备制造企业MES系统解决方案介绍

机械设备制造行业涵盖了各类工业设备、工程机械、农业机械等多个领域&#xff0c;对生产精度、质量控制和效率提出了较高要求。为了提升生产效率、保证产品质量并满足客户需求&#xff0c;越来越多的机械设备制造企业引入了MES系统。本文将详细介绍MES系统在机械设备制造行业的…

魔镜魔镜,我要变得更漂亮!按需搭配一键叠穿,效果拿下新SOTA!中山大学字节智创数字人团队提出虚拟试穿新框架

魔镜魔镜,我要变得更漂亮!按需搭配一键叠穿,效果拿下新SOTA!中山大学&字节智创数字人团队提出虚拟试穿新框架。 多件衣服按指定穿法一键虚拟试穿! 中山大学&字节智创数字人团队提出了一个名为MMTryon的虚拟试穿框架,可以通过输入多个服装图像及指定穿法的文本指…

COB封装的LED显示屏是什么?

COB&#xff08;Chip on Board&#xff09;封装的LED显示屏&#xff0c;是一种采用先进倒装COB封装技术的显示屏&#xff0c;其中LED芯片是直接被安装并封装在PCB电路板上&#xff0c;而不是先对单个封装再焊接至电路板&#xff0c;与SMD&#xff08;Surface Mount Device&…

怎么快速给他人分享图片?扫描二维码看图的简单做法

现在通过二维码来查看图片是一种很常见的方法&#xff0c;通过二维码来查看图片不仅能够减少对手机存储空间的占用&#xff0c;而且获取图片变得更加方便快捷&#xff0c;只需要扫码就能够查看图片&#xff0c;有利于图片的展现。很多的场景中都有图片二维码的应用&#xff0c;…

2024软件设计师经验贴(一考就过)

2024软件设计师经验贴&#xff08;一考就过&#xff09; 第一阶段、基础积累&#xff1a;把书读厚 这一阶段可以跟着视频、书籍或文章进行基础知识的学习。 推荐的视频系列&#xff1a; 「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 40–14.3设计模式 推荐的文…

下载和使用SLUN数据集

1. 下载数据集 网址在https://opendatalab.com/OpenDataLab/lsun/tree/main/raw/scenes 下载bedroom_val_lmdb.zip 然后解压后会又两个文件&#xff0c;一个data.mdb&#xff0c;另一个lock.mdb。 2. 使用torchvison使用LSUN数据集 我把解压后的bedroom_val_lmdb放在/home/…