|
<script setup lang="ts"> |
|
import { onMounted, ref } from 'vue' |
|
import { useRouter } from 'vue-router' |
|
import { Plus, Delete, Edit } from '@element-plus/icons-vue' |
|
import { ElMessage, ElMessageBox } from 'element-plus' |
|
|
|
import InfoDialogComponents from '@/components/InfoDialogComponents.vue' |
|
|
|
import { |
|
productListRequest, |
|
deleteProductByIdRequest, |
|
type ProductListType, |
|
type ProductData |
|
} from '@/api/product' |
|
import { AxiosError } from 'axios' |
|
|
|
const router = useRouter() |
|
|
|
|
|
const ShowItemInfo = ref() |
|
|
|
|
|
const tableLoading = ref(true) |
|
|
|
|
|
const queryCondition = ref<ProductListType>({ |
|
currentPage: 1, |
|
pageSize: 10 |
|
} as ProductListType) |
|
|
|
|
|
const queriedResult = ref<ProductData>({} as ProductData) |
|
|
|
|
|
const getProductList = async (params: ProductListType = {}) => { |
|
tableLoading.value = true |
|
|
|
Object.assign(queryCondition.value, params) |
|
|
|
try { |
|
const { data } = await productListRequest(queryCondition.value) |
|
tableLoading.value = false |
|
|
|
if (data.code === 0) { |
|
queriedResult.value = data.data |
|
} else { |
|
ElMessage.error('商品接口错误') |
|
throw new Error('商品接口错误') |
|
} |
|
} catch (error: unknown) { |
|
if (error instanceof AxiosError) { |
|
ElMessage.error('商品接口失败: ' + error.message) |
|
} else { |
|
ElMessage.error('未知错误:' + error) |
|
} |
|
} |
|
} |
|
|
|
onMounted(() => { |
|
|
|
getProductList() |
|
}) |
|
|
|
const isDelecting = ref(false) |
|
const DeleteProduct = async (id: number, productName: string) => { |
|
ElMessageBox.confirm(`确定要删除 "${productName}" 吗?`, '警告', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
showClose: false |
|
}) |
|
.then(async () => { |
|
ElMessage.success(`正在删除 ${productName},请稍候`) |
|
isDelecting.value = true |
|
const { data } = await deleteProductByIdRequest(id) |
|
if (data.code === 0) { |
|
ElMessage.success('删除成功') |
|
getProductList() |
|
} else { |
|
ElMessage.error('删除失败') |
|
} |
|
isDelecting.value = false |
|
}) |
|
.catch(() => { |
|
|
|
|
|
|
|
|
|
}) |
|
} |
|
</script> |
|
|
|
<template> |
|
<div> |
|
<el-card shadow="never"> |
|
<template #header> |
|
|
|
<div class="card-header"> |
|
<div> |
|
<el-form :inline="true" :model="queriedResult.product_list"> |
|
<el-form-item label="搜索"> |
|
<el-input |
|
style="width: 240px" |
|
v-model="queryCondition.productName" |
|
placeholder="商品名称" |
|
clearable |
|
/> |
|
</el-form-item> |
|
|
|
|
|
|
|
|
|
|
|
|
|
<el-form-item> |
|
<el-button type="primary" @click="() => getProductList({ currentPage: 1 })"> |
|
查询 |
|
</el-button> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
<div> |
|
|
|
<el-button type="primary" @click="router.push({ name: 'ProductCreate' })"> |
|
<el-icon style="margin-right: 5px"> |
|
<Plus /> |
|
</el-icon> |
|
添加商品 |
|
</el-button> |
|
</div> |
|
</div> |
|
</template> |
|
|
|
|
|
<el-table :data="queriedResult.product_list" max-height="1000" v-loading="tableLoading"> |
|
<el-table-column prop="product_id" label="ID" align="center" width="50px" /> |
|
|
|
<el-table-column prop="image_path" label="图片" align="center"> |
|
<template #default="scope"> |
|
<div style="display: flex; align-items: center"> |
|
|
|
<el-image :src="scope.row.image_path" /> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
|
|
<el-table-column prop="product_name" label="名称" align="center" /> |
|
<el-table-column prop="product_class" label="分类" align="center" /> |
|
<el-table-column prop="heighlights" label="亮点" align="center" /> |
|
<el-table-column prop="selling_price" label="价格" align="center" /> |
|
<el-table-column prop="amount" label="库存" align="center" /> |
|
<el-table-column prop="departure_place" label="发货地" align="center" /> |
|
<el-table-column prop="delivery_company" label="快递公司" align="center" /> |
|
<el-table-column prop="upload_date" label="上传时间" align="center" /> |
|
<el-table-column label="操作" v-slot="{ row }" align="center" width="250px"> |
|
<div class="control-item"> |
|
<el-button |
|
:type="row.instruction !== '' ? 'success' : 'warning'" |
|
:disabled="row.instruction === ''" |
|
@click=" |
|
ShowItemInfo.showItemInfoDialog( |
|
row.product_name, |
|
'Instruction', |
|
row.instruction, |
|
row.product_id |
|
) |
|
" |
|
> |
|
说明书 |
|
</el-button> |
|
|
|
|
|
<el-button |
|
type="primary" |
|
:icon="Edit" |
|
@click="router.push({ name: 'ProductEdit', params: { productId: row.product_id } })" |
|
/> |
|
|
|
|
|
<el-button |
|
type="danger" |
|
@click="DeleteProduct(row.product_id, row.product_name)" |
|
:icon="Delete" |
|
:id="row.product_id" |
|
:disabled="isDelecting" |
|
/> |
|
</div> |
|
</el-table-column> |
|
</el-table> |
|
|
|
|
|
<InfoDialogComponents ref="ShowItemInfo" /> |
|
|
|
|
|
<template #footer> |
|
|
|
<el-pagination |
|
v-model:current-page="queriedResult.currentPage" |
|
v-model:page-size="queriedResult.pageSize" |
|
:page-sizes="[5, 10, 15, 20]" |
|
:background="true" |
|
layout="total, sizes, prev, pager, next, jumper" |
|
:total="queriedResult.totalSize || 0" |
|
@size-change="(pageSize: number) => getProductList({ pageSize, currentPage: 1 })" |
|
@current-change="(currentPage: number) => getProductList({ currentPage })" |
|
/> |
|
</template> |
|
</el-card> |
|
</div> |
|
</template> |
|
|
|
<style lang="scss" scoped> |
|
.el-card { |
|
border-radius: 12px; |
|
} |
|
|
|
.box-card { |
|
width: auto; // 卡片宽度 |
|
} |
|
|
|
// 查询栏 |
|
.card-header { |
|
display: flex; |
|
justify-content: space-between; // 将两个 div 放置在页面的两侧 |
|
align-items: center; |
|
|
|
.el-form-item { |
|
margin-bottom: 0px; // 查询框和下面的组件间隔大小 |
|
} |
|
} |
|
|
|
// 分页框 |
|
.el-pagination { |
|
margin-top: 10px; // 距离上面的控件有一定的距离 |
|
display: flex; |
|
justify-content: center; |
|
align-items: center; |
|
} |
|
|
|
// 操作栏 |
|
.control-item { |
|
display: flex; |
|
align-items: center; |
|
} |
|
|
|
// 去掉表格下边框线 |
|
:deep(.el-table__inner-wrapper::before) { |
|
height: 0; |
|
} |
|
</style> |
|
|