Springboot项目搭建(8)-用户登出与个人中心修改

1.提要信息

1.1 catch和then方法

thencatch是JavaScript中Promise对象的两个方法,用于处理异步操作的成功(成功回调)和失败(失败回调)情况。这两个方法通常与async/await语法一起使用,但也可以单独使用。

(1) then 方法

then方法是Promise实例链式调用的一部分,它接收一个或多个函数作为参数。

这些函数会在Promise成功解决(fulfilled)后被调用。如果Promise成功解决,then方法的第一个参数(如果有的话)会被调用,并且它的返回值会传递给下一个then方法,或者被catch方法捕获(如果没有更多的then方法)。

promise.then(onFulfilled, onRejected);

  • onFulfilled:当Promise成功解决时调用的函数。
  • onRejected:当Promise被拒绝时调用的函数(可选)。

(2) catch 方法

catch方法是Promise实例链式调用的一部分,它接收一个函数作为参数。

这个函数会在Promise被拒绝(rejected)后被调用。catch方法返回一个新的Promise,这个新的Promise会在捕获到错误后解决。

promise.catch(onRejected);

  • onRejected:当Promise被拒绝时调用的函数。

2.退出登录

2.1 代码处理

这段处理了用户在界面上执行的命令:如果是退出登录,则清除token和用户信息,并跳转到登录页面;如果不是退出登录,则跳转到用户页面。

<script setup>
import ...
import { ElMessage, ElMessageBox } from "element-plus";//确认框&提示框
// import { useTokenStore } from "@/stores/token";
// import useUserInfoStore from "@/stores/userInfo";
const tokenStore = useTokenStore()
// const userInfoStore = useUserInfoStore()
import { useRouter } from "vue-router";
const router = useRouter()
const handleCommand = (command)=>{//在浏览器控制台中,输出command数据// console.log(command) 👈测试函数if (command === 'logout'){ElMessageBox.confirm('退?','提示',{confirmButtonText:'确认',cancelButtonText:'取消',type:'warning'}).then(async()=>{// console.log('点击了确认') 👈测试函数//退出登录//清除状态管理Pinia中存放的数据tokenStore.removeToken()userInfoStore.removeInfo()//跳转至登录界面router.push('/login')ElMessage({type:'success',message:'用户退啦!'})}).catch(()=>{ElMessage({type:'info',message:'用户取消了退出'})})}else{router.push('/user/'+command)}
}
</script>

2.2 效果视图

3.用户基本资料界面

3.1 修改信息函数代码

文件地址:src\views\user\UserInfo.vue

允许用户修改他们的昵称和邮箱信息,并通过表单验证确保输入符合要求。

如果输入验证通过,用户点击提交按钮后,会调用updateUserInfo函数将信息提交到后端,并在成功后更新用户信息。

<script setup>
import { ref } from 'vue';
import useUserInfoStore from '@/stores/userInfo';
const userInfoStore = useUserInfoStore()
const userInfo = ref({ ...userInfoStore.info })
//数据校验
const rules = {nickname: [{required: true, message: "用户请输入用户昵称", trigger: 'blur'}, {pattern: /^\S{2,10}$/,message: '昵称必须是2-10位的非空字符',trigger: 'blur'}],email: [{required: true, message: "请输入用户邮箱", trigger: 'blur'}, {type:'email',message: '邮箱格式不正确',trigger: 'blur'}]
}
//修改个人信息
import { userInfoUpdateService } from '@/apis/user.js'
import { ElMessage } from 'element-plus';
const updateUserInfo = async()=>{let result = await userInfoUpdateService(userInfo.value)ElMessage.success(result.msg?result.msg:'修改成功')userInfoStore.setInfo(userInfo.value)//更新pinia中存放用户信息的数据
}
</script>
<template><el-card class="page-container"><template #header><div class="header"><span>基本资料</span></div></template><el-row><el-col :span="12"><el-form :model="userInfo" :rules = "rules" label-width="100px" size="large"><el-form-item label="登录名称"><el-input v-model="userInfo.username" disabled /></el-form-item><el-form-item label="用户昵称" prop="nickname"><el-input v-model="userInfo.nickname" /></el-form-item><el-form-item label="用户邮箱" prop="email"><el-input v-model="userInfo.email" /></el-form-item><el-form-item><el-button type="primary" @click="updateUserInfo">提交修改</el-button></el-form-item></el-form></el-col></el-row></el-card>
</template>

3.2 暴露地址

文件地址:src\apis\user.js

export const userInfoUpdateService = (userInfoData) => {return request.put('/user/update', userInfoData)
}

3.3 效果视图

4. 更换头像界面

4.1 更换头像函数代码

文件地址:src\views\user\UserAvatar.vue

<script setup>
import {Plus,Upload
} from "@element-plus/icons-vue"import avatar from '@/assets/default.png'
import { ref } from "vue";
import { userAvatarUpdateService, userInfoService } from "@/apis/user.js";
import useUserInfoStore from "@/stores/userInfo";
import { useTokenStore } from "@/stores/token";
const tokenStore = useTokenStore()
const userInfoStore = useUserInfoStore()
import { ElMessage, ElMessageBox } from "element-plus";
import { useRouter } from "vue-router";
const router = useRouter()
const imgUrl = ref(userInfoStore.info.userPic)const uploadRef = ref()
//上传成功回调函数
const uploadSuccess = (result)=>{imgUrl.value = result.data
}
//修改头像
const updateAvatar = async()=>{let result = await userAvatarUpdateService(imgUrl.value)ElMessage.success(result.msg?result.msg:'修改成功')//同步修改pinia中的头像userInfoStore.info.userPic = imgUrl.value
}
</script><template><el-card class="page-container"><template #header><div class="header"><span>更换头像</span></div></template><el-row><el-col :span="12"><el-upload ref="uploadRef"class="avatar-uploader" :show-file-list="false" :auto-upload="true" action="/apis/upload" name="file" :header="{'Authorization':tokenStore.token}":on-success="uploadSuccess"><img v-if="imgUrl" :src="imgUrl" class="avatar"><img v-else :src="avatar" width="300"/></el-upload><br><el-button size="large" :icon="Plus" @click="uploadRef.$el.querySelector('input').click()">选择图片</el-button><el-button size="large" :icon="Upload" @click="updateAvatar">上传头像</el-button></el-col></el-row></el-card>
</template>

4.2 暴露地址

文件地址:src\apis\user.js

export const userAvatarUpdateService = (avatarURL) => {const params = new URLSearchParams()params.append('avatarURL', avatarURL)return request.patch('/user/updateavatar', params)
}

4.3 效果视图

5. 重置密码界面

5.1 重置密码函数代码

文件地址:src\views\user\UserPassword.vue

<script setup>
import { ref } from 'vue';
import { ElMessage } from 'element-plus';
import { userPsdUpdateService } from '@/apis/user';
import { useRouter } from 'vue-router';
const router = useRouter();
const passwordForm = ref(null);
const passwordData = ref({old_Pwd: '',new_Pwd: '',re_Pwd: ''
});const checkRepassword = (rule, value, callback) => {if (value !== passwordData.value.new_Pwd) {callback(new Error('两次输入密码不一致'));} else {callback();}
};const rules = {old_Pwd: [{ required: true, message: '请输入原密码', trigger: 'blur' }],new_Pwd: [{ required: true, message: '请输入新密码', trigger: 'blur' },{ min: 6, message: '密码长度不能小于6位', trigger: 'blur' }],re_Pwd: [{ required: true, message: '请确认新密码', trigger: 'blur' },{ validator: checkRepassword, trigger: 'blur' }]
};const submitPassword = async () => {if (!passwordForm.value) return;passwordForm.value.validate(async (valid) => {if (valid) {try {let result = await userPsdUpdateService(passwordData.value);ElMessage.success(result.msg ? result.msg : '重置密码成功');router.push("/login");} catch (error) {ElMessage.error('重置密码失败');}} else {ElMessage.error('表单校验失败');}});
};
</script><template><el-card class="page-container"><template #header><div class="header"><span>更改密码</span></div></template><el-row><el-col :span="12"><el-form :model="passwordData" :rules="rules" ref="passwordForm"><el-form-item label="原密码" prop="old_Pwd"><el-input type="password" v-model="passwordData.old_Pwd"></el-input></el-form-item><el-form-item label="新密码" prop="new_Pwd"><el-input type="password" v-model="passwordData.new_Pwd"></el-input></el-form-item><el-form-item label="确认新密码" prop="re_Pwd"><el-input type="password" v-model="passwordData.re_Pwd"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitPassword">修改密码</el-button></el-form-item></el-form></el-col></el-row></el-card>
</template>

5.2 暴露地址

文件地址:src\apis\user.js

export const userPsdUpdateService = (userPsdData) => {return request.post('/user/updatePwd', userPsdData);};
//
//export const userPsdUpdateService = (userPsdData) => {
//    const params = new URLSearchParams()
//    for (let key in userPsdData) {
//        params.append(key, userPsdData[key])
//    }
//    // return request.post('/user/updatePwd',params)
//    return request.post('/user/updatePwd', userPsdData, {
//        headers: {
//            'Content-Type': 'application/json'
//        }
//    });
//}

5.3 效果视图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024】使用Docker搭建redis sentinel哨兵模式集群全流程(包含部署、测试、错误点指正以及直接部署)

目录&#x1f4bb; 前言**Docker Compose介绍**最终实现效果 一、搭建集群1、创建文件结构2、创建redis节点3、验证节点4、创建sentinel哨兵5、验证Sentinel功能 二、spring连接1、添加依赖2、添加配置3、启动测试 三、直接部署流程1、拉取配置2、修改端口创建 前言 本篇文章主…

Python毕业设计选题:基于django+vue的智慧社区可视化平台的设计与实现+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 养老机构管理 业主管理 社区安防管理 社区设施管理 车位…

webpack 项目访问静态资源

使用 webpack dev serve 启动 react 项目后&#xff0c;发现无法使用 http://localhost:8080/1.png 访问到项目的 /static 目录下的 1.png 文件。我的 webpack-dev.js 配置如下&#xff1a; const webpack require(webpack) const webpackMerge require(webpack-merge) cons…

shell(2) 变量

定义变量 中间不需要加空格&#xff0c;末尾也不需要分号。 name1jth #不加引号定义 name2jth #单引号定义 name3"jth" #双引号定义 这三种都表示字符串变量。 使用变量 使用$符号&#xff0c;或者${}。加花括号主要是帮助解释器识别变量边界。 echo $name #输出jth…

React的Fiber小记 ⏰

写在最前&#xff1a;绝对是错漏百出的一篇博文&#xff0c;很多内容还没有写demo去验证&#xff0c;特别是浏览器的帧渲染那一块&#xff0c;权当小记。至于为什么想写Fiber&#xff0c;问就是Shopee面试的时候被问惨了&#xff0c;之前实习上班摸鱼的时候看过稀土掘金上一篇感…

JavaScript 前端开发:从入门到精通的奇幻之旅

目录 一、引言 二、JavaScript 基础 &#xff08;一&#xff09;变量与数据类型 &#xff08;二&#xff09;运算符 &#xff08;三&#xff09;控制结构 三、函数 &#xff08;一&#xff09;函数定义与调用 &#xff08;二&#xff09;函数作用域 &#xff08;三&am…

安装Fcitx5输入框架和输入法自动部署脚本(来自Mark24)-Ubuntu通用

在Ubuntu22.04上安装rime中文输入法的基本教程 上述文章接近废弃。 使用新逻辑配置基本的Fcitx5的输入法。 安装 第一步&#xff0c;下载相关组件 sudo nala install vim sudo nala install ruby sudo nala install fcitx5-rime第二步&#xff0c;设置语言为Fcitx5 而非 默认…

【FAQ】使用Node.js 镜像 构建本地项目

在nodejs官方并没有提供使用node.js构建本地项目的方法&#xff0c;但是通过阅读官方文档&#xff0c;可以发现&#xff0c;官方在包管理器界面提供了如下语句 所以node.js容器是可以执行语句的 下面通过docker 的 -w 、-v 参数设置容器工作目录和目录映射&#xff08;实现本…

C/C++语言基础--C++智能指针(unique_ptr、shared_ptr、week_ptr)

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 在C、C语言中&#xff0c;最经典的特性就是指针&#xff0c;他和内存相关&#xff0c;但是我们常常申请内存后忘记释放而导致内存泄漏&#xff0c;C提供了智能指针去解决这个内存泄漏问题&#xff1b;C语言…

Nature Methods | 人工智能在生物与医学研究中的应用

Nature Methods | 人工智能在生物与医学研究中的应用 生物研究中的深度学习 随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;尤其是深度学习和大规模预训练模型的出现&#xff0c;AI在生物学研究中的应用正在经历一场革命。从基因组学、单细胞组学到癌症生…

队列-链式描述(C++)

定义 使用链表描述队列时&#xff0c;通常包含以下几个基本要素&#xff1a; 队头指针&#xff08;Front Pointer&#xff09;&#xff1a;指向队列中第一个&#xff08;即最早进入队列的&#xff09;元素的节点。队尾指针&#xff08;Rear Pointer&#xff09;&#xff1a;指…

Flutter 之 InheritedWidget

InheritedWidget 是 Flutter 框架中的一个重要类&#xff0c;用于在 Widget 树中共享数据。它是 Flutter 中数据传递和状态管理的基础之一。通过 InheritedWidget&#xff0c;你可以让子 Widget 在不需要显式传递数据的情况下&#xff0c;访问祖先 Widget 中的数据。这种机制对…

Python 深度学习框架介绍

Python 是深度学习领域的主流编程语言&#xff0c;拥有许多强大的深度学习框架&#xff0c;广泛用于学术研究、工业应用和生产环境中。以下是一些最流行的 Python 深度学习框架&#xff0c;它们各自具有独特的功能和特点&#xff1a; 1. TensorFlow 开发公司&#xff1a;Google…

MySQL技巧之跨服务器数据查询:进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中

MySQL技巧之跨服务器数据查询&#xff1a;进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中 基础篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MyS…

Flutter 指纹识别

在这篇博客中&#xff0c;我们将介绍如何使用 Flutter 的 local_auth 插件在 Android 和 iOS 设备上实现指纹识别功能。通过这一步一步的实现&#xff0c;我们将学习如何检查设备是否支持生物识别、如何触发指纹验证&#xff0c;并处理可能出现的错误。 效果图&#xff08;因为…

CentOS 9 配置静态IP

文章目录 1_问题原因2_nmcli 配置静态IP3_使用配置文件固定IP4_重启后存在的问题5_nmcli 补充 1_问题原因 CentOS 7 于 2014年6月发布&#xff0c;基于 RHEL 7&#xff0c;并在 2024年6月30日 结束维护。 CentOS 9 作为目前的最新版本&#xff0c;今天闲来闲来无事下载下来后…

数据结构(三)——双向链表的介绍以及实现

前言 前面两期数据结构的文章我们介绍了顺序表和单向链表&#xff0c;那么本篇博文我们将来了解双向链表&#xff0c;作为最好用的一种链表&#xff0c;双向链表有什么特殊之处呢&#xff0c;接下来就让我们一起了解一下吧。 下面是前两篇数据结构的文章&#xff1a; 数据结…

Oracle--表空间Tablespace

在 Oracle 数据库中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是一种逻辑存储结构&#xff0c;用于组织和管理数据库中物理存储数据文件的方式。以下是表空间相关操作的详细介绍&#xff0c;包括创建、修改、删除、查询以及常见问题处理。 1. 表空间的作用 提供逻…

cmake一些常用指令

cmake常用的一些命令 推荐网址&#xff1a;CMake 保姆级教程&#xff08;上&#xff09; | 爱编程的大丙 cmake_minimum_required(VERSION 3.0) project(CALC) # 增加-stdc11 set(CMAKE_CXX_STANDARD 11) # 指定输出的路径 set(HOME ${CMAKE_CURRENT_SOURCE_DIR}) # 可执行文…

面阵相机的使用和注意事项

引言 面阵相机&#xff08;Area Scan Camera&#xff09;是一种广泛应用于工业视觉、医学成像、安防监控以及科研领域的图像采集设备。与线扫相机不同&#xff0c;面阵相机的传感器包含多行像素&#xff08;例如1280x1024、1920x1080等&#xff09;&#xff0c;能够在一个曝光…