|
|
|
|
@ -0,0 +1,839 @@
|
|
|
|
|
<template>
|
|
|
|
|
<div class="app-container">
|
|
|
|
|
<el-card class="filter-container" shadow="never">
|
|
|
|
|
<div>
|
|
|
|
|
<i class="el-icon-search"></i>
|
|
|
|
|
<span>筛选搜索</span>
|
|
|
|
|
<el-button
|
|
|
|
|
style="float:right"
|
|
|
|
|
type="primary"
|
|
|
|
|
@click="handleSearchList()"
|
|
|
|
|
size="small">
|
|
|
|
|
查询搜索
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button
|
|
|
|
|
style="float:right;margin-right: 15px"
|
|
|
|
|
@click="handleResetSearch()"
|
|
|
|
|
size="small">
|
|
|
|
|
重置
|
|
|
|
|
</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="margin-top: 15px">
|
|
|
|
|
<el-form :inline="true" :model="listQuery" size="small" label-width="140px">
|
|
|
|
|
<el-form-item label="商品名称:">
|
|
|
|
|
<el-input v-model="listQuery.productName" class="input-width" placeholder="商品名称"></el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="推荐状态:">
|
|
|
|
|
<el-select v-model="listQuery.recommendStatus" placeholder="全部" clearable class="input-width">
|
|
|
|
|
<el-option v-for="item in recommendOptions"
|
|
|
|
|
:key="item.value"
|
|
|
|
|
:label="item.label"
|
|
|
|
|
:value="item.value">
|
|
|
|
|
</el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
</div>
|
|
|
|
|
</el-card>
|
|
|
|
|
<el-card class="operate-container" shadow="never">
|
|
|
|
|
<i class="el-icon-tickets"></i>
|
|
|
|
|
<span>数据列表</span>
|
|
|
|
|
<el-button size="mini" class="btn-add" @click="handleSelectProduct()">选择商品</el-button>
|
|
|
|
|
</el-card>
|
|
|
|
|
<div class="table-container">
|
|
|
|
|
<el-table ref="newProductTable"
|
|
|
|
|
:data="list"
|
|
|
|
|
style="width: 100%;"
|
|
|
|
|
@selection-change="handleSelectionChange"
|
|
|
|
|
v-loading="listLoading" border>
|
|
|
|
|
<el-table-column type="selection" width="60" align="center"></el-table-column>
|
|
|
|
|
<el-table-column label="编号" width="120" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.id}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="商品名称" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.productName}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="是否推荐" width="200" align="center">
|
|
|
|
|
<template slot-scope="scope">
|
|
|
|
|
<el-switch
|
|
|
|
|
@change="handleRecommendStatusStatusChange(scope.$index, scope.row)"
|
|
|
|
|
:active-value="1"
|
|
|
|
|
:inactive-value="0"
|
|
|
|
|
v-model="scope.row.recommendStatus">
|
|
|
|
|
</el-switch>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="排序" width="160" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.sort}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="状态" width="160" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.recommendStatus | formatRecommendStatus}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="操作" width="180" align="center">
|
|
|
|
|
<template slot-scope="scope">
|
|
|
|
|
<el-button size="mini"
|
|
|
|
|
type="text"
|
|
|
|
|
@click="handleEditSort(scope.$index, scope.row)">设置排序
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button size="mini"
|
|
|
|
|
type="text"
|
|
|
|
|
@click="handleDelete(scope.$index, scope.row)">删除
|
|
|
|
|
</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="batch-operate-container">
|
|
|
|
|
<el-select
|
|
|
|
|
size="small"
|
|
|
|
|
v-model="operateType" placeholder="批量操作">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="item in operates"
|
|
|
|
|
:key="item.value"
|
|
|
|
|
:label="item.label"
|
|
|
|
|
:value="item.value">
|
|
|
|
|
</el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-button
|
|
|
|
|
style="margin-left: 20px"
|
|
|
|
|
class="search-button"
|
|
|
|
|
@click="handleBatchOperate()"
|
|
|
|
|
type="primary"
|
|
|
|
|
size="small">
|
|
|
|
|
确定
|
|
|
|
|
</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="pagination-container">
|
|
|
|
|
<el-pagination
|
|
|
|
|
background
|
|
|
|
|
@size-change="handleSizeChange"
|
|
|
|
|
@current-change="handleCurrentChange"
|
|
|
|
|
layout="total, sizes,prev, pager, next,jumper"
|
|
|
|
|
:page-size="listQuery.pageSize"
|
|
|
|
|
:page-sizes="[5,10,15]"
|
|
|
|
|
:current-page.sync="listQuery.pageNum"
|
|
|
|
|
:total="total">
|
|
|
|
|
</el-pagination>
|
|
|
|
|
</div>
|
|
|
|
|
<el-dialog title="选择商品" :visible.sync="selectDialogVisible" width="50%">
|
|
|
|
|
<el-input v-model="dialogData.listQuery.keyword"
|
|
|
|
|
style="width: 250px;margin-bottom: 20px"
|
|
|
|
|
size="small"
|
|
|
|
|
placeholder="商品名称搜索">
|
|
|
|
|
<el-button slot="append" icon="el-icon-search" @click="handleSelectSearch()"></el-button>
|
|
|
|
|
</el-input>
|
|
|
|
|
<el-table :data="dialogData.list"
|
|
|
|
|
@selection-change="handleDialogSelectionChange" border>
|
|
|
|
|
<el-table-column type="selection" width="60" align="center"></el-table-column>
|
|
|
|
|
<el-table-column label="商品名称" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.name}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="货号" width="160" align="center">
|
|
|
|
|
<template slot-scope="scope">NO.{{scope.row.productSn}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="价格" width="120" align="center">
|
|
|
|
|
<template slot-scope="scope">¥{{scope.row.price}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
<div class="pagination-container">
|
|
|
|
|
<el-pagination
|
|
|
|
|
background
|
|
|
|
|
@size-change="handleDialogSizeChange"
|
|
|
|
|
@current-change="handleDialogCurrentChange"
|
|
|
|
|
layout="prev, pager, next"
|
|
|
|
|
:current-page.sync="dialogData.listQuery.pageNum"
|
|
|
|
|
:page-size="dialogData.listQuery.pageSize"
|
|
|
|
|
:page-sizes="[5,10,15]"
|
|
|
|
|
:total="dialogData.total">
|
|
|
|
|
</el-pagination>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="clear: both;"></div>
|
|
|
|
|
<div slot="footer">
|
|
|
|
|
<el-button size="small" @click="selectDialogVisible = false">取 消</el-button>
|
|
|
|
|
<el-button size="small" type="primary" @click="handleSelectDialogConfirm()">确 定</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
<el-dialog title="设置排序"
|
|
|
|
|
:visible.sync="sortDialogVisible"
|
|
|
|
|
width="40%">
|
|
|
|
|
<el-form :model="sortDialogData"
|
|
|
|
|
label-width="150px">
|
|
|
|
|
<el-form-item label="排序:">
|
|
|
|
|
<el-input v-model="sortDialogData.sort" style="width: 200px"></el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<span slot="footer">
|
|
|
|
|
<el-button @click="sortDialogVisible = false" size="small">取 消</el-button>
|
|
|
|
|
<el-button type="primary" @click="handleUpdateSort" size="small">确 定</el-button>
|
|
|
|
|
</span>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script>
|
|
|
|
|
import {fetchList,updateRecommendStatus,deleteHotProduct,createHotProduct,updateHotProductSort} from '@/api/hotProduct';
|
|
|
|
|
import {fetchList as fetchProductList} from '@/api/product';
|
|
|
|
|
|
|
|
|
|
const defaultListQuery = {
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 5,
|
|
|
|
|
productName: null,
|
|
|
|
|
recommendStatus: null
|
|
|
|
|
};
|
|
|
|
|
const defaultRecommendOptions = [
|
|
|
|
|
{
|
|
|
|
|
label: '未推荐',
|
|
|
|
|
value: 0
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '推荐中',
|
|
|
|
|
value: 1
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
export default {
|
|
|
|
|
name: 'hotProductList',
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
listQuery: Object.assign({}, defaultListQuery),
|
|
|
|
|
recommendOptions: Object.assign({}, defaultRecommendOptions),
|
|
|
|
|
list: null,
|
|
|
|
|
total: null,
|
|
|
|
|
listLoading: false,
|
|
|
|
|
multipleSelection: [],
|
|
|
|
|
operates: [
|
|
|
|
|
{
|
|
|
|
|
label: "设为推荐",
|
|
|
|
|
value: 0
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: "取消推荐",
|
|
|
|
|
value: 1
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: "删除",
|
|
|
|
|
value: 2
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
operateType: null,
|
|
|
|
|
selectDialogVisible:false,
|
|
|
|
|
dialogData:{
|
|
|
|
|
list: null,
|
|
|
|
|
total: null,
|
|
|
|
|
multipleSelection:[],
|
|
|
|
|
listQuery:{
|
|
|
|
|
keyword: null,
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 5
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
sortDialogVisible:false,
|
|
|
|
|
sortDialogData:{sort:0,id:null}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
created() {
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
filters:{
|
|
|
|
|
formatRecommendStatus(status){
|
|
|
|
|
if(status===1){
|
|
|
|
|
return '推荐中';
|
|
|
|
|
}else{
|
|
|
|
|
return '未推荐';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
handleResetSearch() {
|
|
|
|
|
this.listQuery = Object.assign({}, defaultListQuery);
|
|
|
|
|
},
|
|
|
|
|
handleSearchList() {
|
|
|
|
|
this.listQuery.pageNum = 1;
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
handleSelectionChange(val){
|
|
|
|
|
this.multipleSelection = val;
|
|
|
|
|
},
|
|
|
|
|
handleSizeChange(val) {
|
|
|
|
|
this.listQuery.pageNum = 1;
|
|
|
|
|
this.listQuery.pageSize = val;
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
handleCurrentChange(val) {
|
|
|
|
|
this.listQuery.pageNum = val;
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
handleRecommendStatusStatusChange(index,row){
|
|
|
|
|
this.updateRecommendStatusStatus(row.id,row.recommendStatus);
|
|
|
|
|
},
|
|
|
|
|
handleDelete(index,row){
|
|
|
|
|
this.deleteProduct(row.id);
|
|
|
|
|
},
|
|
|
|
|
handleBatchOperate(){
|
|
|
|
|
if (this.multipleSelection < 1) {
|
|
|
|
|
this.$message({
|
|
|
|
|
message: '请选择一条记录',
|
|
|
|
|
type: 'warning',
|
|
|
|
|
duration: 1000
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
let ids = [];
|
|
|
|
|
for (let i = 0; i < this.multipleSelection.length; i++) {
|
|
|
|
|
ids.push(this.multipleSelection[i].id);
|
|
|
|
|
}
|
|
|
|
|
if (this.operateType === 0) {
|
|
|
|
|
//设为推荐
|
|
|
|
|
this.updateRecommendStatusStatus(ids,1);
|
|
|
|
|
} else if (this.operateType === 1) {
|
|
|
|
|
//取消推荐
|
|
|
|
|
this.updateRecommendStatusStatus(ids,0);
|
|
|
|
|
} else if(this.operateType===2){
|
|
|
|
|
//删除
|
|
|
|
|
this.deleteProduct(ids);
|
|
|
|
|
}else {
|
|
|
|
|
this.$message({
|
|
|
|
|
message: '请选择批量操作类型',
|
|
|
|
|
type: 'warning',
|
|
|
|
|
duration: 1000
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
handleSelectProduct(){
|
|
|
|
|
this.selectDialogVisible=true;
|
|
|
|
|
this.getDialogList();
|
|
|
|
|
},
|
|
|
|
|
handleSelectSearch(){
|
|
|
|
|
this.getDialogList();
|
|
|
|
|
},
|
|
|
|
|
handleDialogSizeChange(val) {
|
|
|
|
|
this.dialogData.listQuery.pageNum = 1;
|
|
|
|
|
this.dialogData.listQuery.pageSize = val;
|
|
|
|
|
this.getDialogList();
|
|
|
|
|
},
|
|
|
|
|
handleDialogCurrentChange(val) {
|
|
|
|
|
this.dialogData.listQuery.pageNum = val;
|
|
|
|
|
this.getDialogList();
|
|
|
|
|
},
|
|
|
|
|
handleDialogSelectionChange(val){
|
|
|
|
|
this.dialogData.multipleSelection = val;
|
|
|
|
|
},
|
|
|
|
|
handleSelectDialogConfirm(){
|
|
|
|
|
if (this.dialogData.multipleSelection < 1) {
|
|
|
|
|
this.$message({
|
|
|
|
|
message: '请选择一条记录',
|
|
|
|
|
type: 'warning',
|
|
|
|
|
duration: 1000
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
let selectProducts = [];
|
|
|
|
|
for (let i = 0; i < this.dialogData.multipleSelection.length; i++) {
|
|
|
|
|
selectProducts.push({
|
|
|
|
|
productId:this.dialogData.multipleSelection[i].id,
|
|
|
|
|
productName:this.dialogData.multipleSelection[i].name
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
this.$confirm('使用要进行添加操作?', '提示', {
|
|
|
|
|
confirmButtonText: '确定',
|
|
|
|
|
cancelButtonText: '取消',
|
|
|
|
|
type: 'warning'
|
|
|
|
|
}).then(() => {
|
|
|
|
|
createHotProduct(selectProducts).then(response=>{
|
|
|
|
|
this.selectDialogVisible=false;
|
|
|
|
|
this.dialogData.multipleSelection=[];
|
|
|
|
|
this.getList();
|
|
|
|
|
this.$message({
|
|
|
|
|
type: 'success',
|
|
|
|
|
message: '添加成功!'
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
handleEditSort(index,row){
|
|
|
|
|
this.sortDialogVisible=true;
|
|
|
|
|
this.sortDialogData.sort=row.sort;
|
|
|
|
|
this.sortDialogData.id=row.id;
|
|
|
|
|
},
|
|
|
|
|
handleUpdateSort(){
|
|
|
|
|
this.$confirm('是否要修改排序?', '提示', {
|
|
|
|
|
confirmButtonText: '确定',
|
|
|
|
|
cancelButtonText: '取消',
|
|
|
|
|
type: 'warning'
|
|
|
|
|
}).then(() => {
|
|
|
|
|
updateHotProductSort(this.sortDialogData).then(response=>{
|
|
|
|
|
this.sortDialogVisible=false;
|
|
|
|
|
this.getList();
|
|
|
|
|
this.$message({
|
|
|
|
|
type: 'success',
|
|
|
|
|
message: '删除成功!'
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
getList() {
|
|
|
|
|
this.listLoading = true;
|
|
|
|
|
fetchList(this.listQuery).then(response => {
|
|
|
|
|
this.listLoading = false;
|
|
|
|
|
this.list = response.data.list;
|
|
|
|
|
this.total = response.data.total;
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
updateRecommendStatusStatus(ids,status){
|
|
|
|
|
this.$confirm('是否要修改推荐状态?', '提示', {
|
|
|
|
|
confirmButtonText: '确定',
|
|
|
|
|
cancelButtonText: '取消',
|
|
|
|
|
type: 'warning'
|
|
|
|
|
}).then(() => {
|
|
|
|
|
let params=new URLSearchParams();
|
|
|
|
|
params.append("ids",ids);
|
|
|
|
|
params.append("recommendStatus",status);
|
|
|
|
|
updateRecommendStatus(params).then(response=>{
|
|
|
|
|
this.getList();
|
|
|
|
|
this.$message({
|
|
|
|
|
type: 'success',
|
|
|
|
|
message: '修改成功!'
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}).catch(() => {
|
|
|
|
|
this.$message({
|
|
|
|
|
type: 'success',
|
|
|
|
|
message: '已取消操作!'
|
|
|
|
|
});
|
|
|
|
|
this.getList();
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
deleteProduct(ids){
|
|
|
|
|
this.$confirm('是否要删除该推荐?', '提示', {
|
|
|
|
|
confirmButtonText: '确定',
|
|
|
|
|
cancelButtonText: '取消',
|
|
|
|
|
type: 'warning'
|
|
|
|
|
}).then(() => {
|
|
|
|
|
let params=new URLSearchParams();
|
|
|
|
|
params.append("ids",ids);
|
|
|
|
|
deleteHotProduct(params).then(response=>{
|
|
|
|
|
this.getList();
|
|
|
|
|
this.$message({
|
|
|
|
|
type: 'success',
|
|
|
|
|
message: '删除成功!'
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
getDialogList(){
|
|
|
|
|
fetchProductList(this.dialogData.listQuery).then(response=>{
|
|
|
|
|
this.dialogData.list=response.data.list;
|
|
|
|
|
this.dialogData.total=response.data.total;
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
<style></style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#abc
|
|
|
|
|
<template>
|
|
|
|
|
<!-- 整体页面内容的外层容器,用于组织和布局页面内的各个组件 -->
|
|
|
|
|
<div class="app-container">
|
|
|
|
|
<!-- 筛选搜索相关的卡片容器,设置无阴影效果,内部放置筛选搜索相关的元素 -->
|
|
|
|
|
<el-card class="filter-container" shadow="never">
|
|
|
|
|
<div>
|
|
|
|
|
<!-- 展示一个搜索图标,用于直观表示此区域与搜索功能相关 -->
|
|
|
|
|
<i class="el-icon-search"></i>
|
|
|
|
|
<span>筛选搜索</span>
|
|
|
|
|
<!-- 查询搜索按钮,右浮动显示,按钮类型为主要操作类型(样式上会突出显示),点击时触发 `handleSearchList` 方法,用于根据设置的筛选条件发起查询搜索操作,按钮尺寸为小型 -->
|
|
|
|
|
<el-button
|
|
|
|
|
style="float:right"
|
|
|
|
|
type="primary"
|
|
|
|
|
@click="handleSearchList()"
|
|
|
|
|
size="small">
|
|
|
|
|
查询搜索
|
|
|
|
|
</el-button>
|
|
|
|
|
<!-- 重置按钮,同样右浮动且设置了右边距,点击时触发 `handleResetSearch` 方法,用于将筛选条件重置为默认状态,按钮尺寸为小型 -->
|
|
|
|
|
<el-button
|
|
|
|
|
style="float:right;margin-right: 15px"
|
|
|
|
|
@click="handleResetSearch()"
|
|
|
|
|
size="small">
|
|
|
|
|
重置
|
|
|
|
|
</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="margin-top: 15px">
|
|
|
|
|
<!-- 内联表单,用于收集筛选条件,绑定的数据模型为 `listQuery`,表单尺寸为小型,标签宽度设置为140px -->
|
|
|
|
|
<el-form :inline="true" :model="listQuery" size="small" label-width="140px">
|
|
|
|
|
<!-- 商品名称筛选的表单项目,包含一个输入框,通过 `v-model` 双向绑定输入框的值到 `listQuery` 中的 `productName` 属性,输入框设置了特定样式类(可能用于控制宽度等样式),并带有提示文本 -->
|
|
|
|
|
<el-form-item label="商品名称:">
|
|
|
|
|
<el-input v-model="listQuery.productName" class="input-width" placeholder="商品名称"></el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<!-- 推荐状态筛选的表单项目,包含一个下拉选择框,通过 `v-model` 双向绑定选择框的值到 `listQuery` 中的 `recommendStatus` 属性,可清除已选选项,设置了占位文本与样式类,下拉选项通过循环 `recommendOptions` 数组动态生成 -->
|
|
|
|
|
<el-form-item label="推荐状态:">
|
|
|
|
|
<el-select v-model="listQuery.recommendStatus" placeholder="全部" clearable class="input-width">
|
|
|
|
|
<el-option v-for="item in recommendOptions"
|
|
|
|
|
:key="item.value"
|
|
|
|
|
:label="item.label"
|
|
|
|
|
:value="item.value">
|
|
|
|
|
</el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
</div>
|
|
|
|
|
</el-card>
|
|
|
|
|
<!-- 操作相关的卡片容器,同样无阴影效果,内部包含一些与数据列表操作相关的元素,比如选择商品按钮 -->
|
|
|
|
|
<el-card class="operate-container" shadow="never">
|
|
|
|
|
<i class="el-icon-tickets"></i>
|
|
|
|
|
<span>数据列表</span>
|
|
|
|
|
<!-- 选择商品按钮,尺寸为迷你型,点击时触发 `handleSelectProduct` 方法,用于打开选择商品的对话框 -->
|
|
|
|
|
<el-button size="mini" class="btn-add" @click="handleSelectProduct()">选择商品</el-button>
|
|
|
|
|
</el-card>
|
|
|
|
|
<!-- 表格容器,用于包裹展示数据列表的表格,使其在布局上与其他元素区分开来 -->
|
|
|
|
|
<div class="table-container">
|
|
|
|
|
<!-- 商品相关的数据列表表格,设置了引用名称方便在JavaScript中获取实例,绑定了数据来源为 `list`,宽度为100%,监听行选择变化事件、加载状态,并且显示表格边框 -->
|
|
|
|
|
<el-table ref="newProductTable"
|
|
|
|
|
:data="list"
|
|
|
|
|
style="width: 100%;"
|
|
|
|
|
@selection-change="handleSelectionChange"
|
|
|
|
|
v-loading="listLoading" border>
|
|
|
|
|
<!-- 选择列,用于在表格中显示复选框,方便进行多选操作,宽度为60px,内容居中对齐 -->
|
|
|
|
|
<el-table-column type="selection" width="60" align="center"></el-table-column>
|
|
|
|
|
<!-- 编号列,通过插槽获取对应行数据中的 `id` 属性值展示在单元格内,宽度为120px,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="编号" width="120" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.id}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<!-- 商品名称列,通过插槽获取对应行数据中的 `productName` 属性值展示在单元格内,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="商品名称" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.productName}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<!-- 是否推荐列,包含一个开关组件,用于切换商品的推荐状态,绑定了状态改变事件、设置了开关的开启和关闭对应的值,并且双向绑定到对应行数据中的 `recommendStatus` 属性 -->
|
|
|
|
|
<el-table-column label="是否推荐" width="200" align="center">
|
|
|
|
|
<template slot-scope="scope">
|
|
|
|
|
<el-switch
|
|
|
|
|
@change="handleRecommendStatusStatusChange(scope.$index, scope.row)"
|
|
|
|
|
:active-value="1"
|
|
|
|
|
:inactive-value="0"
|
|
|
|
|
v-model="scope.row.recommendStatus">
|
|
|
|
|
</el-switch>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<!-- 排序列,通过插槽获取对应行数据中的 `sort` 属性值展示在单元格内,宽度为160px,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="排序" width="160" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.sort}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<!-- 状态列,通过插槽获取对应行数据中的 `recommendStatus` 属性值,使用名为 `formatRecommendStatus` 的过滤器对其进行格式化处理后展示在单元格内,宽度为160px,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="状态" width="160" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.recommendStatus | formatRecommendStatus}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<!-- 操作列,在单元格内放置了两个文本按钮,分别用于设置排序(点击触发 `handleEditSort` 方法)和删除商品(点击触发 `handleDelete` 方法),宽度为180px,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="操作" width="180" align="center">
|
|
|
|
|
<template slot-scope="scope">
|
|
|
|
|
<el-button size="mini"
|
|
|
|
|
type="text"
|
|
|
|
|
@click="handleEditSort(scope.$index, scope.row)">设置排序
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button size="mini"
|
|
|
|
|
type="text"
|
|
|
|
|
@click="handleDelete(scope.$index, scope.row)">删除
|
|
|
|
|
</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
</div>
|
|
|
|
|
<!-- 批量操作相关的容器,内部放置用于选择批量操作类型的下拉框以及执行操作的按钮 -->
|
|
|
|
|
<div class="batch-operate-container">
|
|
|
|
|
<!-- 批量操作类型的下拉选择框,尺寸为小型,双向绑定选择的值到 `operateType` 属性,带有占位提示文本,下拉选项通过循环 `operates` 数组生成 -->
|
|
|
|
|
<el-select
|
|
|
|
|
size="small"
|
|
|
|
|
v-model="operateType" placeholder="批量操作">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="item in operates"
|
|
|
|
|
:key="item.value"
|
|
|
|
|
:label="item.label"
|
|
|
|
|
:value="item.value">
|
|
|
|
|
</el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
<!-- 执行批量操作的确定按钮,设置了左边距,添加了特定样式类,按钮类型为主要操作类型,尺寸为小型,点击时触发 `handleBatchOperate` 方法 -->
|
|
|
|
|
<el-button
|
|
|
|
|
style="margin-left: 20px"
|
|
|
|
|
class="search-button"
|
|
|
|
|
@click="handleBatchOperate()"
|
|
|
|
|
type="primary"
|
|
|
|
|
size="small">
|
|
|
|
|
确定
|
|
|
|
|
</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<!-- 分页容器,用于放置分页组件,实现数据列表的分页展示功能 -->
|
|
|
|
|
<div class="pagination-container">
|
|
|
|
|
<!-- 分页组件,设置了背景色使其更突出,绑定了每页显示数量改变和当前页码改变的事件处理方法,配置了分页布局包含多种功能按钮,绑定了每页显示数量、可选择的每页显示数量数组、当前页码以及总条数等相关属性 -->
|
|
|
|
|
<el-pagination
|
|
|
|
|
background
|
|
|
|
|
@size-change="handleSizeChange"
|
|
|
|
|
@current-change="handleCurrentChange"
|
|
|
|
|
layout="total, sizes,prev, pager, next,jumper"
|
|
|
|
|
:page-size="listQuery.pageSize"
|
|
|
|
|
:page-sizes="[5,10,15]"
|
|
|
|
|
:current-page.sync="listQuery.pageNum"
|
|
|
|
|
:total="total">
|
|
|
|
|
</el-pagination>
|
|
|
|
|
</div>
|
|
|
|
|
<!-- 选择商品的对话框组件,设置了标题、双向绑定显示状态以及宽度,用于展示可选择的商品列表等相关操作 -->
|
|
|
|
|
<el-dialog title="选择商品" :visible.sync="selectDialogVisible" width="50%">
|
|
|
|
|
<!-- 输入框用于输入商品名称搜索关键字,双向绑定输入的值到 `dialogData.listQuery.keyword` 属性,设置了宽度、外边距、尺寸以及占位提示文本,并且在输入框右侧有一个搜索图标按钮,点击触发 `handleSelectSearch` 方法 -->
|
|
|
|
|
<el-input v-model="dialogData.listQuery.keyword"
|
|
|
|
|
style="width: 250px;margin-bottom: 20px"
|
|
|
|
|
size="small"
|
|
|
|
|
placeholder="商品名称搜索">
|
|
|
|
|
<el-button slot="append" icon="el-icon-search" @click="handleSelectSearch()"></el-button>
|
|
|
|
|
</el-input>
|
|
|
|
|
<!-- 展示可选择商品数据列表的表格,绑定了数据来源,监听行选择变化事件,并且显示表格边框 -->
|
|
|
|
|
<el-table :data="dialogData.list"
|
|
|
|
|
@selection-change="handleDialogSelectionChange" border>
|
|
|
|
|
<!-- 选择列,用于在表格中显示复选框方便多选操作,宽度为60px,内容居中对齐 -->
|
|
|
|
|
<el-table-column type="selection" width="60" align="center"></el-table-column>
|
|
|
|
|
<!-- 商品名称列,通过插槽获取对应行数据中的 `name` 属性值展示在单元格内,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="商品名称" align="center">
|
|
|
|
|
<template slot-scope="scope">{{scope.row.name}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<!-- 货号列,通过插槽获取对应行数据中的 `productSn` 属性值,以特定格式(添加 "NO." 前缀)展示在单元格内,宽度为160px,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="货号" width="160" align="center">
|
|
|
|
|
<template slot-scope="scope">NO.{{scope.row.productSn}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<!-- 价格列,通过插槽获取对应行数据中的 `price` 属性值,以特定格式(添加 "¥" 前缀)展示在单元格内,宽度为120px,内容居中对齐 -->
|
|
|
|
|
<el-table-column label="价格" width="120" align="center">
|
|
|
|
|
<template slot-scope="scope">¥{{scope.row.price}}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
<div class="pagination-container">
|
|
|
|
|
<!-- 对话框内的分页组件,用于对可选择商品列表进行分页展示,同样配置了相关的事件处理方法、分页布局以及绑定了页码、每页显示数量、可选择的每页显示数量数组和总条数等属性 -->
|
|
|
|
|
<el-pagination
|
|
|
|
|
background
|
|
|
|
|
@size-change="handleDialogSizeChange"
|
|
|
|
|
@current-change="handleDialogCurrentChange"
|
|
|
|
|
layout="prev, pager, next"
|
|
|
|
|
:current-page.sync="dialogData.listQuery.pageNum"
|
|
|
|
|
:page-size="dialogData.listQuery.pageSize"
|
|
|
|
|
:page-sizes="[5,10,15]"
|
|
|
|
|
:total="dialogData.total">
|
|
|
|
|
</el-pagination>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="clear: both;"></div>
|
|
|
|
|
<div slot="footer">
|
|
|
|
|
<!-- 取消按钮,点击时隐藏对话框,尺寸为小型 -->
|
|
|
|
|
<el-button size="small" @click="selectDialogVisible = false">取 消</el-button>
|
|
|
|
|
<!-- 确定按钮,点击时触发 `handleSelectDialogConfirm` 方法,尺寸为小型,按钮类型为主要操作类型 -->
|
|
|
|
|
<el-button size="small" type="primary" @click="handleSelectDialogConfirm()">确 定</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
<!-- 设置排序的对话框组件,设置了标题、双向绑定显示状态以及宽度,内部包含用于输入排序值的表单 -->
|
|
|
|
|
<el-dialog title="设置排序"
|
|
|
|
|
:visible.sync="sortDialogVisible"
|
|
|
|
|
width="40%">
|
|
|
|
|
<!-- 表单用于输入排序相关的值,绑定的数据模型为 `sortDialogData`,标签宽度为150px -->
|
|
|
|
|
<el-form :model="sortDialogData"
|
|
|
|
|
label-width="150px">
|
|
|
|
|
<!-- 排序值的表单项目,包含一个输入框,通过 `v-model` 双向绑定输入框的值到 `sortDialogData` 中的 `sort` 属性,输入框设置了宽度 -->
|
|
|
|
|
<el-form-item label="排序:">
|
|
|
|
|
<el-input v-model="sortDialogData.sort" style="width: 200px"></el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<span slot="footer">
|
|
|
|
|
<!-- 取消按钮,点击时隐藏对话框,尺寸为小型 -->
|
|
|
|
|
<el-button @click="sortDialogVisible = false" size="small">取 消</el-button>
|
|
|
|
|
<!-- 确定按钮,点击时触发 `handleUpdateSort` 方法,尺寸为小型,按钮类型为主要操作类型 -->
|
|
|
|
|
<el-button type="primary" @click="handleUpdateSort" size="small">确 定</el-button>
|
|
|
|
|
</span>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script>
|
|
|
|
|
// 从 '@/api/hotProduct' 模块中导入多个函数,这些函数用于与后端 API 进行交互,实现对热门商品(hotProduct)相关数据的不同操作。
|
|
|
|
|
// fetchList 函数用于获取热门商品列表数据,根据传入的查询参数(如筛选条件等)从后端获取相应的热门商品数据列表。
|
|
|
|
|
// updateRecommendStatus 函数用于更新热门商品的推荐状态,需要传入相关参数告知后端要更新哪些商品以及更新后的推荐状态值。
|
|
|
|
|
// deleteHotProduct 函数用于删除指定的热门商品记录,通过传入对应的商品标识(如 ID 列表等)告知后端要删除的数据。
|
|
|
|
|
// createHotProduct 函数用于向热门商品列表中添加新的商品记录,需传入包含新商品相关信息的对象,与后端交互完成添加操作。
|
|
|
|
|
// updateHotProductSort 函数用于更新热门商品的排序信息,传入相应的参数(如包含商品 ID 和新排序值的对象)来实现排序的修改操作。
|
|
|
|
|
import {fetchList, updateRecommendStatus, deleteHotProduct, createHotProduct, updateHotProductSort} from '@/api/hotProduct';
|
|
|
|
|
// 从 '@/api/product' 模块中导入名为 fetchList 的函数,并将其重命名为 fetchProductList,该函数用于获取普通商品列表数据,可能用于在选择商品等相关操作中获取可供选择的商品信息。
|
|
|
|
|
import {fetchList as fetchProductList} from '@/api/product';
|
|
|
|
|
|
|
|
|
|
// 定义一个名为 defaultListQuery 的对象,用于设置默认的查询参数,作为获取热门商品列表时的初始查询条件。
|
|
|
|
|
// pageNum 属性初始值设为 1,表示默认查询第一页的数据。
|
|
|
|
|
// pageSize 属性初始值设为 5,代表每页默认显示 5 条商品记录。
|
|
|
|
|
// productName 属性初始设为 null,意味着初始时没有按商品名称进行筛选的条件,等待用户输入具体名称来筛选商品。
|
|
|
|
|
// recommendStatus 属性初始设为 null,同样表示初始时没有按推荐状态进行筛选的条件,后续可根据用户选择来设置相应的推荐状态筛选条件。
|
|
|
|
|
const defaultListQuery = {
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 5,
|
|
|
|
|
productName: null,
|
|
|
|
|
recommendStatus: null
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 定义一个名为 defaultRecommendOptions 的数组,数组内包含多个对象,用于设置商品推荐状态的可选选项,每个对象包含 label(显示给用户的文本)和 value(实际对应的值)两个属性。
|
|
|
|
|
// 这里定义了两种推荐状态选项,分别是“未推荐”对应值为 0,“推荐中”对应值为 1,用于下拉选择框等组件展示给用户选择商品的推荐状态筛选条件。
|
|
|
|
|
const defaultRecommendOptions = [
|
|
|
|
|
{
|
|
|
|
|
label: '未推荐',
|
|
|
|
|
value: 0
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: '推荐中',
|
|
|
|
|
value: 1
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
name: 'hotProductList',
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
// listQuery 属性用于存储当前的查询参数,初始通过 Object.assign 将其赋值为 defaultListQuery 的副本,确保每次操作开始时查询参数有默认的初始状态,后续会根据用户在页面上的操作(如筛选、翻页等)动态更新其属性值,用于向后端请求获取符合条件的热门商品列表数据。
|
|
|
|
|
listQuery: Object.assign({}, defaultListQuery),
|
|
|
|
|
// recommendOptions 属性用于存储商品推荐状态的可选选项,同样初始赋值为 defaultRecommendOptions 的副本,为下拉选择框等组件提供默认的推荐状态选项数据,保证数据的独立性和初始状态的一致性。
|
|
|
|
|
recommendOptions: Object.assign({}, defaultRecommendOptions),
|
|
|
|
|
// list 属性用于存储从后端获取到的热门商品数据列表,初始值设为 null,在调用 getList 方法并成功获取数据后,会将获取到的实际数据赋值给它,以便在页面的表格等组件中展示相应的热门商品信息。
|
|
|
|
|
list: null,
|
|
|
|
|
// total 属性用于存储热门商品数据的总条数,初始设为 null,在获取数据成功后会将后端返回的总条数赋值给它,可用于分页组件等地方展示总共有多少条热门商品记录,方便用户了解数据规模。
|
|
|
|
|
total: null,
|
|
|
|
|
// listLoading 属性是一个布尔值,用于标识当前是否正在从后端加载热门商品的数据,初始设为 false,表示未处于加载状态,当发起获取数据请求时将其设为 true,数据加载完成后再设回 false,可结合页面上的加载提示元素(如加载动画)向用户展示数据加载情况。
|
|
|
|
|
listLoading: false,
|
|
|
|
|
// multipleSelection 属性用于存储用户在页面表格中多选的热门商品记录数据,初始值为空数组,每当表格中的行选择状态发生变化(如用户勾选或取消勾选行)时,会更新该数组的值,方便后续进行批量操作等基于多选记录的处理逻辑。
|
|
|
|
|
multipleSelection: [],
|
|
|
|
|
// operates 属性是一个数组,数组内包含多个对象,用于定义可进行的批量操作类型及对应的显示文本和实际值,每个对象的 label 属性为显示给用户的操作名称(如“设为推荐”“取消推荐”“删除”),value 属性为对应的操作类型标识值(分别为 0、1、2),用于下拉选择框等组件展示给用户选择批量操作类型,进而根据用户选择执行相应的批量操作逻辑。
|
|
|
|
|
operates: [
|
|
|
|
|
{
|
|
|
|
|
label: "设为推荐",
|
|
|
|
|
value: 0
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: "取消推荐",
|
|
|
|
|
value: 1
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: "删除",
|
|
|
|
|
value: 2
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
// operateType 属性用于存储用户当前选择的批量操作类型,初始值设为 null,等待用户在页面上通过下拉选择框选择具体的批量操作类型后,将对应的 value 值赋值给它,以便后续在执行批量操作的方法中根据该值判断要执行的具体操作逻辑。
|
|
|
|
|
operateType: null,
|
|
|
|
|
// selectDialogVisible 属性是一个布尔值,用于控制选择商品对话框的显示状态,初始设为 false,表示对话框默认是隐藏的,当需要打开对话框进行选择商品相关操作时(如点击“选择商品”按钮),会将其值改为 true,使其显示出来。
|
|
|
|
|
selectDialogVisible: false,
|
|
|
|
|
// dialogData 属性是一个对象,用于存储与选择商品对话框相关的数据信息,包括对话框内展示的商品列表、总条数、用户在对话框表格中多选的记录以及查询参数等。
|
|
|
|
|
dialogData: {
|
|
|
|
|
list: null,
|
|
|
|
|
total: null,
|
|
|
|
|
multipleSelection: [],
|
|
|
|
|
listQuery: {
|
|
|
|
|
keyword: null,
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 5
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// sortDialogVisible 属性是一个布尔值,用于控制设置排序对话框的显示状态,初始设为 false,意味着对话框默认隐藏,当用户点击相关操作按钮(如“设置排序”按钮)时,会将其值改为 true,使对话框显示出来,方便用户输入排序相关信息。
|
|
|
|
|
sortDialogVisible: false,
|
|
|
|
|
// sortDialogData 属性是一个对象,用于存储设置排序对话框内相关的数据信息,初始包含 sort(排序值,初始设为 0)和 id(商品 ID,初始设为 null)两个属性,在打开对话框时会根据要设置排序的具体商品信息更新其值,最终将该对象作为参数传递给后端更新排序的函数,完成排序修改操作。
|
|
|
|
|
sortDialogData: {sort: 0, id: null}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
created() {
|
|
|
|
|
// 在组件创建完成后,立即调用 getList 方法,该方法用于向后端请求获取热门商品列表数据,实现页面初次加载时展示已有热门商品信息的功能,确保页面能及时显示相应的数据内容。
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
filters: {
|
|
|
|
|
// 定义一个名为 formatRecommendStatus 的过滤器函数,用于对商品推荐状态的数据进行格式化处理,使其以更易读的文本形式展示在页面上。
|
|
|
|
|
// 如果传入的 status 参数值为 1,表示商品处于推荐中状态,此时函数返回“推荐中”文本;如果 status 值不为 1(即其他情况,这里主要指 0,表示未推荐状态),则返回“未推荐”文本,通过这个过滤器可以将后端返回的推荐状态数值转换为直观易懂的文字描述展示给用户。
|
|
|
|
|
formatRecommendStatus(status) {
|
|
|
|
|
if (status === 1) {
|
|
|
|
|
return '推荐中';
|
|
|
|
|
} else {
|
|
|
|
|
return '未推荐';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
// handleResetSearch 方法用于处理重置筛选条件的操作,通过将 listQuery 属性重新赋值为 defaultListQuery 的副本,将所有筛选条件恢复到初始默认状态,方便用户重新进行筛选操作,清除之前设置的各种筛选条件(如商品名称、推荐状态等)。
|
|
|
|
|
handleResetSearch() {
|
|
|
|
|
this.listQuery = Object.assign({}, defaultListQuery);
|
|
|
|
|
},
|
|
|
|
|
// handleSearchList 方法用于处理点击“查询搜索”按钮的操作逻辑。
|
|
|
|
|
// 首先将 listQuery 对象中的 pageNum 属性设为 1,即重置为查询第一页的数据,然后调用 getList 方法,根据更新后的查询参数(可能包含用户之前设置的其他筛选条件等)向后端发起获取热门商品列表数据的请求,用于重新获取符合当前筛选条件的热门商品信息,实现根据用户筛选条件查询数据的功能。
|
|
|
|
|
handleSearchList() {
|
|
|
|
|
this.listQuery.pageNum = 1;
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
// handleSelectionChange 方法用于处理页面表格中行选择状态改变的事件,接收一个参数 val,该参数传递的是当前表格中被选中行的数据(或相关信息),将其赋值给 multipleSelection 属性,使得 multipleSelection 数组始终保持与用户在表格中的实际选择情况一致,方便后续基于多选记录进行批量操作等逻辑处理。
|
|
|
|
|
handleSelectionChange(val) {
|
|
|
|
|
this.multipleSelection = val;
|
|
|
|
|
},
|
|
|
|
|
// handleSizeChange 方法用于处理分页组件中每页显示数量改变的事件,接收一个参数 val,该参数表示用户选择的新的每页显示数量。
|
|
|
|
|
// 首先将 listQuery 对象中的 pageNum 属性设为 1,即重置为查询第一页的数据,然后将 listQuery 对象的 pageSize 属性更新为传入的 val 值,最后调用 getList 方法,根据更新后的查询参数(包含新的每页显示数量和可能存在的其他筛选条件等)向后端发起获取热门商品列表数据的请求,用于重新获取按照新的每页显示数量分页后的热门商品信息,实现分页功能中每页显示数量改变时的数据更新操作。
|
|
|
|
|
handleSizeChange(val) {
|
|
|
|
|
this.listQuery.pageNum = 1;
|
|
|
|
|
this.listQuery.pageSize = val;
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
// handleCurrentChange 方法用于处理分页组件中当前页码改变的事件,接收一个参数 val,该参数表示用户选择的新的当前页码。
|
|
|
|
|
// 将 listQuery 对象中的 pageNum 属性更新为传入的 val 值,然后调用 getList 方法,根据更新后的查询参数(包含新的当前页码和可能存在的其他筛选条件等)向后端发起获取热门商品列表数据的请求,用于重新获取对应页码的数据内容,实现分页功能中切换页码时的数据更新操作。
|
|
|
|
|
handleCurrentChange(val) {
|
|
|
|
|
this.listQuery.pageNum = val;
|
|
|
|
|
this.getList();
|
|
|
|
|
},
|
|
|
|
|
// handleRecommendStatusStatusChange 方法用于处理商品推荐状态开关改变的操作,接收当前行的索引 index 和对应行的数据对象 row 作为参数,调用 updateRecommendStatusStatus 方法,并传入当前商品的 ID(row.id)以及当前商品新的推荐状态值(row.recommendStatus),用于向后端发起更新该商品推荐状态的请求,实现商品推荐状态的实时修改功能。
|
|
|
|
|
handleRecommendStatusStatusChange(index, row) {
|
|
|
|
|
this.updateRecommendStatusStatus(row.id, row.recommendStatus);
|
|
|
|
|
},
|
|
|
|
|
// handleDelete 方法用于处理点击“删除”按钮的操作逻辑,接收当前行的索引 index 和对应行的数据对象 row 作为参数,调用 deleteProduct 方法,并传入要删除商品的 ID(row.id),用于向后端发起删除该商品记录的请求,实现删除单个商品记录的功能。
|
|
|
|
|
handleDelete(index, row) {
|
|
|
|
|
this.deleteProduct(row.id);
|
|
|
|
|
},
|
|
|
|
|
// handleBatchOperate 方法用于处理批量操作的逻辑,当用户在页面上选择了批量操作类型并点击“确定”按钮时触发该方法。
|
|
|
|
|
// 首先判断 multipleSelection 数组的长度是否小于 1,如果是,表示用户没有选择任何要进行批量操作的商品记录,此时会弹出一个提示消息,告知用户“请选择一条记录”,提示类型为 warning(警告类型,样式上会比较醒目),持续时间为 1000 毫秒(1 秒),然后直接返回,不执行后续操作。
|
|
|
|
|
// 如果用户选择了商品记录(multipleSelection 数组有元素),则通过循环将 multipleSelection 数组中每个元素的 id 属性值提取出来,存入 ids 数组中,用于后续根据选择的批量操作类型对这些商品进行相应的批量操作。
|
|
|
|
|
// 接着通过判断 operateType 属性的值来确定要执行的具体批量操作:
|
|
|
|
|
// 如果 operateType 值为 0,表示用户选择的是“设为推荐”操作,调用 updateRecommendStatusStatus 方法,传入 ids 数组(包含要操作的商品 ID)和值为 1(代表推荐状态为推荐中)的参数,向后端发起将这些商品设为推荐状态的请求。
|
|
|
|
|
// 如果 operateType 值为 1,表示用户选择的是“取消推荐”操作,调用 updateRecommendStatusStatus 方法,传入 ids 数组和值为 0(代表推荐状态为未推荐)的参数,向后端发起将这些商品取消推荐状态的请求。
|
|
|
|
|
// 如果 operateType 值为 2,表示用户选择的是“删除”操作,调用 deleteProduct 方法,传入 ids 数组,向后端发起删除这些商品记录的请求。
|
|
|
|
|
// 如果 operateType 不是上述 0、1、2 中的任何值,表示用户没有选择正确的批量操作类型,此时会弹出提示消息,告知用户“请选择批量操作类型”,提示类型为 warning,持续时间为 1000 毫秒。
|
|
|
|
|
handleBatchOperate() {
|
|
|
|
|
if (this.multipleSelection < 1) {
|
|
|
|
|
this.$message({
|
|
|
|
|
message: '请选择一条记录',
|
|
|
|
|
type: 'warning',
|
|
|
|
|
duration: 1000
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
let ids = [];
|
|
|
|
|
for (let i = 0; i < this.multipleSelection.length; i++) {
|
|
|
|
|
ids.push(this.multipleSelection[i].id);
|
|
|
|
|
}
|
|
|
|
|
if (this.operateType === 0) {
|
|
|
|
|
//设为推荐
|
|
|
|
|
this.updateRecommendStatusStatus(ids, 1);
|
|
|
|
|
} else if (this.operateType === 1) {
|
|
|
|
|
//取消推荐
|
|
|
|
|
this.updateRecommendStatusStatus(ids, 0);
|
|
|
|
|
} else if (this.operateType === 2) {
|
|
|
|
|
//删除
|
|
|
|
|
this.updateRecommendStatusStatus(ids, 2);
|
|
|
|
|
} else {
|
|
|
|
|
this.$message({
|
|
|
|
|
message: '请选择批量操作类型',
|
|
|
|
|
type: 'warning',
|
|
|
|
|
duration: 1000
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// handleSelectProduct 方法用于处理点击“选择商品”按钮的操作逻辑,将 selectDialogVisible 属性设为 true,使选择商品的对话框显示出来,方便用户进行选择商品的操作,同时调用 getDialogList 方法,用于获取并展示对话框内可供选择的商品列表数据,确保对话框打开时能正确显示商品信息。
|
|
|
|
|
handleSelectProduct() {
|
|
|
|
|
this.selectDialogVisible = true;
|
|
|
|
|
this.getDialogList();
|
|
|
|
|
},
|
|
|
|
|
// handleSelectSearch 方法用于处理在选择商品对话框内点击搜索按钮的操作逻辑,调用 getDialogList 方法,根据用户在对话框输入框中输入的搜索关键字等查询条件(存储在 dialogData.listQuery.keyword 等属性中)向后端发起获取商品列表数据的请求,用于更新并展示符合搜索条件的商品列表信息,实现对话框内的搜索功能。
|
|
|
|
|
handleSelectSearch() {
|
|
|
|
|
this.getDialogList();
|
|
|
|
|
},
|
|
|
|
|
// handleDialogSizeChange 方法用于处理选择商品对话框内分页组件中每页显示数量改变的事件,接收一个参数 val,该参数表示用户选择的新的每页显示数量。
|
|
|
|
|
// 首先将 dialogData.listQuery 对象中的 pageNum 属性设为 1,即重置为查询第一页的数据,然后将 dialogData.listQuery 对象的 pageSize 属性更新为传入的 val 值,最后调用 getDialogList 方法,根据更新后的查询参数(包含新的每页显示数量和可能存在的其他筛选条件等)向后端发起获取商品列表数据的请求,用于重新获取按照新的每页显示数量分页后的商品信息,实现对话框内分页功能中每页显示数量改变时的数据更新操作。
|
|
|
|
|
handleDialogSizeChange(val) {
|
|
|
|
|
this.dialogData.listQuery.pageNum = 1;
|
|
|
|
|
this.dialogData.listQuery.pageSize = val;
|
|
|
|
|
this.getDialogList();
|
|
|
|
|
},
|
|
|
|
|
// handleDialogCurrentChange 方法用于处理选择商品对话框内分页组件中当前页码改变的事件,接收一个参数 val,该参数表示用户选择的新的当前页码。
|
|
|
|
|
// 将 dialogData.listQuery 对象中的 pageNum 属性更新为传入的 val 值,然后调用 getDialogList 方法,根据更新后的查询参数(包含新的当前页码和可能存在的其他筛选条件等)向后端发起获取商品列表数据的请求,用于重新获取对应页码的数据内容,实现对话框内分页功能中切换页码时的数据更新操作。
|
|
|
|
|
|