## Home 模块三栏 VCHSM 重组
- 按渲染归属重新分配文件:ModelSelector/TaskHistory → left/,ModelInputForm/widgets → center/,OutputPreview → right/
- BannerCarousel 移至 shared/views/(全局组件)
- controls/ → widgets/ 重命名,消除与 controllers/ 的命名歧义
- 新增 barrel 文件(left/center/right/shared 各级 index.ts)
## Services 层迁回 src/services/modules/
- 全部 API 类型定义与请求函数从 modules/*/controllers/ 迁回 services/modules/{domain}/
- 恢复原始文件名(model-api.ts → models.ts,task-api.ts → task.ts 等)
- 新增 domain 子文件夹(home/auth/announcement/account)
- 更新全局 ~70 处导入路径
## TaskHistory 提取 Controller + Hook 层
- 新建 left/controllers/task-table-config.ts(常量 + 纯工具函数,零 React 依赖)
- 新建 left/hooks/useTaskTable.tsx(状态管理 + 数据获取 + 列定义 + 滚动同步)
- TaskHistory.tsx 从 915 行精简为 265 行纯视图
## 右键菜单体系完善
- 共享 <ContextMenu> 组件(antd Dropdown 封装,防 Select 冲突)
- 四组菜单定义:任务列表 / 文本输入 / 媒体参考 / 预览区域
- 统一的 ContextMenuItems → AntD MenuProps 转换
## 公告功能修复
- useAnnouncements 增加 isLoggedIn 登录门控,避免未登录时 401 双重请求
- 抽屉打开时触发 refetch(),确保拿到最新数据
Co-Authored-By: Claude <noreply@anthropic.com>
85 lines
2.5 KiB
TypeScript
85 lines
2.5 KiB
TypeScript
// ============================================================
|
||
// auth-persistence — 本地认证偏好持久化(记住账号 / 自动登录)
|
||
//
|
||
// 职责:
|
||
// - 存储/读取登录表单偏好(用户名回填、记住密码、自动登录标记)
|
||
// - 纯 localStorage 操作,不依赖 React
|
||
// - 密码从不持久化(安全性由 JWT + safeStorage 保障)
|
||
//
|
||
// 与 auth-token.ts 的分工:
|
||
// auth-token.ts → JWT token 生命周期(refresh/access,safeStorage 加密)
|
||
// auth-persistence.ts → 登录表单偏好(localStorage 明文,仅用户名/标记)
|
||
// ============================================================ */
|
||
|
||
const STORAGE_KEY = 'ele-heixiu-auth';
|
||
|
||
interface StoredAuth {
|
||
/** 上次登录的用户名(表单回填用) */
|
||
username: string;
|
||
/** 是否记住用户名(勾选后表单自动回填用户名) */
|
||
remember: boolean;
|
||
/** 是否勾选了自动登录(AppProvider 据此决定启动时是否刷新 token) */
|
||
autoLogin: boolean;
|
||
}
|
||
|
||
function readAuth(): StoredAuth | null {
|
||
try {
|
||
const raw = localStorage.getItem(STORAGE_KEY);
|
||
if (!raw) return null;
|
||
return JSON.parse(raw) as StoredAuth;
|
||
} catch {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
function writeAuth(auth: StoredAuth): void {
|
||
try {
|
||
localStorage.setItem(STORAGE_KEY, JSON.stringify(auth));
|
||
} catch {
|
||
/* 静默 */
|
||
}
|
||
}
|
||
|
||
// ---------- 公共 API ----------
|
||
|
||
/** 读取自动登录标记(AppProvider 启动时调用) */
|
||
export function getAutoLoginFlag(): boolean {
|
||
return readAuth()?.autoLogin || false;
|
||
}
|
||
|
||
/** 仅清除自动登录标记(保留用户名,下次还能回填表单) */
|
||
export function clearAutoLoginFlag(): void {
|
||
const auth = readAuth();
|
||
if (!auth) return;
|
||
writeAuth({ ...auth, autoLogin: false });
|
||
}
|
||
|
||
/** 清除所有保存的认证偏好 */
|
||
export function clearSavedAuth(): void {
|
||
try {
|
||
localStorage.removeItem(STORAGE_KEY);
|
||
} catch {
|
||
/* 静默 */
|
||
}
|
||
}
|
||
|
||
/** 保存认证偏好(登录成功时调用) */
|
||
export function saveAuth(username: string, remember: boolean, autoLogin: boolean): void {
|
||
writeAuth({ username, remember, autoLogin });
|
||
}
|
||
|
||
/** 读取已保存的用户名(表单回填用) */
|
||
export function getSavedUsername(): string {
|
||
return readAuth()?.username || '';
|
||
}
|
||
|
||
/** 读取记住密码标记 */
|
||
export function getSavedRemember(): boolean {
|
||
return readAuth()?.remember || false;
|
||
}
|
||
|
||
/** 读取自动登录标记 */
|
||
export function getSavedAutoLogin(): boolean {
|
||
return readAuth()?.autoLogin || false;
|
||
}
|