| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- <template>
- <div>
- <div class="header-actions">
- <h2>荣誉资质管理</h2>
- <el-button type="primary" @click="openDialog()">新增</el-button>
- </div>
- <el-table :data="items" style="width: 100%" v-loading="loading">
- <el-table-column prop="id" label="ID" width="80" />
- <el-table-column prop="title" label="标题" />
- <el-table-column label="图片">
- <template #default="scope">
- <el-image style="width: 100px; height: 60px" :src="getImageUrl(scope.row.image_url)" fit="cover" />
- </template>
- </el-table-column>
- <el-table-column label="操作" width="180">
- <template #default="scope">
- <el-button size="small" @click="openDialog(scope.row)">编辑</el-button>
- <el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-dialog v-model="dialogVisible" :title="isEdit ? '编辑荣誉' : '新增荣誉'">
- <el-form :model="form" label-width="120px">
- <el-form-item label="标题">
- <el-input v-model="form.title" />
- </el-form-item>
- <el-form-item label="图片">
- <el-upload
- class="avatar-uploader"
- :http-request="customUpload"
- :show-file-list="false"
- :on-success="handleUploadSuccess"
- >
- <img v-if="form.image_url" :src="getImageUrl(form.image_url)" class="avatar" />
- <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
- </el-upload>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">取消</el-button>
- <el-button type="primary" @click="handleSubmit">确定</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
- </template>
- <script setup>
- import { ref, onMounted, computed } from 'vue'
- import api from '../api'
- import { useAuthStore } from '../stores/auth'
- import { ElMessage, ElMessageBox } from 'element-plus'
- const items = ref([])
- const loading = ref(false)
- const dialogVisible = ref(false)
- const isEdit = ref(false)
- const form = ref({
- id: null,
- title: '',
- image_url: ''
- })
- const authStore = useAuthStore()
- const uploadUrl = import.meta.env.VITE_UPLOAD_URL
- const customUpload = async (options) => {
- const { file, onSuccess, onError } = options
- const formData = new FormData()
- formData.append('file', file)
-
- try {
- const res = await api.post('/upload', formData, {
- headers: {
- 'Content-Type': 'multipart/form-data'
- }
- })
- onSuccess(res.data)
- } catch (error) {
- onError(error)
- ElMessage.error('上传失败')
- }
- }
- const getImageUrl = (url) => {
- if (!url) return ''
- if (url.startsWith('http')) return url
- return `${import.meta.env.VITE_IMG_BASE_URL}${url}`
- }
- const fetchData = async () => {
- loading.value = true
- try {
- const res = await api.get('/honors')
- items.value = res.data
- } catch (error) {
- ElMessage.error('获取数据失败')
- } finally {
- loading.value = false
- }
- }
- const openDialog = (item = null) => {
- if (item) {
- isEdit.value = true
- form.value = { ...item }
- } else {
- isEdit.value = false
- form.value = { id: null, title: '', image_url: '' }
- }
- dialogVisible.value = true
- }
- const handleUploadSuccess = (response) => {
- form.value.image_url = response.url
- }
- const handleSubmit = async () => {
- try {
- if (isEdit.value) {
- await api.put(`/honors/${form.value.id}`, form.value)
- ElMessage.success('更新成功')
- } else {
- await api.post('/honors', form.value)
- ElMessage.success('创建成功')
- }
- dialogVisible.value = false
- fetchData()
- } catch (error) {
- ElMessage.error('操作失败')
- }
- }
- const handleDelete = (item) => {
- ElMessageBox.confirm('确定要删除此荣誉吗?', '警告', {
- confirmButtonText: '是',
- cancelButtonText: '否',
- type: 'warning'
- }).then(async () => {
- try {
- await api.delete(`/honors/${item.id}`)
- ElMessage.success('删除成功')
- fetchData()
- } catch (error) {
- ElMessage.error('删除失败')
- }
- })
- }
- onMounted(fetchData)
- </script>
- <style scoped>
- .header-actions {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- }
- .avatar-uploader .el-upload {
- border: 1px dashed #d9d9d9;
- border-radius: 6px;
- cursor: pointer;
- position: relative;
- overflow: hidden;
- }
- .avatar-uploader .el-upload:hover {
- border-color: #409eff;
- }
- .avatar-uploader-icon {
- font-size: 28px;
- color: #8c939d;
- width: 178px;
- height: 178px;
- text-align: center;
- line-height: 178px;
- }
- .avatar {
- width: 178px;
- height: 178px;
- display: block;
- }
- </style>
|