成就
This commit is contained in:
@@ -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) : '';
|
||||
}
|
||||
|
||||
// 删除成就
|
||||
|
||||
Reference in New Issue
Block a user