refactor: improve code formatting and structure in product index view

- Enhanced readability by adjusting indentation and spacing in the template.
- Consolidated repeated code blocks for better maintainability.
- Added functionality for changing product status (上架/下架) with confirmation prompts.
- Updated the handleDelete function to maintain consistent formatting.
- Ensured all API calls and data handling are properly formatted for clarity.
This commit is contained in:
2026-03-08 02:38:43 +07:00
parent a8fab3e765
commit 0e0b856edb
3 changed files with 1036 additions and 916 deletions

View File

@@ -42,3 +42,16 @@ export function delProduct(id) {
method: 'delete'
})
}
// 上架/下架商品
export function changeProductStatus(id, status) {
const data = {
id,
status
}
return request({
url: '/service/product/status',
method: 'put',
data: data
})
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,50 +1,56 @@
<template>
<div class="app-container">
<div class="background-color-fff padding-20 border-radius-8px margin-bottom-20">
<el-form
:model="queryParams"
ref="queryRef"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="商品编码" prop="spuCode">
<el-input
v-model="queryParams.spuCode"
placeholder="请输入商品SPU编码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="商品名称" prop="productName">
<el-input
v-model="queryParams.productName"
placeholder="请输入商品名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="app-container">
<div
class="background-color-fff padding-20 border-radius-8px margin-bottom-20"
>
<el-form
:model="queryParams"
ref="queryRef"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="商品编码" prop="spuCode">
<el-input
v-model="queryParams.spuCode"
placeholder="请输入商品SPU编码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="商品名称" prop="productName">
<el-input
v-model="queryParams.productName"
placeholder="请输入商品名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="background-color-fff padding-20 border-radius-8px margin-bottom-20">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['service:product:add']"
>
新增
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<div
class="background-color-fff padding-20 border-radius-8px margin-bottom-20"
>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['service:product:add']"
>
新增
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="success"
plain
@@ -68,106 +74,138 @@
删除
</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['service:product:export']"
>
导出
</el-button>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
</div>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['service:product:export']"
>
导出
</el-button>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
</div>
<div class="background-color-fff padding-20 border-radius-8px margin-bottom-20">
<el-table
v-loading="loading"
:data="productList"
@selection-change="handleSelectionChange"
>
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="商品ID" align="center" prop="id" />
<el-table-column label="分类ID" align="center" prop="categoryId" />
<el-table-column label="商品编码" align="center" prop="spuCode" />
<el-table-column label="商品名称" align="center" prop="productName" />
<el-table-column label="副标题" align="center" prop="subTitle" />
<el-table-column label="主图URL" align="center" prop="mainImage" width="100">
<template #default="scope">
<image-preview :src="scope.row.mainImage" :width="50" :height="50" />
</template>
</el-table-column>
<!-- <el-table-column label="商品相册" align="center" prop="imageGallery" width="100">
<div
class="background-color-fff padding-20 border-radius-8px margin-bottom-20"
>
<el-table
v-loading="loading"
:data="productList"
@selection-change="handleSelectionChange"
>
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="商品ID" align="center" prop="id" />
<el-table-column label="分类ID" align="center" prop="categoryId" />
<el-table-column label="商品编码" align="center" prop="spuCode" />
<el-table-column label="商品名称" align="center" prop="productName" />
<el-table-column label="副标题" align="center" prop="subTitle" />
<el-table-column
label="主图URL"
align="center"
prop="mainImage"
width="100"
>
<template #default="scope">
<image-preview
:src="scope.row.mainImage"
:width="50"
:height="50"
/>
</template>
</el-table-column>
<!-- <el-table-column label="商品相册" align="center" prop="imageGallery" width="100">
<template #default="scope">
<image-preview :src="scope.row.imageGallery" :width="50" :height="50" />
</template>
</el-table-column> -->
<!-- <el-table-column label="商品描述" align="center" prop="description" /> -->
<el-table-column label="商品单位" align="center" prop="unit" />
<el-table-column label="重量(kg)" align="center" prop="weight" />
<el-table-column label="状态" align="center" prop="status" />
<!-- <el-table-column label="是否热销" align="center" prop="isHot" /> -->
<!-- <el-table-column label="是否推荐" align="center" prop="isRecommend" /> -->
<el-table-column label="排序" align="center" prop="sortOrder" />
<el-table-column label="总销量" align="center" prop="salesCount" />
<el-table-column label="浏览数" align="center" prop="viewCount" />
<el-table-column label="收藏数" align="center" prop="likeCount" />
<el-table-column label="最低价格" align="center" prop="minPrice" />
<el-table-column label="最高价格" align="center" prop="maxPrice" />
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
fixed="right"
>
<template #default="scope">
<el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['service:product:edit']"
>
修改
</el-button>
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['service:product:remove']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- <el-table-column label="商品描述" align="center" prop="description" /> -->
<el-table-column label="商品单位" align="center" prop="unit" />
<el-table-column label="重量(kg)" align="center" prop="weight" />
<el-table-column label="状态" align="center" prop="status" />
<!-- <el-table-column label="是否热销" align="center" prop="isHot" /> -->
<!-- <el-table-column label="是否推荐" align="center" prop="isRecommend" /> -->
<el-table-column label="排序" align="center" prop="sortOrder" />
<el-table-column label="总销量" align="center" prop="salesCount" />
<el-table-column label="浏览数" align="center" prop="viewCount" />
<el-table-column label="收藏数" align="center" prop="likeCount" />
<el-table-column label="最低价格" align="center" prop="minPrice" />
<el-table-column label="最高价格" align="center" prop="maxPrice" />
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
fixed="right"
>
<template #default="scope">
<el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['service:product:edit']"
>
修改
</el-button>
<el-button
link
type="primary"
icon="Edit"
v-if="scope.row.status === 0"
@click="handleChangeStatus(scope.row, 1)"
v-hasPermi="['service:product:edit']"
>
上架
</el-button>
<el-button
link
type="primary"
icon="Edit"
v-if="scope.row.status === 1"
@click="handleChangeStatus(scope.row, 0)"
v-hasPermi="['service:product:edit']"
>
下架
</el-button>
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['service:product:remove']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</div>
</template>
<script setup name="ProductIndex">
import {
listProduct,
getProduct,
delProduct,
addProduct,
updateProduct,
} from '@/api/service/product';
listProduct,
getProduct,
delProduct,
addProduct,
updateProduct,
changeProductStatus,
} from "@/api/service/product";
const { proxy } = getCurrentInstance();
const router = useRouter();
@@ -180,167 +218,183 @@ const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref('');
const title = ref("");
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
categoryId: null,
spuCode: null,
productName: null,
subTitle: null,
mainImage: null,
imageGallery: null,
description: null,
unit: null,
weight: null,
status: null,
isHot: null,
isRecommend: null,
sortOrder: null,
salesCount: null,
viewCount: null,
likeCount: null,
minPrice: null,
maxPrice: null,
},
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
categoryId: null,
spuCode: null,
productName: null,
subTitle: null,
mainImage: null,
imageGallery: null,
description: null,
unit: null,
weight: null,
status: null,
isHot: null,
isRecommend: null,
sortOrder: null,
salesCount: null,
viewCount: null,
likeCount: null,
minPrice: null,
maxPrice: null,
},
});
const { queryParams, form } = toRefs(data);
/** 查询商品列表列表 */
function getList() {
loading.value = true;
listProduct(queryParams.value).then(response => {
productList.value = response.rows;
total.value = response.total;
loading.value = false;
});
loading.value = true;
listProduct(queryParams.value).then((response) => {
productList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}
// 取消按钮
function cancel() {
open.value = false;
reset();
open.value = false;
reset();
}
// 表单重置
function reset() {
form.value = {
id: null,
categoryId: null,
spuCode: null,
productName: null,
subTitle: null,
mainImage: null,
imageGallery: null,
description: null,
unit: null,
weight: null,
status: null,
isHot: null,
isRecommend: null,
sortOrder: null,
salesCount: null,
viewCount: null,
likeCount: null,
minPrice: null,
maxPrice: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
};
proxy.resetForm('productRef');
form.value = {
id: null,
categoryId: null,
spuCode: null,
productName: null,
subTitle: null,
mainImage: null,
imageGallery: null,
description: null,
unit: null,
weight: null,
status: null,
isHot: null,
isRecommend: null,
sortOrder: null,
salesCount: null,
viewCount: null,
likeCount: null,
minPrice: null,
maxPrice: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
};
proxy.resetForm("productRef");
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm('queryRef');
handleQuery();
proxy.resetForm("queryRef");
handleQuery();
}
// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
function handleAdd() {
router.push({
path: 'productDetails',
name: 'ProductDetails',
});
router.push({
path: "productDetails",
name: "ProductDetails",
});
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const _id = row.id || ids.value;
router.push({
path: 'productDetails',
name: 'ProductDetails',
query: {
productId: _id,
},
});
reset();
const _id = row.id || ids.value;
router.push({
path: "productDetails",
name: "ProductDetails",
query: {
productId: _id,
},
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs['productRef'].validate(valid => {
if (valid) {
if (form.value.id != null) {
updateProduct(form.value).then(response => {
proxy.$modal.msgSuccess('修改成功');
open.value = false;
getList();
});
} else {
addProduct(form.value).then(response => {
proxy.$modal.msgSuccess('新增成功');
open.value = false;
getList();
});
}
}
});
proxy.$refs["productRef"].validate((valid) => {
if (valid) {
if (form.value.id != null) {
updateProduct(form.value).then((response) => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addProduct(form.value).then((response) => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 上架/下架按钮操作 */
function handleChangeStatus(row, status) {
const _ids = row.id || ids.value;
const action = status === 1 ? "上架" : "下架";
proxy.$modal
.confirm(`是否确认${action}商品列表编号为"${_ids}"的数据项?`)
.then(function () {
return changeProductStatus(_ids, status);
})
.then(() => {
getList();
proxy.$modal.msgSuccess(`${action}成功`);
})
.catch(() => {});
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal
.confirm('是否确认删除商品列表编号为"' + _ids + '"的数据项?')
.then(function () {
return delProduct(_ids);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('删除成功');
})
.catch(() => {});
const _ids = row.id || ids.value;
proxy.$modal
.confirm('是否确认删除商品列表编号为"' + _ids + '"的数据项?')
.then(function () {
return delProduct(_ids);
})
.then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
proxy.download(
'service/product/export',
{
...queryParams.value,
},
`product_${new Date().getTime()}.xlsx`
);
proxy.download(
"service/product/export",
{
...queryParams.value,
},
`product_${new Date().getTime()}.xlsx`,
);
}
getList();