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…

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

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

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;今天闲来闲来无事下载下来后…

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

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

损失函数分类

1. NLLLoss&#xff08;负对数似然损失&#xff09; 定义&#xff1a; 直接对预测的概率 p(yi) 的负对数求平均。通常配合 Softmax 使用&#xff0c;输入为对数概率。 优点&#xff1a; 对离散分类问题效果良好。更灵活&#xff0c;用户可以自行计算 Softmax。 缺点&#x…

python冒号是什么意思

例如&#xff1a; user: User User.objects.filter(iddata.get(uid)).first() 变量名后面的冒号是&#xff1a;类型注解&#xff0c;3.6以后加入的&#xff0c;冒号右边是类型&#xff0c;仅仅是注释&#xff0c;有些鸡肋。 变量注释的语法&#xff1a;注释变量类型,明确指出…

打字指法和键盘按键功能简介

打字指法和键盘按键功能简介 一、打字指法简介&#xff08;附视频演示&#xff09; 基本要领和练习步骤&#xff1a; 手指位置&#xff1a;正常情况下&#xff0c;大拇指放在空格键上&#xff0c;其余四个手指分别放在 ASDF 和 JKL; 键上。 打字姿势&#xff1a;打字时手指…

H3C ACL实验

实验拓扑 实验需求 按照图示配置 IP 地址全网路由互通在 SERVER1 上配置开启 TELNET 和 FTP 服务配置 ACL 实现如下效果 192.168.1.0/24网段不允许访问 192.168.2.0/24 网段&#xff0c;要求使用基本 ACL 实现 PC1 可以访问 SERVER1 的 TELNET 服务&#xff0c;但不能访问 FTP…

【热门主题】000077 物联网智能项目:开启智能未来的钥匙

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

AIGC时代 | 如何从零开始学网页设计及3D编程

文章目录 一、网页设计入门1. 基础知识2. 学习平台与资源3. 示例代码&#xff1a;简单的HTMLCSSJavaScript网页 二、3D编程入门1. 基础知识2. 学习平台与资源3. 示例代码&#xff1a;简单的Unity 3D游戏 《编程真好玩&#xff1a;从零开始学网页设计及3D编程》内容简介作者简介…

Java并发07之ThreadLocal

文章目录 1 ThreadLocal原理2 内部结构3 内存泄露问题4 entry的key为什么被设计为弱引用 1 ThreadLocal原理 ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private st…

python股票数据分析(Pandas)练习

需求&#xff1a; 使用pandas读取一个CSV文件&#xff0c;文件内容包括股票名称、价格和交易量。完成以下任务&#xff1a; 找出价格最高的股票&#xff1b; 计算总交易量&#xff1b; 绘制价格折线图。 代码实现&#xff1a; import pandas as pd import matplotlib.pyplot …

鸿蒙NEXT元服务:论如何免费快速上架作品

【引言】天下武功&#xff0c;唯快不破。 本文讨论如何免费且以最快速度上架自己的作品。 作者以自己从零开始到提交发布审核一共俩小时的操作流程分享给大家作参考。 【1】立项选择 结论&#xff1a;元服务&#xff0c;单机&#xff0c;工具类&#xff08;非游戏&#xff…

el-select 修改样式

这样漂亮的页面&#xff0c;搭配的却是一个白色风格的下拉框 &#xff0c;这也过于刺眼。。。 调整后样式为&#xff1a; 灯红酒绿总有人看着眼杂&#xff0c;但将风格统一终究是上上选择。下面来处理这个问题。 分为两部分。 第一部分&#xff1a;是修改触发框的样式 第二部…

M|两小无猜

title: 两小无猜 Jeux d’enfants time: 2024-12-01 周日 rating: 7 豆瓣: 7.9 上映时间: “2003” 类型: M爱情 导演: 杨塞谬尔 Yann Samuell 主演: 吉约姆卡内 Guillaume Canet玛丽昂歌迪亚 Marion Cotillard 国家/地区: 法国比利时 片长/分钟: 93分钟 M&#xff…

深度学习中的前向传播与损失函数

目录 ​编辑 前向传播&#xff1a;神经网络的推理过程 什么是前向传播&#xff1f; 前向传播的步骤 数学表达 代码示例&#xff1a;前向传播 损失函数&#xff1a;衡量预测与真实值的差异 损失函数的定义 损失函数的作用 常见的损失函数 代码示例&#xff1a;损失函…