|
|
@@ -0,0 +1,66 @@
|
|
|
+/**
|
|
|
+ * 「所属机构」列表的持久化镜像(localStorage)
|
|
|
+ *
|
|
|
+ * 背景:
|
|
|
+ * 「所属机构」下拉的数据源是 user.info.loginChangeGroupVOList,由 vuex-persistedstate
|
|
|
+ * 写入 **sessionStorage**(key: 乾坤 `vuex-hr` / 独立 `private-vuex-hr`,标签独占)。
|
|
|
+ * 而 token / currentUser 在「记住我」(默认勾选)时落在 **localStorage**(跨标签持久)。
|
|
|
+ * 两者生命周期不一致 → 新开标签页、或把 URL 直接粘到新标签时,会出现
|
|
|
+ * 「已登录(token 还在)但机构列表为空」的半登录态:页面机构下拉只能回落到
|
|
|
+ * currentGroupId 单项,表现为「机构只剩 1 个」。
|
|
|
+ *
|
|
|
+ * 且路由守卫里的 fetchUserInfo() 只拉资源树菜单,**不会补拉 loginChangeGroupVOList**,
|
|
|
+ * 列表一旦为空就一直空到重新登录。
|
|
|
+ *
|
|
|
+ * 策略(针对性补齐,不改变现有 sessionStorage 行为):
|
|
|
+ * 1. 每次 user/setUserInfo 时,把机构列表额外落一份 localStorage 镜像;
|
|
|
+ * 2. 读取端(utils/current-org.js)在 sessionStorage 缺失时用镜像兜底;
|
|
|
+ * 3. 登出时清除镜像(utils/page-tab-util.js 的 logout)。
|
|
|
+ *
|
|
|
+ * 注意:这不是「默认机构」逻辑,也不改变机构取值口径(仍取列表第 1 条);
|
|
|
+ * 只是保证「只要登录态还在,机构列表就在」。
|
|
|
+ */
|
|
|
+
|
|
|
+/** 镜像存储键(专用,避免与门户/其他系统的 localStorage 键冲突) */
|
|
|
+const STORE_KEY = 'hr-login-orgs';
|
|
|
+
|
|
|
+/**
|
|
|
+ * 写入机构列表镜像
|
|
|
+ * @param {object} info 登录用户信息(含 loginChangeGroupVOList)
|
|
|
+ */
|
|
|
+export function saveLoginOrgs(info) {
|
|
|
+ const list = info && info.loginChangeGroupVOList;
|
|
|
+ if (!Array.isArray(list) || !list.length) return;
|
|
|
+ try {
|
|
|
+ localStorage.setItem(
|
|
|
+ STORE_KEY,
|
|
|
+ JSON.stringify({ loginChangeGroupVOList: list }),
|
|
|
+ );
|
|
|
+ } catch (error) {
|
|
|
+ // 隐私模式 / 存储配额满:镜像写不进去不影响主流程
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 读取机构列表镜像
|
|
|
+ * @returns {Array} loginChangeGroupVOList 原始结构;没有则空数组
|
|
|
+ */
|
|
|
+export function readLoginOrgs() {
|
|
|
+ try {
|
|
|
+ const raw = localStorage.getItem(STORE_KEY);
|
|
|
+ if (!raw) return [];
|
|
|
+ const list = JSON.parse(raw)?.loginChangeGroupVOList;
|
|
|
+ return Array.isArray(list) ? list : [];
|
|
|
+ } catch (error) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/** 清除机构列表镜像(登出时调用) */
|
|
|
+export function clearLoginOrgs() {
|
|
|
+ try {
|
|
|
+ localStorage.removeItem(STORE_KEY);
|
|
|
+ } catch (error) {
|
|
|
+ // 忽略:清不掉也不影响登出
|
|
|
+ }
|
|
|
+}
|