为智能查数补充提问历史的后端持久化(含创建时间、可清空),并完善前端历史展示、会话缓存与若干体验问题。 变更内容: - 新增 t_ai_sql_history 表(MySQL/SQLite 双脚本)与 AiSqlHistory 实体、Mapper、Service、VO,记录提问内容与创建时间 - AiSqlQueryServiceImpl 在查询成功后写入提问历史,新增 GET/DELETE /api/ai/sql/history 接口,支持按创建时间倒序查询与清空 - 前端历史改为后端持久化:卡片式列表、展示创建时间、搜索过滤、一键复制提问、点击回填重查与清空 - 新增会话缓存(sessionStorage):切走再回或刷新后恢复上次输入、结果与视图模式,结果超过 500 行时不缓存结果,登出时清除 体验修复: - 修复柱状图与饼图切换时旧 series/坐标轴残留(VChart 采用 notMerge) - 修复进入 /smart-query 时短暂误显示「AI 未启用」(新增 aiEnabledLoaded 加载态) - 引入 JetBrains Mono 字体并修复生成的 SQL 字体未生效(内部 code 元素继承父级字体) 依赖: - 新增前端依赖 @fontsource/jetbrains-mono 说明: - 历史表由 SchemaInitializer 启动时幂等创建,无需手工执行 SQL
51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
// 用户状态管理模块:管理用户的登录状态(token、昵称、用户ID)
|
|
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import { getUserInfo } from '../api/user'
|
|
import { readString, removeKey, removeSessionKey, writeString } from '../utils/storage'
|
|
import { STORAGE_KEYS } from '../utils/storageKeys'
|
|
|
|
/** 登录令牌存储键(认证凭据,不属于界面偏好,不纳入 ledgerly. 前缀) */
|
|
const TOKEN_KEY = 'token'
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
// 从 localStorage 恢复 token,若不存在则为空字符串
|
|
const token = ref(readString(TOKEN_KEY))
|
|
const nickname = ref('') // 用户昵称
|
|
const userId = ref<number | null>(null) // 用户 ID
|
|
|
|
/** 设置 token 并持久化到 localStorage */
|
|
function setToken(t: string) {
|
|
token.value = t
|
|
writeString(TOKEN_KEY, t)
|
|
}
|
|
|
|
/** 设置用户基本信息(昵称和 ID) */
|
|
function setUserInfo(nick: string, id: number) {
|
|
nickname.value = nick
|
|
userId.value = id
|
|
}
|
|
|
|
/** 从后端获取当前登录用户的信息 */
|
|
async function fetchUserInfo() {
|
|
try {
|
|
const res: any = await getUserInfo()
|
|
setUserInfo(res.data.nickname, res.data.id)
|
|
} catch (e) {
|
|
console.error('获取用户信息失败', e)
|
|
}
|
|
}
|
|
|
|
/** 退出登录:清空状态并移除 localStorage 中的 token */
|
|
function logout() {
|
|
token.value = ''
|
|
nickname.value = ''
|
|
userId.value = null
|
|
removeKey(TOKEN_KEY)
|
|
// 清除智能查数上一次查询会话,避免同标签切换账号后看到上一用户的数据
|
|
removeSessionKey(STORAGE_KEYS.sqlQuerySession)
|
|
}
|
|
|
|
return { token, nickname, userId, setToken, setUserInfo, fetchUserInfo, logout }
|
|
})
|