Users.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <div>
  3. <div class="header-actions">
  4. <h2>用户管理</h2>
  5. <el-button type="primary" @click="openDialog()">新增</el-button>
  6. </div>
  7. <el-table :data="items" style="width: 100%" v-loading="loading">
  8. <el-table-column prop="id" label="ID" width="80" />
  9. <el-table-column prop="username" label="用户名" />
  10. <el-table-column prop="created_at" label="创建时间" />
  11. <el-table-column label="操作" width="180">
  12. <template #default="scope">
  13. <el-button size="small" @click="openDialog(scope.row)">编辑</el-button>
  14. <el-button size="small" type="danger" @click="handleDelete(scope.row)" :disabled="scope.row.username === 'admin'">删除</el-button>
  15. </template>
  16. </el-table-column>
  17. </el-table>
  18. <el-dialog v-model="dialogVisible" :title="isEdit ? '编辑用户' : '新增用户'">
  19. <el-form :model="form" label-width="120px">
  20. <el-form-item label="用户名">
  21. <el-input v-model="form.username" :disabled="isEdit" />
  22. </el-form-item>
  23. <el-form-item label="密码">
  24. <el-input v-model="form.password" type="password" placeholder="如不修改请留空" />
  25. </el-form-item>
  26. </el-form>
  27. <template #footer>
  28. <span class="dialog-footer">
  29. <el-button @click="dialogVisible = false">取消</el-button>
  30. <el-button type="primary" @click="handleSubmit">确定</el-button>
  31. </span>
  32. </template>
  33. </el-dialog>
  34. </div>
  35. </template>
  36. <script setup>
  37. import { ref, onMounted } from 'vue'
  38. import api from '../api'
  39. import { ElMessage, ElMessageBox } from 'element-plus'
  40. const items = ref([])
  41. const loading = ref(false)
  42. const dialogVisible = ref(false)
  43. const isEdit = ref(false)
  44. const form = ref({
  45. id: null,
  46. username: '',
  47. password: ''
  48. })
  49. const fetchData = async () => {
  50. loading.value = true
  51. try {
  52. const res = await api.get('/users')
  53. items.value = res.data
  54. } catch (error) {
  55. ElMessage.error('获取数据失败')
  56. } finally {
  57. loading.value = false
  58. }
  59. }
  60. const openDialog = (item = null) => {
  61. if (item) {
  62. isEdit.value = true
  63. form.value = { ...item, password: '' }
  64. } else {
  65. isEdit.value = false
  66. form.value = { id: null, username: '', password: '' }
  67. }
  68. dialogVisible.value = true
  69. }
  70. const handleSubmit = async () => {
  71. try {
  72. if (isEdit.value) {
  73. await api.put(`/users/${form.value.id}`, form.value)
  74. ElMessage.success('更新成功')
  75. } else {
  76. await api.post('/users', form.value)
  77. ElMessage.success('创建成功')
  78. }
  79. dialogVisible.value = false
  80. fetchData()
  81. } catch (error) {
  82. ElMessage.error('操作失败')
  83. }
  84. }
  85. const handleDelete = (item) => {
  86. ElMessageBox.confirm('确定要删除此用户吗?', '警告', {
  87. confirmButtonText: '是',
  88. cancelButtonText: '否',
  89. type: 'warning'
  90. }).then(async () => {
  91. try {
  92. await api.delete(`/users/${item.id}`)
  93. ElMessage.success('删除成功')
  94. fetchData()
  95. } catch (error) {
  96. ElMessage.error('删除失败')
  97. }
  98. })
  99. }
  100. onMounted(fetchData)
  101. </script>
  102. <style scoped>
  103. .header-actions {
  104. display: flex;
  105. justify-content: space-between;
  106. align-items: center;
  107. margin-bottom: 20px;
  108. }
  109. </style>