This commit is contained in:
2025-11-25 18:57:39 +08:00
parent b5d4f0f6ba
commit 780ed31a1d
9 changed files with 247 additions and 113 deletions

View File

@@ -152,33 +152,16 @@
/>
</el-form-item>
<el-form-item label="成就图标" prop="icon">
<el-input
v-model="currentAchievement.icon"
placeholder="请输入图标路径,如:/img/achievement/v1-icon.svg 或完整URL"
>
<template #append>
<el-button @click="showIconUpload = true">上传</el-button>
</template>
</el-input>
<div v-if="currentAchievement.icon" style="margin-top: 10px">
<div style="display: flex; align-items: center; gap: 10px;">
<el-image
:src="getIconUrl(currentAchievement.icon)"
style="width: 80px; height: 80px"
fit="contain"
>
<template #error>
<div class="image-slot">
<el-icon><Picture /></el-icon>
</div>
</template>
</el-image>
<div style="font-size: 12px; color: #909399;">
<div>路径: {{ currentAchievement.icon }}</div>
<div>完整URL: {{ getIconUrl(currentAchievement.icon) }}</div>
</div>
</div>
</div>
<FileUpload
:asDialog="false"
listType="cover"
accept="image/*"
module="achievement"
:businessId="currentAchievement.achievementID"
tip="建议 1:1 比例,支持 jpg/png/svg最大 2MB"
v-model:coverUrl="iconCover"
@success="onIconUploadSuccess"
/>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
@@ -322,6 +305,7 @@ import type { Achievement, UserAchievement } from '@/types';
import { AchievementEnumHelper } from '@/types/enums/achievement-enums';
import { getAchievementIconUrl } from '@/utils/iconUtils';
import { AdminLayout } from '@/views/admin';
import FileUpload from '@/components/file/FileUpload.vue';
defineOptions({
name: 'AchievementManagementView'
@@ -337,7 +321,6 @@ const achieverList = ref<UserAchievement[]>([]);
// 对话框控制
const achievementDialogVisible = ref(false);
const usersDialogVisible = ref(false);
const showIconUpload = ref(false);
const isEdit = ref(false);
// 筛选条件
@@ -345,6 +328,13 @@ const filter = ref<Partial<Achievement>>({});
// 当前操作的成就
const currentAchievement = ref<Achievement>({});
// 封面绑定FileUpload cover v-model
const iconCover = ref<string>('');
// 简单判断是否为文件ID与 iconUtils 保持一致)
function isFileId(val?: string) {
if (!val) return false;
return !val.includes('/') && !val.includes('.') && /^(?=.{16,}$)[A-Za-z0-9_-]+$/.test(val);
}
// 枚举选项
const achievementTypeOptions = AchievementEnumHelper.getAllAchievementTypeOptions();
@@ -362,7 +352,7 @@ const achievementFormRules = {
{ required: true, message: '请输入成就描述', trigger: 'blur' }
],
icon: [
{ required: true, message: '请输入图标URL', trigger: 'blur' }
{ required: true, message: '请上传成就图标', trigger: 'change' }
],
type: [
{ required: true, message: '请选择成就类型', trigger: 'change' }
@@ -405,6 +395,19 @@ function formatConditionValue(conditionType?: number, conditionValue?: number):
// 获取图标完整路径
const getIconUrl = getAchievementIconUrl;
// 上传回调 - 将返回的文件URL写入 currentAchievement.icon
function onIconUploadSuccess(files: any[]) {
const f = files && files[0];
if (!f) return;
// 优先存 fileID便于环境切换回退为 fileUrl
if (f.fileID) {
currentAchievement.value.icon = f.fileID;
iconCover.value = f.fileID;
} else if (f.fileUrl) {
currentAchievement.value.icon = f.fileUrl;
}
}
// 加载成就列表
async function loadAchievementList() {
try {
@@ -435,6 +438,7 @@ function handleAdd() {
orderNum: 0
};
achievementDialogVisible.value = true;
iconCover.value = '';
}
// 编辑成就
@@ -442,6 +446,7 @@ function handleEdit(row: Achievement) {
isEdit.value = true;
currentAchievement.value = { ...row };
achievementDialogVisible.value = true;
iconCover.value = isFileId(currentAchievement.value.icon as any) ? (currentAchievement.value.icon as any) : '';
}
// 删除成就