|
@@ -6,8 +6,8 @@
|
|
|
<el-form-item label="服务标题" prop="caseTitle">
|
|
<el-form-item label="服务标题" prop="caseTitle">
|
|
|
<el-input v-model="queryParams.caseTitle" placeholder="请输入服务标题" clearable style="width: 240px" @keyup.enter="handleQuery" />
|
|
<el-input v-model="queryParams.caseTitle" placeholder="请输入服务标题" clearable style="width: 240px" @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="服务类别" prop="projectTypeId">
|
|
|
|
|
- <el-select v-model="queryParams.projectTypeId" placeholder="请选择" clearable style="width: 160px">
|
|
|
|
|
|
|
+ <el-form-item label="服务类别" prop="projectType">
|
|
|
|
|
+ <el-select v-model="queryParams.projectType" placeholder="请选择" clearable style="width: 160px">
|
|
|
<el-option v-for="item in projectTypeOptions" :key="item.id" :label="item.typeName" :value="item.id" />
|
|
<el-option v-for="item in projectTypeOptions" :key="item.id" :label="item.typeName" :value="item.id" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -62,30 +62,23 @@
|
|
|
<el-table-column label="推荐" align="center" width="80">
|
|
<el-table-column label="推荐" align="center" width="80">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span :class="row.isRecommend === '1' ? 'status-active' : 'status-inactive'">
|
|
<span :class="row.isRecommend === '1' ? 'status-active' : 'status-inactive'">
|
|
|
- {{ row.isRecommend === '1' ? '推荐' : '推荐' }}
|
|
|
|
|
- </span>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column label="相关推荐" align="center" width="100">
|
|
|
|
|
- <template #default="{ row }">
|
|
|
|
|
- <span :class="row.isRelatedRecommend === '1' ? 'status-active' : 'status-inactive'">
|
|
|
|
|
- {{ row.isRelatedRecommend === '1' ? '推荐' : '推荐' }}
|
|
|
|
|
|
|
+ {{ row.isRecommend === '1' ? '推荐' : '不推荐' }}
|
|
|
</span>
|
|
</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<el-table-column label="是否显示" align="center" width="100">
|
|
<el-table-column label="是否显示" align="center" width="100">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span :class="row.isShow === '1' ? 'status-active' : 'status-inactive'">
|
|
<span :class="row.isShow === '1' ? 'status-active' : 'status-inactive'">
|
|
|
- {{ row.isShow === '1' ? '显示' : '显示' }}
|
|
|
|
|
|
|
+ {{ row.isShow === '1' ? '显示' : '不显示' }}
|
|
|
</span>
|
|
</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<el-table-column label="发布时间" prop="createTime" align="center" width="120" />
|
|
<el-table-column label="发布时间" prop="createTime" align="center" width="120" />
|
|
|
- <el-table-column label="相关" align="center" width="80">
|
|
|
|
|
|
|
+ <!-- <el-table-column label="相关" align="center" width="80">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
阅读:{{ row.readCount || 0 }}
|
|
阅读:{{ row.readCount || 0 }}
|
|
|
</template>
|
|
</template>
|
|
|
- </el-table-column>
|
|
|
|
|
|
|
+ </el-table-column> -->
|
|
|
<el-table-column label="操作" align="center" width="150" fixed="right">
|
|
<el-table-column label="操作" align="center" width="150" fixed="right">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-button type="primary" link @click="handleView(row)">查看</el-button>
|
|
<el-button type="primary" link @click="handleView(row)">查看</el-button>
|
|
@@ -114,8 +107,8 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="客户行业" prop="industryCategoryId">
|
|
|
|
|
- <el-select v-model="form.industryCategoryId" placeholder="请选择客户行业" style="width: 100%">
|
|
|
|
|
|
|
+ <el-form-item label="客户行业" prop="clientIndustry">
|
|
|
|
|
+ <el-select v-model="form.clientIndustry" placeholder="请选择客户行业" style="width: 100%">
|
|
|
<el-option v-for="item in industryOptions" :key="item.id" :label="item.industryCategoryName" :value="item.id" />
|
|
<el-option v-for="item in industryOptions" :key="item.id" :label="item.industryCategoryName" :value="item.id" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -123,8 +116,8 @@
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="项目类型" prop="projectTypeId">
|
|
|
|
|
- <el-select v-model="form.projectTypeId" placeholder="请选择项目类型" style="width: 100%">
|
|
|
|
|
|
|
+ <el-form-item label="项目类型" prop="projectType">
|
|
|
|
|
+ <el-select v-model="form.projectType" placeholder="请选择项目类型" style="width: 100%">
|
|
|
<el-option v-for="item in projectTypeOptions" :key="item.id" :label="item.typeName" :value="item.id" />
|
|
<el-option v-for="item in projectTypeOptions" :key="item.id" :label="item.typeName" :value="item.id" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -136,54 +129,30 @@
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="12">
|
|
|
|
|
|
|
+ <el-col :span="24">
|
|
|
<el-form-item label="是否推荐">
|
|
<el-form-item label="是否推荐">
|
|
|
<el-switch v-model="form.isRecommend" active-value="1" inactive-value="0" />
|
|
<el-switch v-model="form.isRecommend" active-value="1" inactive-value="0" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="相关推荐">
|
|
|
|
|
- <el-switch v-model="form.isRelatedRecommend" active-value="1" inactive-value="0" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-form-item label="上传方案">
|
|
<el-form-item label="上传方案">
|
|
|
- <file-upload v-model="form.planFile" :limit="1" :disabled="dialog.isView" />
|
|
|
|
|
|
|
+ <file-upload v-model="form.uploadProgram" :limit="1" :disabled="dialog.isView" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="案例图片">
|
|
<el-form-item label="案例图片">
|
|
|
- <div class="case-images">
|
|
|
|
|
- <div v-for="(img, index) in imageList" :key="index" class="image-item">
|
|
|
|
|
- <el-image :src="img.url" fit="cover" class="image-preview" />
|
|
|
|
|
- <div class="image-actions" v-if="!dialog.isView">
|
|
|
|
|
- <el-button type="primary" link size="small" @click="setMainImage(index)">
|
|
|
|
|
- {{ img.isMain ? '主图' : '主图' }}
|
|
|
|
|
- </el-button>
|
|
|
|
|
- <el-button type="danger" link size="small" @click="removeImage(index)">删除</el-button>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div v-if="img.isMain" class="main-tag">主图</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-upload
|
|
|
|
|
- v-if="!dialog.isView && imageList.length < 5"
|
|
|
|
|
- :action="uploadUrl"
|
|
|
|
|
- :headers="uploadHeaders"
|
|
|
|
|
- :show-file-list="false"
|
|
|
|
|
- :on-success="handleImageSuccess"
|
|
|
|
|
- :before-upload="handleBeforeImageUpload"
|
|
|
|
|
- accept=".jpg,.jpeg,.png"
|
|
|
|
|
- class="image-uploader"
|
|
|
|
|
- >
|
|
|
|
|
- <div class="upload-btn">
|
|
|
|
|
- <el-icon><Plus /></el-icon>
|
|
|
|
|
- <span>上传图片</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- </el-upload>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <template v-if="dialog.isView">
|
|
|
|
|
+ <el-image v-if="form.caseImage" :src="form.caseImage" fit="cover" style="width: 120px; height: 120px; border-radius: 4px" :preview-src-list="[form.caseImage]" preview-teleported />
|
|
|
|
|
+ <span v-else class="text-gray-400">暂无图片</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <upload-image v-else v-model="form.caseImage" :limit="1" width="120px" height="120px" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="项目简介" prop="projectBrief">
|
|
<el-form-item label="项目简介" prop="projectBrief">
|
|
|
<el-input v-model="form.projectBrief" type="textarea" :rows="3" placeholder="请输入项目简介" />
|
|
<el-input v-model="form.projectBrief" type="textarea" :rows="3" placeholder="请输入项目简介" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="项目详情" prop="projectDetail">
|
|
|
|
|
- <editor v-model="form.projectDetail" :min-height="200" :read-only="dialog.isView" />
|
|
|
|
|
|
|
+ <el-form-item label="项目详情" prop="projectDetails">
|
|
|
|
|
+ <editor v-model="form.projectDetails" :min-height="200" :read-only="dialog.isView" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="备注">
|
|
|
|
|
+ <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入备注" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<template #footer>
|
|
<template #footer>
|
|
@@ -202,21 +171,15 @@ import { Search, Refresh, Plus, Picture } from '@element-plus/icons-vue';
|
|
|
import { listServiceCase, getServiceCase, addServiceCase, updateServiceCase, delServiceCase } from '@/api/product/serviceCase';
|
|
import { listServiceCase, getServiceCase, addServiceCase, updateServiceCase, delServiceCase } from '@/api/product/serviceCase';
|
|
|
import { listIndustryCategory } from '@/api/customer/industryCategory';
|
|
import { listIndustryCategory } from '@/api/customer/industryCategory';
|
|
|
import { listProjectType } from '@/api/globalSetting/projectType';
|
|
import { listProjectType } from '@/api/globalSetting/projectType';
|
|
|
-import { globalHeaders } from '@/utils/request';
|
|
|
|
|
-
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
|
|
|
-// 上传地址
|
|
|
|
|
-const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload';
|
|
|
|
|
-const uploadHeaders = globalHeaders();
|
|
|
|
|
-
|
|
|
|
|
// 查询表单
|
|
// 查询表单
|
|
|
const queryFormRef = ref<FormInstance>();
|
|
const queryFormRef = ref<FormInstance>();
|
|
|
const queryParams = reactive({
|
|
const queryParams = reactive({
|
|
|
pageNum: 1,
|
|
pageNum: 1,
|
|
|
pageSize: 10,
|
|
pageSize: 10,
|
|
|
caseTitle: '',
|
|
caseTitle: '',
|
|
|
- projectTypeId: undefined as number | undefined
|
|
|
|
|
|
|
+ projectType: undefined as number | undefined
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// 列表数据
|
|
// 列表数据
|
|
@@ -239,22 +202,21 @@ const dialog = reactive({
|
|
|
const initForm = {
|
|
const initForm = {
|
|
|
id: undefined as number | undefined,
|
|
id: undefined as number | undefined,
|
|
|
caseTitle: '',
|
|
caseTitle: '',
|
|
|
- industryCategoryId: undefined as number | undefined,
|
|
|
|
|
- projectTypeId: undefined as number | undefined,
|
|
|
|
|
|
|
+ clientIndustry: undefined as number | undefined,
|
|
|
|
|
+ projectType: undefined as number | undefined,
|
|
|
isShow: '1',
|
|
isShow: '1',
|
|
|
isRecommend: '0',
|
|
isRecommend: '0',
|
|
|
- isRelatedRecommend: '0',
|
|
|
|
|
- planFile: '',
|
|
|
|
|
|
|
+ uploadProgram: '',
|
|
|
caseImage: '',
|
|
caseImage: '',
|
|
|
projectBrief: '',
|
|
projectBrief: '',
|
|
|
- projectDetail: ''
|
|
|
|
|
|
|
+ projectDetails: '',
|
|
|
|
|
+ remark: ''
|
|
|
};
|
|
};
|
|
|
const form = ref({ ...initForm });
|
|
const form = ref({ ...initForm });
|
|
|
-const imageList = ref<{ url: string; ossId?: string; isMain: boolean }[]>([]);
|
|
|
|
|
|
|
|
|
|
const rules = {
|
|
const rules = {
|
|
|
caseTitle: [{ required: true, message: '请输入案例标题', trigger: 'blur' }],
|
|
caseTitle: [{ required: true, message: '请输入案例标题', trigger: 'blur' }],
|
|
|
- projectTypeId: [{ required: true, message: '请选择项目类型', trigger: 'change' }]
|
|
|
|
|
|
|
+ projectType: [{ required: true, message: '请选择项目类型', trigger: 'change' }]
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
/** 获取列表 */
|
|
/** 获取列表 */
|
|
@@ -289,7 +251,7 @@ const getProjectTypeName = (row: any): string => {
|
|
|
const matched = projectTypeOptions.value.find(
|
|
const matched = projectTypeOptions.value.find(
|
|
|
item => item.typeName === row.projectType || String(item.id) === String(row.projectType)
|
|
item => item.typeName === row.projectType || String(item.id) === String(row.projectType)
|
|
|
);
|
|
);
|
|
|
- return matched?.typeName || row.projectType || '-';
|
|
|
|
|
|
|
+ return matched?.typeName || row.projectTypeName || row.projectType || '-';
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
/** 搜索 */
|
|
/** 搜索 */
|
|
@@ -302,7 +264,7 @@ const handleQuery = () => {
|
|
|
const resetQuery = () => {
|
|
const resetQuery = () => {
|
|
|
queryFormRef.value?.resetFields();
|
|
queryFormRef.value?.resetFields();
|
|
|
queryParams.caseTitle = '';
|
|
queryParams.caseTitle = '';
|
|
|
- queryParams.projectTypeId = undefined;
|
|
|
|
|
|
|
+ queryParams.projectType = undefined;
|
|
|
handleQuery();
|
|
handleQuery();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -345,35 +307,28 @@ const loadDetail = async (id: number) => {
|
|
|
try {
|
|
try {
|
|
|
const res = await getServiceCase(id);
|
|
const res = await getServiceCase(id);
|
|
|
const data = res.data || {};
|
|
const data = res.data || {};
|
|
|
- // 通过 projectType 字段匹配项目类型选项
|
|
|
|
|
|
|
+ // 通过 projectType 字段匹配项目类型选项(使用 String() 避免类型不匹配)
|
|
|
const matchedProjectType = projectTypeOptions.value.find(
|
|
const matchedProjectType = projectTypeOptions.value.find(
|
|
|
- item => item.typeName === data.projectType || item.id === data.projectType
|
|
|
|
|
|
|
+ item => item.typeName === data.projectType || String(item.id) === String(data.projectType)
|
|
|
);
|
|
);
|
|
|
- // 通过 clientIndustry 字段匹配客户行业选项
|
|
|
|
|
|
|
+ // 通过 clientIndustry 字段匹配客户行业选项(使用 String() 避免类型不匹配)
|
|
|
const matchedIndustry = industryOptions.value.find(
|
|
const matchedIndustry = industryOptions.value.find(
|
|
|
- item => item.industryCategoryName === data.clientIndustry || item.id === data.clientIndustry
|
|
|
|
|
|
|
+ item => item.industryCategoryName === data.clientIndustry || String(item.id) === String(data.clientIndustry)
|
|
|
);
|
|
);
|
|
|
form.value = {
|
|
form.value = {
|
|
|
id: data.id,
|
|
id: data.id,
|
|
|
caseTitle: data.caseTitle || '',
|
|
caseTitle: data.caseTitle || '',
|
|
|
- industryCategoryId: matchedIndustry?.id ?? data.industryCategoryId,
|
|
|
|
|
- projectTypeId: matchedProjectType?.id ?? data.projectTypeId,
|
|
|
|
|
|
|
+ // 优先使用后端返回的ID字段,兜底使用匹配到的选项ID
|
|
|
|
|
+ clientIndustry: data.clientIndustry ?? matchedIndustry?.id,
|
|
|
|
|
+ projectType: data.projectType ?? matchedProjectType?.id,
|
|
|
isShow: data.isShow || '0',
|
|
isShow: data.isShow || '0',
|
|
|
isRecommend: data.isRecommend || '0',
|
|
isRecommend: data.isRecommend || '0',
|
|
|
- isRelatedRecommend: data.isRelatedRecommend || '0',
|
|
|
|
|
- planFile: data.planFile || '',
|
|
|
|
|
|
|
+ uploadProgram: data.uploadProgram || '',
|
|
|
caseImage: data.caseImage || '',
|
|
caseImage: data.caseImage || '',
|
|
|
projectBrief: data.projectBrief || '',
|
|
projectBrief: data.projectBrief || '',
|
|
|
- projectDetail: data.projectDetail || ''
|
|
|
|
|
|
|
+ projectDetails: data.projectDetails || '',
|
|
|
|
|
+ remark: data.remark || ''
|
|
|
};
|
|
};
|
|
|
- // 解析图片列表
|
|
|
|
|
- if (data.caseImage) {
|
|
|
|
|
- const images = data.caseImage.split(',').filter((s: string) => s);
|
|
|
|
|
- imageList.value = images.map((url: string, index: number) => ({
|
|
|
|
|
- url,
|
|
|
|
|
- isMain: index === 0
|
|
|
|
|
- }));
|
|
|
|
|
- }
|
|
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('获取详情失败', error);
|
|
console.error('获取详情失败', error);
|
|
|
}
|
|
}
|
|
@@ -382,7 +337,6 @@ const loadDetail = async (id: number) => {
|
|
|
/** 重置表单 */
|
|
/** 重置表单 */
|
|
|
const resetForm = () => {
|
|
const resetForm = () => {
|
|
|
form.value = { ...initForm };
|
|
form.value = { ...initForm };
|
|
|
- imageList.value = [];
|
|
|
|
|
formRef.value?.resetFields();
|
|
formRef.value?.resetFields();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -395,63 +349,11 @@ const handleDelete = (row: any) => {
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-/** 图片上传前校验 */
|
|
|
|
|
-const handleBeforeImageUpload = (file: any) => {
|
|
|
|
|
- const isImage = ['image/jpeg', 'image/png', 'image/jpg'].includes(file.type);
|
|
|
|
|
- const isLt5M = file.size / 1024 / 1024 < 5;
|
|
|
|
|
- if (!isImage) {
|
|
|
|
|
- proxy?.$modal.msgError('只能上传 JPG/PNG 格式图片!');
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- if (!isLt5M) {
|
|
|
|
|
- proxy?.$modal.msgError('图片大小不能超过 5MB!');
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- proxy?.$modal.loading('正在上传...');
|
|
|
|
|
- return true;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-/** 图片上传成功 */
|
|
|
|
|
-const handleImageSuccess = (res: any) => {
|
|
|
|
|
- proxy?.$modal.closeLoading();
|
|
|
|
|
- if (res.code === 200) {
|
|
|
|
|
- imageList.value.push({
|
|
|
|
|
- url: res.data.url,
|
|
|
|
|
- ossId: res.data.ossId,
|
|
|
|
|
- isMain: imageList.value.length === 0
|
|
|
|
|
- });
|
|
|
|
|
- } else {
|
|
|
|
|
- proxy?.$modal.msgError(res.msg || '上传失败');
|
|
|
|
|
- }
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-/** 设置主图 */
|
|
|
|
|
-const setMainImage = (index: number) => {
|
|
|
|
|
- imageList.value.forEach((img, i) => {
|
|
|
|
|
- img.isMain = i === index;
|
|
|
|
|
- });
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-/** 删除图片 */
|
|
|
|
|
-const removeImage = (index: number) => {
|
|
|
|
|
- const wasMain = imageList.value[index].isMain;
|
|
|
|
|
- imageList.value.splice(index, 1);
|
|
|
|
|
- if (wasMain && imageList.value.length > 0) {
|
|
|
|
|
- imageList.value[0].isMain = true;
|
|
|
|
|
- }
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
/** 提交表单 */
|
|
/** 提交表单 */
|
|
|
const submitForm = async () => {
|
|
const submitForm = async () => {
|
|
|
const valid = await formRef.value?.validate();
|
|
const valid = await formRef.value?.validate();
|
|
|
if (!valid) return;
|
|
if (!valid) return;
|
|
|
|
|
|
|
|
- // 组装图片URL,主图放第一个
|
|
|
|
|
- const mainImg = imageList.value.find(img => img.isMain);
|
|
|
|
|
- const otherImgs = imageList.value.filter(img => !img.isMain);
|
|
|
|
|
- const allImgs = mainImg ? [mainImg, ...otherImgs] : otherImgs;
|
|
|
|
|
- form.value.caseImage = allImgs.map(img => img.url).join(',');
|
|
|
|
|
-
|
|
|
|
|
try {
|
|
try {
|
|
|
if (form.value.id) {
|
|
if (form.value.id) {
|
|
|
await updateServiceCase(form.value);
|
|
await updateServiceCase(form.value);
|
|
@@ -467,8 +369,8 @@ const submitForm = async () => {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-onMounted(() => {
|
|
|
|
|
- loadOptions();
|
|
|
|
|
|
|
+onMounted(async () => {
|
|
|
|
|
+ await loadOptions();
|
|
|
getList();
|
|
getList();
|
|
|
});
|
|
});
|
|
|
</script>
|
|
</script>
|
|
@@ -500,71 +402,4 @@ onMounted(() => {
|
|
|
color: #909399;
|
|
color: #909399;
|
|
|
cursor: pointer;
|
|
cursor: pointer;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.case-images {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-wrap: wrap;
|
|
|
|
|
- gap: 10px;
|
|
|
|
|
-
|
|
|
|
|
- .image-item {
|
|
|
|
|
- position: relative;
|
|
|
|
|
- width: 100px;
|
|
|
|
|
- border: 1px solid #dcdfe6;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
-
|
|
|
|
|
- .image-preview {
|
|
|
|
|
- width: 100px;
|
|
|
|
|
- height: 100px;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .image-actions {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- justify-content: space-around;
|
|
|
|
|
- padding: 5px 0;
|
|
|
|
|
- background: #f5f7fa;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .main-tag {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- top: 0;
|
|
|
|
|
- left: 0;
|
|
|
|
|
- background: #409eff;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
- padding: 2px 6px;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .image-uploader {
|
|
|
|
|
- width: 100px;
|
|
|
|
|
- height: 130px;
|
|
|
|
|
- border: 1px dashed #dcdfe6;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: center;
|
|
|
|
|
- cursor: pointer;
|
|
|
|
|
-
|
|
|
|
|
- &:hover {
|
|
|
|
|
- border-color: #409eff;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .upload-btn {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-direction: column;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- color: #8c939d;
|
|
|
|
|
-
|
|
|
|
|
- .el-icon {
|
|
|
|
|
- font-size: 24px;
|
|
|
|
|
- margin-bottom: 5px;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- span {
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
</style>
|
|
</style>
|