DevelopmentHistory.vue 3.3 KB

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