第55章 头像图片的前端渲染显示

news2024/11/15 15:45:30

1 WebApi.Controllers.CustomerController.GetCustomerByToken

  /// <param name="token">1个指定的令牌字符串。</param>

        /// <summary>

        /// 【通过令牌获取用户-无需权限】

        /// </summary>

        /// <remarks>

        /// 摘要:

        ///     通过1个指定的令牌字符串,获取用户实体的1个指定实例。

        /// </remarks>

        /// <returns>

        /// 返回:

        ///    用户实体的1个指定实例。

        /// </returns>

        [HttpGet]

        public async Task<MessageModel<Customer>> GetCustomerByToken(string token)

        {

            if (!string.IsNullOrEmpty(token))

            {

                JwtBearerModel _jwtBearerModel = Framework.Infrastructure.Extensions.JwtBearerExtensions.SerializeToken(token);

                if (_jwtBearerModel != null && _jwtBearerModel.CustomerId > 0)

                {

                    Customer _customer = await _customerService.GetCustomerByIdAsync(_jwtBearerModel.CustomerId);

                    return MessageModel<Customer>.GetSuccess("成功通过令牌字符串,获取单个指定用户!", _customer);

                }

            }

            return MessageModel<Customer>.Fail("通过令牌字符串,获取单个指定用户失败!", 500);

        }

2 向src\common\http.api.js添加定义

//通过1个指定的令牌字符串,获取1个指定用户头像图片绝对URL路径。

export const getCustomerByToken = async params => {

    return await axiosInterceptor.get('/Customer/GetCustomerByToken', {

        params: params

    });

};

//获取1个指定用户头像图片绝对URL路径。

export const getAvatarUrl = async params => {

    return await axiosInterceptor.get('/Customer/GetAvatarUrl', {

        params: params

    });

};

3 向src\views\LoginView.vue\submitLogin添加定义

let loginParams = {

                    email: this.formLogin.account,

                    password: this.formLogin.checkPass

                };

                let res = await postCustomerLogin(JSON.stringify(loginParams));

                localStorage.user = res.data.response.token;

               

                let userToken = 'Bearer ' + res.data.response.token;

                this.$store.commit("saveToken", userToken);

4 \src\components\InitUserMenu.vue

<template>

    <el-row :gutter="20">

        <el-col :span="20">

            111

        </el-col>

        <el-col :span="4" class="userinfo">

            <el-dropdown trigger="hover" style="hight: 40px; line-height: 40px;" placement="bottom-end">

                <span class="el-dropdown-link userinfo-inner">

                    {{name}}

                    <el-avatar :size="40" style="vertical-align: middle">

                        <!-- <img src="../assets/AvatarDemo.png" /> -->

                        <!-- <img :src="assetsAvatarDemo" /> -->

                        <img :src="avatarUrl" />

                    </el-avatar>

                </span>

                <template #dropdown>

                    <el-dropdown-menu>

                        <el-dropdown-item>

                            <el-badge :value="2" class="item" type="warning">

                                我的消息

                            </el-badge>

                        </el-dropdown-item>

                        <el-dropdown-item divided @click="loginOut">退出登录</el-dropdown-item>

                    </el-dropdown-menu>

                </template>

            </el-dropdown>

        </el-col>

    </el-row>

</template>

<script>

    import importAvatarDemo from '../assets/AvatarDemo.png';

    import {

        getCustomerByToken,

        getAvatarUrl,

    } from '../common/http.api.js';

    export default {

        data() {

            return {

                assetsAvatarDemo: "",

                avatarUrl: "",

                name: "",

            };

        },

        methods: {

            //初始化用户信息菜单组件。

            async initUserMenu() {

                let tokenParam = {

                    token: localStorage.getItem('user'),

                };

                let customer = await getCustomerByToken(tokenParam);

                this.name = customer.data.response.name;

               

                let customerIdParam = {

                    customerId: customer.data.response.id,

                };

                let res = await getAvatarUrl(customerIdParam);

                this.avatarUrl = res.data.response;

            },

            //注销退出事件,在使用Jwt登录时,只要把前端全局变更所存储的令牌字符串即可以,后端定义还是不定义注销退出控制器行为方法并不是必须的。

            async loginOut() {

                let token = localStorage.getItem('Token');

                console.log(token);

                localStorage.removeItem('Token');

                token = localStorage.getItem('Token');

                console.log(token);

                if (token === null || token === '') {

                    this.$router.push('/Login')

                }

            },

        },

        async mounted() {

            this.assetsAvatarDemo = importAvatarDemo;

            await this.initUserMenu();

        },

    }

</script>

<style scoped lang="scss">

    .el-header .userinfo {

        margin-top: 7px;

        text-align: right;

        float: right;

        width: auto;

    }

    .el-header .userinfo .userinfo-inner {

        cursor: pointer;

        color: #fff;

        float: right;

    }

</style>

5 src\components\AdminLayoutComponen.vue添加定义

  <el-header>

          <initUserMenu></initUserMenu>

 </el-header>

 import router from '../router/index.js'

    import initUserMenu from '@/components/InitUserMenu.vue'

    export default {

        components: {

            initUserMenu,

        },

对以上功能更为具体实现和注释见:230309_013shopvue( 头像图片的前端渲染显示)。

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

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

相关文章

【Python】装饰器

一、装饰器的作用 装饰器能够为已经存在的对象添加额外的功能。 二、什么是装饰器 装饰器本质是一个python函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能&#xff0c;装饰器的返回值也是一个函数对象。 三、装饰器的应用场景 插入日志、性能…

在云服务器安装tomcat和mysql

将 linux 系统安装包解压到指定目录进入 bin 目录执行./startup.sh 命令启动服务器执行./shutdown.sh 关闭服务器在浏览器中访问虚拟机中的 tomcat ip端口具体操作入下解压tomcat压缩包解压&#xff0c;输入tom按table键自动补全tar -zxvf 启动tomcat进入bin目录在linux启动to…

debian11安装Nvidia驱动及Docker运行

文章目录前言硬件及软件环境驱动下载驱动安装禁用xserver禁用nouveau安装依赖设置可执行并运行检查安装结果Docker配置Docker安装nvidia-container-runtime安装[^4]命令脚本内容执行脚本安装 nvidia-container-runtime检测Docker gpu 验证卸载指令总结异常处理参考链接前言 博…

Spring Boot+Vue前后端分离项目练习07之网盘项目注册登陆页面实现

1.Axios安装和接口封装 Axios是一个易用、简洁且高效的http库&#xff0c; 使用Promise管理异步&#xff0c;支持请求和响应拦截器&#xff0c;自动转换JSON数据等高级配置&#xff0c;是在vue项目中十分常见前端请求库&#xff0c;使用以下指令安装。 npm install axiosnpm …

工作中git常用操作

前言 在各种版本并行&#xff0c;需求不断迭代的过程中&#xff0c;我们经常会遇到各种打断开发的场景&#xff1a; 场景一&#xff1a;当前版本功能开发到一半&#xff0c;上级临时要求去修复某个线上bug&#xff1f;你能说不吗&#xff0c; 那当然绝对服从组织安排 &#x…

代码随想录算法训练营day54 | 动态规划之子序列 392.判断子序列 115.不同的子序列

day54392.判断子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组115.不同的子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺…

[2.2.3]进程管理——调度算法的评价指标

文章目录第二章 进程管理调度算法的评价指标&#xff08;一&#xff09;CPU利用率&#xff08;二&#xff09;系统吞吐量&#xff08;三&#xff09;周转时间&#xff08;四&#xff09;等待时间&#xff08;五&#xff09;响应时间小结第二章 进程管理 调度算法的评价指标 CP…

861. 翻转矩阵后的得分

861. 翻转矩阵后的得分https://leetcode.cn/problems/score-after-flipping-matrix/ 难度中等236 给你一个大小为 m x n 的二元矩阵 grid &#xff0c;矩阵中每个元素的值为 0 或 1 。 一次 移动 是指选择任一行或列&#xff0c;并转换该行或列中的每一个值&#xff1a;将所…

【Flutter】开发环境配置:FlutterSDK、Android SDK、iOS SDK

文章目录 一、前言二、Dart和Flutter的关系三、本地开发环境配置1.FlutterSDK2.配置镜像站3.安装安卓工具链4.安装XCode5.Dart 配置四、配置完成五、总结一、前言 在前面的课程中,我们学习了Dart语言的基本用法,并在DartPad线上环境对代码执行。 接下来,我们学习如何在本地…

如何为Keil安装version 5版本的ARM Compiler(Use default compliler version 5)

目录1. 为什么要安装version 5编译器2. 从原来MDK5.37以下版本(MDK536)的软件中提取AC5的编译器3. 解压完成后的文件如下图&#xff0c;打开ARM文件夹4. 将AMRCC文件夹拷贝到你的keil安装目录的AMR文件下5. 打开Keil&#xff0c;点击Project→Manage→Project Items&#xff0c…

爬虫(一)基础介绍

文章目录1. 爬虫简介1.1 robots协议1.2 反爬手段1.3 请求组成1.4 响应组成1.5 POST 请求与 GET 请求2. requests库2.1 GET请求2.2 POST请求2.3 代理1. 爬虫简介 网络爬虫也叫做网络机器人&#xff0c;可以代替人们自动地在互联网中进行数据信息的采集与整理。它是一种按照一定的…

哪种类型蓝牙耳机佩戴最舒服?舒适度最好的蓝牙耳机推荐

如果您想在外出时听自己喜欢的音乐&#xff0c;您需要佩戴耳机&#xff0c;当前的耳机都足够小&#xff0c;可以将它们放在口袋里&#xff0c;即使它们在充电盒中也是如此&#xff0c;舒适度一直都是人们所追求的&#xff0c;舒适之余&#xff0c;佩戴同样稳固更加令人安心&…

ASEMI高压MOS管7N65参数,7N65图片,7N65大小

编辑-Z ASEMI高压MOS管7N65参数&#xff1a; 型号&#xff1a;7N65 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;650V 栅源电压&#xff08;VGS&#xff09;&#xff1a;30V 漏极电流&#xff08;ID&#xff09;&#xff1a;7A 功耗&#xff08;PD&#xff09;…

中文数字对照表--课后程序(Python程序开发案例教程-黑马程序员编著-第4章-课后作业)

实例5&#xff1a;中文数字对照表 阿拉伯数字因其具有简单易写、方便使用的特点成为了最流行的数字书写方式&#xff0c;但在使用阿拉伯数字计数时&#xff0c;可以对某些数字不漏痕迹的修改成其它数字&#xff0c;例如&#xff0c;将数字“1”修改为数字“7”&#xff0c;将数…

Excel·VBA矩阵、求逆矩阵、解线性方程组

初等变换法求逆矩阵 vba内置函数MInverse可以计算矩阵的逆矩阵&#xff0c;《Office VBA 参考-WorksheetFunction.MInverse 方法 (Excel)》 初等变换法代码思路 对于一个3x3矩阵&#xff08;下图3x3红色部分&#xff09;右侧扩充单位矩阵&#xff08;下图3x3黑色部分&#xf…

海格里斯HEGERLS料箱穿梭车生产厂家|配有高速货物提升机滚筒输送线设备的料箱四向穿梭车立体库

随着物流自动化需求的增中和自动化料箱数量的增加&#xff0c;现在市场对料箱四向穿梭车系统的需求正在逐渐增加&#xff0c;这也使得四向穿梭车在储物效率和储物空间利用率方面的优势的更加突出&#xff0c;其应用场景也在不断扩大。料箱四向穿梭车仓储方案已成为一种高效、智…

svg的深度利用绕过waf

目录 DOM树的构建 源码 img失败的原因 解法一 --- svg成功的原因 触发流程 实验 解法二 --- details标签 事件触发流程 实验验证 总结 首先在解这道题的开始连了解下什么是DOM树&#xff0c;以及DOM树的构建 DOM树的构建 我们知道JS是通过DOM接口来操作文档的&…

针对博客系统的自动化测试

针对博客系统进行web自动化测试 文章目录针对博客系统进行web自动化测试引入依赖创建出合适的目录结构AutoTestUtilsBlogLoginTestBlogListTestBLogEditTestBlogDetailTest使用套件执行关于博客系统的自动化测试的源代码已经上传至gitee链接 引入依赖 首先在pom.xml上导入依赖…

【错误记录】映射文件发生改变

遇到映射文件发生改变在项目中有的地方是使用反射机制进行的操作&#xff0c;可能对于类进行了某些更改&#xff0c;科室映射文件没有更改&#xff0c;采用匿名就会出现这样的问题&#xff0c;解决办法要么更改映射文件&#xff0c;要不不要使用匿名调用。JavaDocs路径报红Clas…

ruoyi-vue-plus学习2(异步日志)(@EventListener)(@Async)(线程池池相关)

ruoyi-vue-plus的日志打印是通过监听器实现的&#xff0c;和原版若依稍稍不同 找到登录时记录日志的方法 该方法如下 这里的参数LogininforEvent为消息类&#xff0c;注意&#xff0c;貌似高版本的spring定义消息类不需要继承ApplicationEvent类也行。直接使用普通实体类就行…