|
|
|
|
|
const { createApp } = Vue; |
|
|
|
|
|
import { authData, authMethods, authMounted } from '../auth.js'; |
|
|
import { appData, appMethods, appMounted } from '../store.js'; |
|
|
import AdminNavbar from '../components/AdminNavbar.js'; |
|
|
|
|
|
const UserManagementApp = { |
|
|
components: { |
|
|
AdminNavbar |
|
|
}, |
|
|
|
|
|
data() { |
|
|
return { |
|
|
...authData(), |
|
|
...appData(), |
|
|
currentPath: window.location.pathname, |
|
|
|
|
|
|
|
|
users: [], |
|
|
userSearchQuery: '', |
|
|
currentPage: 1, |
|
|
pageSize: 10, |
|
|
totalUsers: 0, |
|
|
totalPages: 0, |
|
|
userMessage: '', |
|
|
editingUser: { |
|
|
id: null, |
|
|
email: '', |
|
|
password: '', |
|
|
email_verified: false, |
|
|
is_admin: false, |
|
|
disabled: false |
|
|
}, |
|
|
isSavingUser: false, |
|
|
editUserModal: null |
|
|
}; |
|
|
}, |
|
|
methods: { |
|
|
...authMethods(this), |
|
|
...appMethods(this), |
|
|
async fetchUsers() { |
|
|
this.userMessage = '加载用户中...'; |
|
|
try { |
|
|
const token = localStorage.getItem('access_token'); |
|
|
let url = `/api/admin/users?page=${this.currentPage}&page_size=${this.pageSize}`; |
|
|
if (this.userSearchQuery) { |
|
|
url += `&search=${encodeURIComponent(this.userSearchQuery)}`; |
|
|
} |
|
|
const response = await fetch(url, { |
|
|
headers: { |
|
|
'Authorization': `Bearer ${token}` |
|
|
} |
|
|
}); |
|
|
const responseData = await response.json(); |
|
|
|
|
|
if (response.ok) { |
|
|
this.users = responseData.users; |
|
|
this.totalUsers = responseData.total_count; |
|
|
this.totalPages = Math.ceil(this.totalUsers / this.pageSize); |
|
|
this.userMessage = ''; |
|
|
console.log('Fetched users successfully. totalUsers:', this.totalUsers, 'totalPages:', this.totalPages); |
|
|
} else { |
|
|
this.userMessage = responseData.detail || '获取用户失败。'; |
|
|
} |
|
|
} catch (error) { |
|
|
this.userMessage = '网络错误或服务器无响应。'; |
|
|
console.error('获取用户错误:', error); |
|
|
} |
|
|
}, |
|
|
changePage(pageNumber) { |
|
|
if (pageNumber > 0 && pageNumber <= this.totalPages) { |
|
|
this.currentPage = pageNumber; |
|
|
this.fetchUsers(); |
|
|
} |
|
|
}, |
|
|
editUser(user) { |
|
|
this.editingUser = { ...user, password: '' }; |
|
|
this.editUserModal.show(); |
|
|
}, |
|
|
async saveUserChanges() { |
|
|
this.isSavingUser = true; |
|
|
this.userMessage = ''; |
|
|
try { |
|
|
const token = localStorage.getItem('access_token'); |
|
|
const updatePayload = { |
|
|
email: this.editingUser.email, |
|
|
email_verified: this.editingUser.email_verified, |
|
|
is_admin: this.editingUser.is_admin, |
|
|
disabled: this.editingUser.disabled |
|
|
}; |
|
|
if (this.editingUser.password) { |
|
|
updatePayload.password = this.editingUser.password; |
|
|
} |
|
|
|
|
|
const response = await fetch(`/api/admin/users/${this.editingUser.id}`, { |
|
|
method: 'PUT', |
|
|
headers: { |
|
|
'Content-Type': 'application/json', |
|
|
'Authorization': `Bearer ${token}` |
|
|
}, |
|
|
body: JSON.stringify(updatePayload) |
|
|
}); |
|
|
const data = await response.json(); |
|
|
|
|
|
if (response.ok) { |
|
|
this.userMessage = '用户更新成功!'; |
|
|
this.fetchUsers(); |
|
|
this.editUserModal.hide(); |
|
|
} else { |
|
|
this.userMessage = data.detail || '用户更新失败。'; |
|
|
} |
|
|
} catch (error) { |
|
|
this.userMessage = '网络错误或服务器无响应。'; |
|
|
console.error('更新用户错误:', error); |
|
|
} finally { |
|
|
this.isSavingUser = false; |
|
|
} |
|
|
}, |
|
|
async deleteUser(userId) { |
|
|
if (!confirm('确定要删除此用户吗?此操作不可逆!')) { |
|
|
return; |
|
|
} |
|
|
this.userMessage = '删除用户中...'; |
|
|
try { |
|
|
const token = localStorage.getItem('access_token'); |
|
|
const response = await fetch(`/api/admin/users/${userId}`, { |
|
|
method: 'DELETE', |
|
|
headers: { |
|
|
'Authorization': `Bearer ${token}` |
|
|
} |
|
|
}); |
|
|
|
|
|
if (response.ok) { |
|
|
this.userMessage = '用户删除成功!'; |
|
|
this.fetchUsers(); |
|
|
} else { |
|
|
const data = await response.json(); |
|
|
this.userMessage = data.detail || '用户删除失败。'; |
|
|
} |
|
|
} catch (error) { |
|
|
this.userMessage = '网络错误或服务器无响应。'; |
|
|
console.error('删除用户错误:', error); |
|
|
} |
|
|
}, |
|
|
handleShowChangePasswordModal() { |
|
|
this.showChangePasswordModal = true; |
|
|
} |
|
|
}, |
|
|
mounted() { |
|
|
authMounted(this); |
|
|
appMounted(this); |
|
|
console.log('User management app mounted!'); |
|
|
|
|
|
this.editUserModal = new bootstrap.Modal(document.getElementById('editUserModal')); |
|
|
this.fetchUsers(); |
|
|
|
|
|
}, |
|
|
watch: { |
|
|
|
|
|
} |
|
|
}; |
|
|
|
|
|
createApp(UserManagementApp).mount('#app'); |
|
|
console.log('User management Vue app successfully mounted to #app element.'); |
|
|
|