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