多租户平台前端存储结构的选择
下图来源于cookie、localStorage 和 sessionStorage的区别及应用实例

既然localstorage无有效期,关闭浏览器还存在,那么用来存储用户的身份信息并不是太合适,先看一下B站中localstorage都存在了啥,原来把我搜索的记录都存在了下来。

因此用户登录之后的token信息,我还是存在cookie中,虽然后台还是会为token设置超时时间。

之前参考了一个网站,将菜单和权限存储在localstorage中,除非他很少变动。
多租户模式下,一个人可以拥有多个账套,打开不同页签,操作不同账套的数据,从上图看,应该存储在sessionStorage,例如
当前账套ID是16

看看http请求参数,与sessionStorage中存储的账套ID一致。
接着看另外一个账套

另外一个账套请求参数如下,与账套信息是匹配的

因此知道了,SaaS之类平台,租户信息应该存储在sessionStorage中,这样可以让用户操作不同账套,数据还不会错乱。
接下来再看状态管理pinia,状态数据是存储在内存中,当你在页面使用鼠标邮件刷新,这个数据就会消失。

赋值是下面的方式,这种方式,在页面刷新的时候,就会丢失。

pinia有持久化解决方案,Pinia学习-存储数据、修改数据以及持久化实现,不过写一个通用的存储模板后,不一定非得要这样一个组件,因为既然选择有一定周期的存储,一定是因为业务,既然业务存在,那么应该掌握好数据的生存周期,所以我的经验告诉我,我应该自行设置。
接下来附带了统一数据存取风格的代码
/* localStorage */
tool.local = {set(key, data, datetime = 0) {//加密if(sysConfig.LS_ENCRYPTION == "AES"){data = tool.crypto.AES.encrypt(JSON.stringify(data), sysConfig.LS_ENCRYPTION_key)}let cacheValue = {content: data,datetime: parseInt(datetime) === 0 ? 0 : new Date().getTime() + parseInt(datetime) * 1000}return localStorage.setItem(key, JSON.stringify(cacheValue))},get(key) {try {const value = JSON.parse(localStorage.getItem(key))if (value) {let nowTime = new Date().getTime()if (nowTime > value.datetime && value.datetime != 0) {localStorage.removeItem(key)return null;}//解密if(sysConfig.LS_ENCRYPTION == "AES"){value.content = JSON.parse(tool.crypto.AES.decrypt(value.content, sysConfig.LS_ENCRYPTION_key))}return value.content}return null} catch (err) {return null}},remove(key) {return localStorage.removeItem(key)},clear() {return localStorage.clear()}
}/*sessionStorage*/
tool.session = {set(table, settings) {var _set = JSON.stringify(settings)return sessionStorage.setItem(table, _set);},get(table) {var data = sessionStorage.getItem(table);try {data = JSON.parse(data)} catch (err) {return null}return data;},remove(table) {return sessionStorage.removeItem(table);},clear() {return sessionStorage.clear();}
}/*cookie*/
tool.cookie = {set(name, value, config={}) {var cfg = {expires: null,path: null,domain: null,secure: false,httpOnly: false,...config}var cookieStr = `${name}=${escape(value)}`if(cfg.expires){var exp = new Date()exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000)cookieStr += `;expires=${exp.toGMTString()}`}if(cfg.path){cookieStr += `;path=${cfg.path}`}if(cfg.domain){cookieStr += `;domain=${cfg.domain}`}document.cookie = cookieStr},get(name){var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"))if(arr != null){return unescape(arr[2])}else{return null}},remove(name){var exp = new Date()exp.setTime(exp.getTime() - 1)document.cookie = `${name}=;expires=${exp.toGMTString()}`}
}
相关文章:
多租户平台前端存储结构的选择
下图来源于cookie、localStorage 和 sessionStorage的区别及应用实例 既然localstorage无有效期,关闭浏览器还存在,那么用来存储用户的身份信息并不是太合适,先看一下B站中localstorage都存在了啥,原来把我搜索的记录都存在了下来…...
C++11 新特性:常量表达式 constexpr(下)
接上篇文章,继续说说常量表达式 constexpr 在模板编程中的使用场景。 constexpr 用于模板编程 在模板编程中,constexpr 的应用非常广泛,主要是因为它能够在编译时进行计算,这对于模板元编程、编译时断言、模板特化选择等场合尤为…...
大数据开发--02.环境准备
一.准备三台linux虚拟机 1.分别取名node1,node2,node3 2.配置静态ip 这里以node1为例,配置静态ip地址,其他node2.node3一样 配置完成之后别忘记 systemctl restart network 3.在各自的/etc/hosts文件中编辑三个Ip地址 三台都要配置, 4.然…...
选择word中的表格VBA
打开开发工具 选择Visual Basic插入代码 Sub 选择word中的表格() Dim t As Table an MsgBox("即将选择选区内所有表格,若无选区,则选择全文表格。", vbYesNo, "提示") If an - 6 Then Exit Sub Set rg IIf(Selection.Type wdSel…...
开放签开源电子签章白皮书-简版
开放签开源电子签章白皮书-简版 一、摘要: 开放签电子签章团队源自于电子合同SaaS公司,立志于通过开源、开放的模式,结合团队十多年的行业经验,将电子签章产品更简单、更低门槛的推广到各行各业中。让电子签章应用更简单&#x…...
uniapp、vue2.6、H5,利用腾讯TRTC,快速跑通1v1视频功能
多人视频聊天室搭建,官网已有相关demo和案例,需要快速搭建多人聊天室直接进入以下网站: 实时音视频 Web & H5 (Vue2/Vue3)-视频通话(含 UI)-文档中心-腾讯云说明:https://cloud.tencent.com/document/…...
Spring Data访问Elasticsearch----查询方法
Spring Data访问Elasticsearch----查询方法 一、查询lookup策略1.1 声明的查询 二、创建查询三、方法返回类型四、使用Query注解 一、查询lookup策略 Elasticsearch模块支持所有基本的查询构建功能,如字符串查询、native搜索查询、基于条件的查询和从方法名派生的查…...
PyTorch 深度学习(GPT 重译)(四)
第二部分:从现实世界的图像中学习:肺癌的早期检测 第 2 部分的结构与第 1 部分不同;它几乎是一本书中的一本书。我们将以几章的篇幅深入探讨一个单一用例,从第 1 部分学到的基本构建模块开始,构建一个比我们迄今为止看…...
视频无水印批量下载软件|抖音视频提取工具
视频无水印批量下载软件 在当今社交媒体充斥着大量优质视频内容的时代,很多用户都希望能够轻松下载自己喜爱的视频进行收藏或分享。为了满足用户的需求,我们特别推出了一款专业的视频无水印批量下载软件,让您可以方便快捷地获取喜爱的视频内容…...
【linux】环境基础|开发工具|gcc|yum|vim|gdb|make|git
目录 编辑 Linux 软件包管理器 yum 软件包: 操作: 拓展:lrzsz简介 Linux开发工具 Linux编辑器-vim使用 vim 的基本概念 命令模式 插入模式 底行模式 vim 命令模式的操作指令 vim 底行模式的操作命令 Linux编译器-gcc/g使用 功能 格…...
小程序中实现轮播图左向堆叠
1、效果图: 轮播图左向堆叠 2、封装的组件: my-swiper.wxml <view><view class"tower-swiper" bindtouchend"TowerEnd"><view class"tower-item" wx:for"{{swiperList}}" wx:key"index&q…...
零基础入门数据挖掘系列之「建模调参」
摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型;如何进行交叉验证;如何调节参数优化等。 建模调参:特征工程也好,数据清洗也罢,都是…...
如何在Mac中删除照片?这里有详细步骤
前言 本文介绍如何从Mac中删除照片,以释放硬盘空间或更好地组织文件和文件夹。 如何使用废纸篓删除Mac上的图片 在Mac上删除图片的最简单方法之一是使用废纸篓功能。学习只需几秒钟。下面是如何删除单个图片以及如何在Mac上删除多个图片,以及一些关键和有用的提示,以使该…...
Qt笔记 事件处理_鼠标事件
什么是事件? 点击鼠标左键,双击鼠标左键,鼠标来回移动,按下键盘按钮,这些都是事件。 那么事件的响应机制是什么样的呢? 首先main函数中有一个QApplication,其作用是创建一个应用程序对象&…...
【Vue】三、使用ElementUI实现图片上传
目录 一、前端代码实现 二、后端代码实现 三、调试效果实现 一、前端代码实现 废话不多说直接上代码 <el-form-item prop"image" label"上传图片" v-model"form.image"><el-upload:action"http://localhost:8…...
ffmpeg的ffprobe.exe查询修改视频信息
# 查询视频信息 ffprobe -i 1.mp4Input #0, mov,mp4,m4a,3gp,3g2,mj2, from video.mp4:Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2avc1mp41encoder : Lavf58.20.100comment : 123654Duration: 00:00:15.21, start: 0.0…...
Windows 2019服务器上安装NFS服务器
提供NFS服务服务器: Windows 2019服务器上安装NFS服务器资源管理器 创建目录比如D:\nfshare, 鼠标邮件菜单 点击 属性,进行NFS共享 使用NFS服务的客户端: 另外一台Windows服务器,需要安装NFS客户端 具体操作:Window…...
元素定位之xpath和css
元素定位 xpath绝对路径相对路径案例xpath策略(路径)案例xpath策略(层级、扩展)属性层级与属性层级与属性拓展层级与属性综合 csscss选择器(id、类、标签、属性)id选择器类选择器标签选择器属性选择器案例-…...
JavaScript 什么是纯函数,有哪些常见的纯函数
什么是纯函数 纯函数是指那些不依赖于外部状态,也不改变外部状态的函数。在JavaScript中,纯函数的返回值仅由其输入参数决定,而且执行纯函数不会产生副作用,比如修改全局变量或修改传入的参数。 常见的纯函数 JavaScript中一些常…...
c++ 指针大小
C的一个指针占内存几个字节? 结论: 取决于是64位编译模式还是32位编译模式(注意,和机器位数没有直接关系) 在64位编译模式下,指针的占用内存大小是8字节在32位编译模式下,指针占用内存大小是4字…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
