018-从零搭建微服务-系统服务(五)
写在最前
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
源码地址(后端):https://gitee.com/csps/mingyue
源码地址(前端):https://gitee.com/csps/mingyue-ui
文档地址:https://gitee.com/csps/mingyue/wikis
前情回顾
之前我们设计了权限模型并提交了数据库脚本,然后通过 mingyue-common-gen
模块 MingYueCommonGenDemo
生成了基础代码,接下来我们需要提供两个关键接口:
- 获取用户权限信息;
- 获取用户路由信息;
TIPS
为了严格按照 RESTful 接口风格设计,变更现有接口命名: getSysUserInfoByUsername => userInfo
、getSysUsers => list
,后续接口也将严格按照 RESTful 接口风格设计。
登录缓存用户信息
Session 会话
Session 是会话中专业的数据缓存组件,通过 Session 我们可以很方便的缓存一些高频读写数据,提高程序性能,例如:
// 在登录时缓存 user 对象
StpUtil.getSession().set("user", user);// 然后我们就可以在任意处使用这个 user 对象
SysUser user = (SysUser) StpUtil.getSession().get("user");
在 Sa-Token 中,Session 分为三种,分别是:
Account-Session
: 指的是框架为每个账号 id 分配的 SessionToken-Session
: 指的是框架为每个 token 分配的 SessionCustom-Session
: 指的是以一个特定的值作为 SessionId,来分配的 Session
Token-Session
缓存用户信息
public static void login(SysUser userInfo) {// 请求作用域:存储的数据只在一次请求内有效,请求结束后数据自动清除。SaStorage storage = SaHolder.getStorage();storage.set(LOGIN_USER_KEY, userInfo);storage.set(USER_KEY, userInfo.getUserId());// 第1步,先登录上StpUtil.login(userInfo.getUserId());// 第3步,缓存用户信息StpUtil.getTokenSession().set(LOGIN_USER_KEY, userInfo);
}
获取用户信息
public static SysUser getLoginUser() {SysUser loginUser = (SysUser) SaHolder.getStorage().get(LOGIN_USER_KEY);if (loginUser != null) {return loginUser;}loginUser = (SysUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);return loginUser;
}
接口测试
@GetMapping("info")
@Operation(summary = "获取当前用户全部信息")
public R<SysUser> userInfo() {SysUser sysUser = LoginHelper.getLoginUser();System.out.println("=============================");System.out.println(JSONUtil.toJsonStr(sysUser));System.out.println("=============================");return R.ok(null);
}
接口调用打印如下:
=============================
{"userId":1,"username":"mingyue","nickname":"明月","sex":"0","password":"123456","phone":"13288888888","status":"0","isDeleted":"0","createTime":1689757582000,"updateTime":1689757585000,"createBy":"mingyue","updateBy":"mingyue"}
=============================
获取用户权限信息
接口层
@GetMapping("info")
@Operation(summary = "获取当前登录用户全部信息")
public R<UserInfoVo> userInfo() {return R.ok(sysUserService.getUserInfo());
}
业务层
@Override
public UserInfoVo getUserInfo() {UserInfoVo result = new UserInfoVo();SysUser sysUser = LoginHelper.getLoginUser();// 密码置空sysUser.setPassword(null);result.setSysUser(sysUser);// 设置角色列表Set<String> rolePermission = sysRoleService.getRolePermission(sysUser.getUserId());result.setRoles(rolePermission);// 设置权限列表Set<String> menuPermission = sysMenuService.getMenuPermission(sysUser.getUserId());result.setRoles(menuPermission);return result;
}
测试接口
Authorization Token 通过登录接口获取
curl -X 'GET' \
'http://mingyue-gateway:9100/system/sysUser/info' \
-H 'accept: */*' \
-H 'Authorization: vXPJnADIcTPfKuP3reBYmmUAi4xjw8nf'
接口返回
{"code": 200,"msg": "操作成功","data": {"sysUser": {"userId": 1,"username": "mingyue","nickname": "明月","sex": "0","password": null,"phone": "13288888888","email": null,"avatar": null,"status": "0","isDeleted": "0","createTime": "2023-07-19T17:06:22","updateTime": "2023-07-19T17:06:25","createBy": "mingyue","updateBy": "mingyue"},"permissions": null,"roles": [null,"system:user:list"]}
}
获取用户路由信息
接口层
@GetMapping("getRouters")
@Operation(summary = "获取路由信息")
public R<List<RouterVo>> getRouters() {Long userId = LoginHelper.getLoginUser().getUserId();return R.ok(sysMenuService.getRouters(userId));
}
业务层
@Override
public List<RouterVo> getRouters(Long userId) {List<SysMenu> sysMenus = sysMenuMapper.selectMenuTreeByUserId(userId);return this.recursionMenu(sysMenus, -1L);
}/*** 递归菜单,构建菜单树*/
private List<RouterVo> recursionMenu(List<SysMenu> sysMenus, Long pid) {List<RouterVo> tree = CollUtil.newArrayList();for (SysMenu menu : sysMenus) {if (menu.getParentId().equals(pid)) {RouterVo router = new RouterVo();router.setPath("/" + menu.getPath());router.setName(menu.getPath());router.setComponent(menu.getComponent());router.setRedirect(menu.getRedirect());MetaVo metaVo = new MetaVo();metaVo.setTitle(menu.getMenuName());metaVo.setIsLink(menu.getIsLink());metaVo.setIsHide(UserConstants.IS_HIDE.equals(menu.getIsHide()));metaVo.setIsKeepAlive(UserConstants.IS_KEEP_ALIVE.equals(menu.getIsKeepAlive()));metaVo.setIsAffix(UserConstants.IS_AFFIX.equals(menu.getIsAffix()));metaVo.setIsIframe(UserConstants.IS_IFRAME.equals(menu.getIsIframe()));metaVo.setIcon(menu.getIcon());router.setMeta(metaVo);router.setChildren(recursionMenu(sysMenus, menu.getMenuId()));tree.add(router);}}return tree;
}
测试接口
curl -X 'GET' \
'http://mingyue-gateway:9100/system/sysMenu/getRouters' \
-H 'accept: */*'
-H 'Authorization: vXPJnADIcTPfKuP3reBYmmUAi4xjw8nf'
接口返回
{"code": 200,"msg": "操作成功","data": [{"path": "/system","name": "system","component": null,"redirect": null,"meta": {"title": "系统管理","isLink": "0","isHide": false,"isKeepAlive": false,"isAffix": false,"isIframe": false,"icon": "iconfont icon-xitongshezhi"},"children": [{"path": "/user","name": "user","component": "/system/user","redirect": null,"meta": {"title": "用户管理","isLink": "0","isHide": false,"isKeepAlive": false,"isAffix": false,"isIframe": false,"icon": "iconfont icon-icon-"},"children": []},...]}]
}
小结
现在用户已经拿到权限点了,接下来整合一下权限点与 Sa-Token 的使用,看看 Sa-Token 如何通过权限点控制接口访问。
相关文章:
018-从零搭建微服务-系统服务(五)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…...

HarmonyOS 开发基础(三)登录页面单向数据绑定(父组件向子组件传参)
一、目录结构认识 开发软件目录截图部分文件夹说明 文件组织结构图 二、完成单向数据绑定 index.etx // 导出方式直接从文件夹 import MyInput from "../common/commons/myInput" Entry Component /* 组件可以基于struct实现,组件不能有继承关系&am…...

发npm包
重点文件 .github -> workflow -> .yml文件 发自己的包 新建dev分支,合并到master后自动执行 fork别人的包 fork -> base dev新建本地rebase-dev分支 -> 提交push后合并至dev -> dev合并至master后自动执行 值得注意的是,fork别人的…...
<el-empty>
<el-empty> 是 Element UI 框架中提供的一个组件,用于显示空状态的占位内容。Element UI 是一套基于 Vue.js 的组件库,用于构建响应式和易用的用户界面。 <el-empty> 组件在应用中常用于以下场景: 当数据为空时,可以…...

IO流(4)- 序列化流与反序列化流
目录 1. 序列化流与反序列化流的基本介绍 2. 序列化流的基本用法? 3. 序列化流的作用? 4. 反序列化流的基本用法? 5. 反序列化流的作用 6. 序列化流与反序列化流使用时需要注意的细节(非常重要) 6.1 被序列化的…...
人工智能如何应对 DevOps 监控和可观测性挑战
自 ChatGPT 横空出世之后,AIGC 已成为不可逆转的时代浪潮。在之前的文章中,我们介绍了DevOps 领域中AI的用例,需要回顾可以点击下方链接。在本篇文章中,我将简单聊聊人工智能(AI)如何通过分析日志和指标来预…...

数字化新时代,VR全景拍摄与制作
导语: 随着科技的飞速发展,数字化图片正在引领新的时代潮流。在这个数字化图片的新时代,VR全景拍摄与制作技术正以其独特的特点和无限的优势,成为数字影像领域的一颗璀璨明星。让我们深入了解VR全景拍摄与制作的特点和优势&#…...
uniapp 权限说明
android.permission.ACCESS_CHECKIN_PROPERTIES 访问登记属性 读取或写入登记check-in数据库属性表的权限 android.permission.ACCESS_COARSE_LOCATION 获取错略位置 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 android.permission.ACCESS…...

3D Web轻量化渲染开发工具HOOPS Communicator是什么?
HOOPS Communicator是Tech Soft 3D旗下的主流产品之一,具有强大的、专用的高性能图形内核,是一款专注于基于Web端的高级3D工程应用程序。由HOOPS Server和HOOPS Web Viewer两大部分组成,提供了HOOPS Convertrer、Data Authoring的模型转换和编…...

心法利器[93] | 谈校招:技术面
心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2022年新一版的文章合集已经发布,累计已经60w字了,获取方式看这里&…...

excel英语翻译让你的数据更容易被理解
从前有一个名叫小明的办公室职员,他每天都要处理大量的数据和报表。然而,由于工作需要,他经常收到来自不同国家的Excel表格,这些表格上的内容都是用各种各样的语言编写的,让他很难理解其中的意思。这时,小明…...
RK3588S之CPU--benchmark(二)
目录 一、引言 二、benchmark测试工具 ------>2.1、Geekbench ------------>2.1.1、下载移植 ------------>2.1.2、跑分结果 ------------>2.1.3、跑分榜 ------>2.2、Spec06 ------------>2.2.1、spec06介绍 ------------>2.2.2、下载移植(包含…...
入侵检查基础
一、结合以下问题对当天内容进行总结 1. 什么是IDS? 2. IDS和防火墙有什么不同? 3. IDS工作原理? 4. IDS的主要检测方法有哪些详细说明? 5. IDS的部署方式有哪些? 6. IDS的签名是什么意思?签名过滤器有什么…...

JAVA开发工具-maven的安装与配置(最新最详细教程)
引言 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具 软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较 高的可重用性,所以常常用两…...

linux系统编程重点复习--进程的控制
目录 1 复习目标 2 进程相关概念 2.2 并行和并发 2.3 PCB-进程控制块 2.4 进程状态(面试考) 3 创建进程 3.2 ps命令和kill命令 3.3 getpid/getppid 3.4 练习题 4 exec函数族 4.1 函数作用和函数介绍 4.1.1 execl函数 4.1.2 execlp函数 4.2 exec函数族原理介绍 4.3 …...

12-1_Qt 5.9 C++开发指南_自定义插件和库-自定义Widget组件(提升法(promotion)创建自定义定制化组件)
当UI设计器提供的界面组件不满足实际设计需求时,可以从 QWidget 继承自定义界面组件。 有两种方法使用自定义界面组件: 一种是提升法(promotion),例如在8.3 节将一个QGraphicsView组件提升为自定义的 QWGraphicsView 类,提升法用…...

【软件测试学习】—软件测试的基本认识(一)
【软件测试学习】—软件测试的基本认识(一) 文章目录 【软件测试学习】—软件测试的基本认识(一)一、什么是软件测试二、软件测试的目的三、测试的原则四、测试的标准五、测试的基本要求六、bug的由来七、测试的流程八、开发模式九…...
Unity AI项目笔记
一、创建虚拟环境 在开始进行Unity AI项目之前,首先需要设置一个适当的虚拟环境。以下步骤将会指导你如何创建: 下载Python 3.7。下载Anaconda 2020.11。可以在清华大学开源软件镜像站找到镜像资源:https://mirrors.tuna.tsinghua.edu.cn/a…...

如何在地图上寻找峨眉山零公里的龙洞湖
爬峨眉山的需要,住在零公里附近。 据说这附近有个好玩的地方叫龙洞湖,我们住得远,想步行去看看。拿出地图,搜龙洞湖,尴尬了。搜不到具体位置。细想,人家整个村就叫龙洞村,地图上居然没有标识&a…...

cloudstack平台host加入后,显示CPU speed为0GHz
一、环境说明 操作系统:openEuler 22.03CPU:Kunpeng-920,arm v8cloudstack:4.18libvirtd:6.2.0 二、问题描述 cloudstack平台初始化完成后,第一次加入host,系统虚拟机一直无法正常创建&#…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...