117 lines
3.3 KiB
TypeScript
117 lines
3.3 KiB
TypeScript
// app/stores/settings.ts - 用户自定义配置和系统配置状态管理
|
|
import { defineStore } from "pinia";
|
|
import { toast } from "vue-sonner";
|
|
|
|
import type {
|
|
ISystemConfigPublic,
|
|
ISystemConfigUpdateRequest,
|
|
IUserSettings,
|
|
IUserSettingsUpdateRequest
|
|
} from "@/interfaces";
|
|
import { SettingsService } from "@/services/settings_service";
|
|
|
|
const getApiErrorMessage = (error: unknown, fallback: string) => {
|
|
const data = (error as { data?: { msg?: string } })?.data;
|
|
return data?.msg || fallback;
|
|
};
|
|
|
|
export const useSettingsStore = defineStore("settings", () => {
|
|
/** 用户自定义配置,null 表示尚未加载 */
|
|
const userSettings = ref<IUserSettings | null>(null);
|
|
/** 系统配置(仅 superadmin),null 表示尚未加载或无权限 */
|
|
const systemConfig = ref<ISystemConfigPublic | null>(null);
|
|
/** 加载/保存中状态 */
|
|
const userLoading = ref(false); // 仅用于保存
|
|
const userFetching = ref(false); // 仅用于 GET 拉取
|
|
const sysLoading = ref(false);
|
|
const sysFetching = ref(false);
|
|
|
|
/** 拉取当前用户的自定义配置 */
|
|
const fetchUserSettings = async () => {
|
|
userFetching.value = true;
|
|
try {
|
|
const res = await SettingsService.getUserSettings();
|
|
if (res.data.code === 0 && res.data.data) {
|
|
userSettings.value = res.data.data;
|
|
}
|
|
} catch {
|
|
// 静默失败,不影响主功能
|
|
} finally {
|
|
userFetching.value = false;
|
|
}
|
|
};
|
|
|
|
/** 保存用户自定义配置 */
|
|
const updateUserSettings = async (
|
|
req: IUserSettingsUpdateRequest
|
|
): Promise<boolean> => {
|
|
userLoading.value = true;
|
|
try {
|
|
const res = await SettingsService.updateUserSettings(req);
|
|
const data = res.data;
|
|
if (data.code === 0) {
|
|
await fetchUserSettings();
|
|
toast.success("配置已保存");
|
|
return true;
|
|
}
|
|
toast.error(data.msg || "保存失败");
|
|
return false;
|
|
} catch (error) {
|
|
toast.error(getApiErrorMessage(error, "保存失败,请重试"));
|
|
return false;
|
|
} finally {
|
|
userLoading.value = false;
|
|
}
|
|
};
|
|
|
|
/** 拉取系统配置(仅 superadmin 调用此方法) */
|
|
const fetchSystemConfig = async () => {
|
|
sysFetching.value = true;
|
|
try {
|
|
const res = await SettingsService.getSystemConfig();
|
|
if (res.data.code === 0 && res.data.data) {
|
|
systemConfig.value = res.data.data;
|
|
}
|
|
} catch {
|
|
// 无权限或其他错误,静默处理
|
|
} finally {
|
|
sysFetching.value = false;
|
|
}
|
|
};
|
|
|
|
/** 保存系统配置(仅 superadmin 调用) */
|
|
const updateSystemConfig = async (
|
|
req: ISystemConfigUpdateRequest
|
|
): Promise<boolean> => {
|
|
sysLoading.value = true;
|
|
try {
|
|
const res = await SettingsService.updateSystemConfig(req);
|
|
if (res.data.code === 0) {
|
|
toast.success("系统配置已更新");
|
|
await fetchSystemConfig();
|
|
return true;
|
|
}
|
|
toast.error(res.data.msg || "更新失败");
|
|
return false;
|
|
} catch (error) {
|
|
toast.error(getApiErrorMessage(error, "更新失败,请重试"));
|
|
return false;
|
|
} finally {
|
|
sysLoading.value = false;
|
|
}
|
|
};
|
|
|
|
return {
|
|
userSettings,
|
|
systemConfig,
|
|
userLoading,
|
|
userFetching,
|
|
sysLoading,
|
|
sysFetching,
|
|
fetchUserSettings,
|
|
updateUserSettings,
|
|
fetchSystemConfig,
|
|
updateSystemConfig
|
|
};
|
|
});
|