| |
| 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.'); |
|
|