同步代码
This commit is contained in:
135
Cunkebao/src/store/module/app.ts
Normal file
135
Cunkebao/src/store/module/app.ts
Normal file
@@ -0,0 +1,135 @@
|
||||
import { createPersistStore } from "@/store/createPersistStore";
|
||||
|
||||
export interface AppState {
|
||||
// 应用状态
|
||||
isLoading: boolean;
|
||||
isOnline: boolean;
|
||||
lastActiveTime: number;
|
||||
|
||||
// 主题设置
|
||||
theme: "light" | "dark" | "auto";
|
||||
|
||||
// 缓存设置
|
||||
cacheEnabled: boolean;
|
||||
cacheExpiry: number; // 缓存过期时间(毫秒)
|
||||
|
||||
// 调试设置
|
||||
debugMode: boolean;
|
||||
logLevel: "error" | "warn" | "info" | "debug";
|
||||
}
|
||||
|
||||
interface AppStoreState {
|
||||
app: AppState;
|
||||
setAppState: (app: Partial<AppState>) => void;
|
||||
setLoading: (loading: boolean) => void;
|
||||
setOnline: (online: boolean) => void;
|
||||
setTheme: (theme: AppState["theme"]) => void;
|
||||
setDebugMode: (debug: boolean) => void;
|
||||
updateLastActiveTime: () => void;
|
||||
resetAppState: () => void;
|
||||
}
|
||||
|
||||
// 默认应用状态
|
||||
const defaultAppState: AppState = {
|
||||
isLoading: false,
|
||||
isOnline: navigator.onLine,
|
||||
lastActiveTime: Date.now(),
|
||||
theme: "auto",
|
||||
cacheEnabled: true,
|
||||
cacheExpiry: 24 * 60 * 60 * 1000, // 24小时
|
||||
debugMode: false,
|
||||
logLevel: "info",
|
||||
};
|
||||
|
||||
export const useAppStore = createPersistStore<AppStoreState>(
|
||||
(set, get) => ({
|
||||
app: defaultAppState,
|
||||
|
||||
setAppState: newAppState =>
|
||||
set(state => ({
|
||||
app: { ...state.app, ...newAppState },
|
||||
})),
|
||||
|
||||
setLoading: loading =>
|
||||
set(state => ({
|
||||
app: { ...state.app, isLoading: loading },
|
||||
})),
|
||||
|
||||
setOnline: online =>
|
||||
set(state => ({
|
||||
app: { ...state.app, isOnline: online },
|
||||
})),
|
||||
|
||||
setTheme: theme =>
|
||||
set(state => ({
|
||||
app: { ...state.app, theme },
|
||||
})),
|
||||
|
||||
setDebugMode: debug =>
|
||||
set(state => ({
|
||||
app: { ...state.app, debugMode: debug },
|
||||
})),
|
||||
|
||||
updateLastActiveTime: () =>
|
||||
set(state => ({
|
||||
app: { ...state.app, lastActiveTime: Date.now() },
|
||||
})),
|
||||
|
||||
resetAppState: () => set({ app: defaultAppState }),
|
||||
}),
|
||||
{
|
||||
name: "app-store",
|
||||
partialize: state => ({
|
||||
app: state.app,
|
||||
}),
|
||||
onRehydrateStorage: () => state => {
|
||||
console.log("App store hydrated:", state);
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
// 应用状态工具函数
|
||||
export const getAppState = (): AppState => {
|
||||
const { app } = useAppStore.getState();
|
||||
return app;
|
||||
};
|
||||
|
||||
export const setAppLoading = (loading: boolean): void => {
|
||||
const { setLoading } = useAppStore.getState();
|
||||
setLoading(loading);
|
||||
};
|
||||
|
||||
export const setAppTheme = (theme: AppState["theme"]): void => {
|
||||
const { setTheme } = useAppStore.getState();
|
||||
setTheme(theme);
|
||||
};
|
||||
|
||||
export const toggleDebugMode = (): void => {
|
||||
const { app, setDebugMode } = useAppStore.getState();
|
||||
setDebugMode(!app.debugMode);
|
||||
};
|
||||
|
||||
// 监听网络状态变化
|
||||
if (typeof window !== "undefined") {
|
||||
window.addEventListener("online", () => {
|
||||
const { setOnline } = useAppStore.getState();
|
||||
setOnline(true);
|
||||
});
|
||||
|
||||
window.addEventListener("offline", () => {
|
||||
const { setOnline } = useAppStore.getState();
|
||||
setOnline(false);
|
||||
});
|
||||
|
||||
// 监听用户活动
|
||||
const updateLastActive = () => {
|
||||
const { updateLastActiveTime } = useAppStore.getState();
|
||||
updateLastActiveTime();
|
||||
};
|
||||
|
||||
["mousedown", "mousemove", "keypress", "scroll", "touchstart"].forEach(
|
||||
event => {
|
||||
document.addEventListener(event, updateLastActive, true);
|
||||
},
|
||||
);
|
||||
}
|
||||
71
Cunkebao/src/store/module/settings.ts
Normal file
71
Cunkebao/src/store/module/settings.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { createPersistStore } from "@/store/createPersistStore";
|
||||
|
||||
export interface AppSettings {
|
||||
paddingTop: number;
|
||||
appId: string;
|
||||
appName: string;
|
||||
appVersion: string;
|
||||
isAppMode: boolean;
|
||||
}
|
||||
|
||||
interface SettingsState {
|
||||
settings: AppSettings;
|
||||
setSettings: (settings: Partial<AppSettings>) => void;
|
||||
resetSettings: () => void;
|
||||
updateSetting: <K extends keyof AppSettings>(
|
||||
key: K,
|
||||
value: AppSettings[K],
|
||||
) => void;
|
||||
}
|
||||
|
||||
// 默认设置
|
||||
const defaultSettings: AppSettings = {
|
||||
paddingTop: 0,
|
||||
appId: "",
|
||||
appName: "",
|
||||
appVersion: "",
|
||||
isAppMode: false,
|
||||
};
|
||||
|
||||
export const useSettingsStore = createPersistStore<SettingsState>(
|
||||
set => ({
|
||||
settings: defaultSettings,
|
||||
|
||||
setSettings: newSettings =>
|
||||
set(state => ({
|
||||
settings: { ...state.settings, ...newSettings },
|
||||
})),
|
||||
|
||||
resetSettings: () => set({ settings: defaultSettings }),
|
||||
|
||||
updateSetting: (key, value) =>
|
||||
set(state => ({
|
||||
settings: { ...state.settings, [key]: value },
|
||||
})),
|
||||
}),
|
||||
{
|
||||
name: "settings-store",
|
||||
partialize: state => ({
|
||||
settings: state.settings,
|
||||
}),
|
||||
onRehydrateStorage: () => state => {
|
||||
// console.log("Settings store hydrated:", state);
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
// 设置工具函数
|
||||
export const getSetting = <K extends keyof AppSettings>(
|
||||
key: K,
|
||||
): AppSettings[K] => {
|
||||
const { settings } = useSettingsStore.getState();
|
||||
return settings[key];
|
||||
};
|
||||
|
||||
export const setSetting = <K extends keyof AppSettings>(
|
||||
key: K,
|
||||
value: AppSettings[K],
|
||||
) => {
|
||||
const { updateSetting } = useSettingsStore.getState();
|
||||
updateSetting(key, value);
|
||||
};
|
||||
92
Cunkebao/src/store/module/user.ts
Normal file
92
Cunkebao/src/store/module/user.ts
Normal file
@@ -0,0 +1,92 @@
|
||||
import { createPersistStore } from "@/store/createPersistStore";
|
||||
import { Toast } from "antd-mobile";
|
||||
|
||||
export interface User {
|
||||
id: number;
|
||||
account: string;
|
||||
username: string;
|
||||
phone: string;
|
||||
avatar: string;
|
||||
isAdmin: number;
|
||||
companyId: number;
|
||||
typeId: number;
|
||||
status: number;
|
||||
s2_accountId: string;
|
||||
createTime: string;
|
||||
updateTime: string | null;
|
||||
lastLoginIp: string;
|
||||
lastLoginTime: number;
|
||||
deviceTotal: number; // 设备总数
|
||||
}
|
||||
|
||||
interface UserState {
|
||||
user: User | null;
|
||||
token: string | null;
|
||||
isLoggedIn: boolean;
|
||||
setUser: (user: User) => void;
|
||||
setToken: (token: string) => void;
|
||||
clearUser: () => void;
|
||||
login: (token: string, userInfo: User, deviceTotal: number) => void;
|
||||
logout: () => void;
|
||||
}
|
||||
|
||||
export const useUserStore = createPersistStore<UserState>(
|
||||
set => ({
|
||||
user: null,
|
||||
token: null,
|
||||
isLoggedIn: false,
|
||||
setUser: user => set({ user, isLoggedIn: true }),
|
||||
setToken: token => set({ token }),
|
||||
clearUser: () => set({ user: null, token: null, isLoggedIn: false }),
|
||||
login: (token, userInfo, deviceTotal) => {
|
||||
// 只将token存储到localStorage
|
||||
localStorage.setItem("token", token);
|
||||
|
||||
// 用户信息存储在状态管理中
|
||||
const user: User = {
|
||||
id: userInfo.id,
|
||||
account: userInfo.account,
|
||||
username: userInfo.username,
|
||||
phone: userInfo.phone,
|
||||
avatar: userInfo.avatar,
|
||||
isAdmin: userInfo.isAdmin,
|
||||
companyId: userInfo.companyId,
|
||||
typeId: userInfo.typeId,
|
||||
status: userInfo.status,
|
||||
s2_accountId: userInfo.s2_accountId,
|
||||
createTime: userInfo.createTime,
|
||||
updateTime: userInfo.updateTime,
|
||||
lastLoginIp: userInfo.lastLoginIp,
|
||||
lastLoginTime: userInfo.lastLoginTime,
|
||||
deviceTotal: deviceTotal,
|
||||
};
|
||||
set({ user, token, isLoggedIn: true });
|
||||
|
||||
Toast.show({ content: "登录成功", position: "top" });
|
||||
|
||||
// 根据设备数量判断跳转
|
||||
if (deviceTotal > 0) {
|
||||
window.location.href = "/";
|
||||
} else {
|
||||
// 没有设备,跳转到引导页面
|
||||
window.location.href = "/guide";
|
||||
}
|
||||
},
|
||||
logout: () => {
|
||||
// 清除localStorage中的token
|
||||
localStorage.removeItem("token");
|
||||
set({ user: null, token: null, isLoggedIn: false });
|
||||
},
|
||||
}),
|
||||
{
|
||||
name: "user-store",
|
||||
partialize: state => ({
|
||||
user: state.user,
|
||||
token: state.token,
|
||||
isLoggedIn: state.isLoggedIn,
|
||||
}),
|
||||
onRehydrateStorage: () => state => {
|
||||
// console.log("User store hydrated:", state);
|
||||
},
|
||||
},
|
||||
);
|
||||
Reference in New Issue
Block a user