diff --git a/src/store/modules/auth.js b/src/store/modules/auth.js
new file mode 100644
index 0000000..69efc6b
--- /dev/null
+++ b/src/store/modules/auth.js
@@ -0,0 +1,210 @@
+import { authApi } from '@/api/auth'
+import { ElMessage } from 'element-plus'
+
+const state = {
+  // 登录状态
+  isLoggedIn: false,
+  // 用户信息
+  userInfo: null,
+  // Token信息
+  token: null,
+  // 登录加载状态
+  loginLoading: false
+}
+
+const getters = {
+  // 是否已登录
+  isAuthenticated: state => state.isLoggedIn,
+  // 获取用户信息
+  userInfo: state => state.userInfo,
+  // 获取用户名
+  username: state => state.userInfo?.user?.username || '',
+  // 获取用户头像
+  avatar: state => state.userInfo?.user?.avatar || '',
+  // 获取用户组信息
+  userGroup: state => state.userInfo?.user?.group || null,
+  // 登录加载状态
+  loginLoading: state => state.loginLoading
+}
+
+const mutations = {
+  // 设置登录状态
+  SET_LOGIN_STATUS(state, status) {
+    state.isLoggedIn = status
+  },
+  
+  // 设置用户信息
+  SET_USER_INFO(state, userInfo) {
+    state.userInfo = userInfo
+  },
+  
+  // 设置Token
+  SET_TOKEN(state, token) {
+    state.token = token
+  },
+  
+  // 设置登录加载状态
+  SET_LOGIN_LOADING(state, loading) {
+    state.loginLoading = loading
+  },
+  
+  // 清除用户数据
+  CLEAR_USER_DATA(state) {
+    state.isLoggedIn = false
+    state.userInfo = null
+    state.token = null
+    state.loginLoading = false
+  }
+}
+
+const actions = {
+  // 用户登录
+  async login({ commit }, loginData) {
+    try {
+      commit('SET_LOGIN_LOADING', true)
+      
+      const response = await authApi.login(loginData)
+      
+      if (response) {
+        // 保存Token
+        const tokenInfo = response.token
+        if (tokenInfo && tokenInfo.tokenValue) {
+          localStorage.setItem('token', tokenInfo.tokenValue)
+          localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo))
+          commit('SET_TOKEN', tokenInfo)
+        }
+        
+        // 保存用户信息
+        localStorage.setItem('userInfo', JSON.stringify(response))
+        localStorage.setItem('isLoggedIn', 'true')
+        
+        commit('SET_USER_INFO', response)
+        commit('SET_LOGIN_STATUS', true)
+        
+        ElMessage.success('登录成功！')
+        return response
+      }
+    } catch (error) {
+      console.error('登录失败:', error)
+      throw error
+    } finally {
+      commit('SET_LOGIN_LOADING', false)
+    }
+  },
+  
+  // 用户注册
+  async register({ commit }, registerData) {
+    try {
+      commit('SET_LOGIN_LOADING', true)
+      
+      const response = await authApi.register(registerData)
+      
+      if (response) {
+        // 注册成功后自动登录
+        const tokenInfo = response.token
+        if (tokenInfo && tokenInfo.tokenValue) {
+          localStorage.setItem('token', tokenInfo.tokenValue)
+          localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo))
+          commit('SET_TOKEN', tokenInfo)
+        }
+        
+        localStorage.setItem('userInfo', JSON.stringify(response))
+        localStorage.setItem('isLoggedIn', 'true')
+        
+        commit('SET_USER_INFO', response)
+        commit('SET_LOGIN_STATUS', true)
+        
+        ElMessage.success('注册成功！')
+        return response
+      }
+    } catch (error) {
+      console.error('注册失败:', error)
+      throw error
+    } finally {
+      commit('SET_LOGIN_LOADING', false)
+    }
+  },
+  
+  // 用户登出
+  async logout({ commit }) {
+    try {
+      await authApi.logout()
+    } catch (error) {
+      console.error('登出请求失败:', error)
+      // 即使登出请求失败，也要清除本地数据
+    } finally {
+      // 清除本地存储
+      localStorage.removeItem('token')
+      localStorage.removeItem('tokenInfo')
+      localStorage.removeItem('userInfo')
+      localStorage.removeItem('isLoggedIn')
+      
+      // 清除状态
+      commit('CLEAR_USER_DATA')
+      
+      ElMessage.success('已退出登录')
+    }
+  },
+  
+  // 检查登录状态
+  async checkLoginStatus({ commit }) {
+    try {
+      const response = await authApi.getStatus()
+      
+      if (response && response.isLoggedIn && response.user) {
+        // 更新用户信息
+        localStorage.setItem('userInfo', JSON.stringify(response.user))
+        localStorage.setItem('isLoggedIn', 'true')
+        
+        commit('SET_USER_INFO', response.user)
+        commit('SET_LOGIN_STATUS', true)
+        
+        return true
+      } else {
+        // 登录状态无效，清除本地数据
+        commit('CLEAR_USER_DATA')
+        localStorage.removeItem('token')
+        localStorage.removeItem('tokenInfo')
+        localStorage.removeItem('userInfo')
+        localStorage.removeItem('isLoggedIn')
+        
+        return false
+      }
+    } catch (error) {
+      console.error('检查登录状态失败:', error)
+      commit('CLEAR_USER_DATA')
+      return false
+    }
+  },
+  
+  // 从本地存储恢复登录状态
+  restoreLoginState({ commit }) {
+    const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'
+    const userInfo = localStorage.getItem('userInfo')
+    const tokenInfo = localStorage.getItem('tokenInfo')
+    
+    if (isLoggedIn && userInfo) {
+      try {
+        const parsedUserInfo = JSON.parse(userInfo)
+        const parsedTokenInfo = tokenInfo ? JSON.parse(tokenInfo) : null
+        
+        commit('SET_USER_INFO', parsedUserInfo)
+        commit('SET_TOKEN', parsedTokenInfo)
+        commit('SET_LOGIN_STATUS', true)
+        
+        console.log('✅ 已从本地存储恢复登录状态')
+      } catch (error) {
+        console.error('❌ 恢复登录状态失败:', error)
+        commit('CLEAR_USER_DATA')
+      }
+    }
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  getters,
+  mutations,
+  actions
+}
\ No newline at end of file
