2025008071805

This commit is contained in:
张潘 2025-08-24 18:06:22 +08:00
parent 2892ce9efc
commit f1e33acac9
34 changed files with 738 additions and 13160 deletions

View File

@ -1,475 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入市场价"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input
v-model="queryParams.tags"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="市场价" align="center" width="75" prop="price">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'price', '市场价')">{{ scope.row.price }}</span>
<svg @click="openEditDialog(scope.row, 'price', '市场价')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="积分" align="center" width="75" prop="num">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'num', '积分')">{{ scope.row.num }}</span>
<svg @click="openEditDialog(scope.row, 'num', '积分')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
const newRow = { ...this.editRow, [this.editField]: this.editFieldValue };
try {
await this.$API.updateIntegralProduct(newRow); // updateIntegralProduct API
this.editRow[this.editField] = this.editFieldValue;
this.$message.success('修改成功');
this.editDialogVisible = false;
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,483 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入市场价"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input
v-model="queryParams.tags"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="市场价" align="center" width="75" prop="price">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'price', '市场价')">{{ scope.row.price }}</span>
<svg @click="openEditDialog(scope.row, 'price', '市场价')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="积分" align="center" width="75" prop="num">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'num', '积分')">{{ scope.row.num }}</span>
<svg @click="openEditDialog(scope.row, 'num', '积分')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,483 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入市场价"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input
v-model="queryParams.tags"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="市场价" align="center" width="75" prop="price">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'price', '市场价')">{{ scope.row.price }}</span>
<svg @click="openEditDialog(scope.row, 'price', '市场价')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="积分" align="center" width="75" prop="num">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'num', '积分')">{{ scope.row.num }}</span>
<svg @click="openEditDialog(scope.row, 'num', '积分')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,483 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入市场价"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input
v-model="queryParams.tags"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="市场价" align="center" width="75" prop="price">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'price', '市场价')">{{ scope.row.price }}</span>
<svg @click="openEditDialog(scope.row, 'price', '市场价')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="积分" align="center" width="75" prop="num">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'num', '积分')">{{ scope.row.num }}</span>
<svg @click="openEditDialog(scope.row, 'num', '积分')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,549 +0,0 @@
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入市场价"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input
v-model="queryParams.tags"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入市场价"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input
v-model="queryParams.tags"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="市场价" align="center" width="75" prop="price">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'price', '市场价')">{{ scope.row.price }}</span>
<svg @click="openEditDialog(scope.row, 'price', '市场价')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="积分" align="center" width="75" prop="num">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'num', '积分')">{{ scope.row.num }}</span>
<svg @click="openEditDialog(scope.row, 'num', '积分')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,512 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input
v-model="queryParams.price"
placeholder="请输入市场价"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input
v-model="queryParams.tags"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="市场价" align="center" width="75" prop="price">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'price', '市场价')">{{ scope.row.price }}</span>
<svg @click="openEditDialog(scope.row, 'price', '市场价')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="积分" align="center" width="75" prop="num">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'num', '积分')">{{ scope.row.num }}</span>
<svg @click="openEditDialog(scope.row, 'num', '积分')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,516 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="市场价" align="center" width="75" prop="price">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'price', '市场价')">{{ scope.row.price }}</span>
<svg @click="openEditDialog(scope.row, 'price', '市场价')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="积分" align="center" width="75" prop="num">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'num', '积分')">{{ scope.row.num }}</span>
<svg @click="openEditDialog(scope.row, 'num', '积分')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,522 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>

View File

@ -1,529 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style >
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,529 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style >
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,529 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input[type="number"]::-webkit-inner-spin-button,
.number-input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,529 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input input[type="number"]::-webkit-inner-spin-button,
.number-input input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,529 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input input[type="number"]::-webkit-inner-spin-button,
.number-input input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,529 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input input[type="number"]::-webkit-inner-spin-button,
.number-input input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,532 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input{
color: #000;
}
.number-input input[type="number"]::-webkit-inner-spin-button,
.number-input input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,532 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input{
color: #000;
}
.number-input .el-input__inner[type="number"]::-webkit-inner-spin-button,
.number-input .el-input__inner[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,532 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input{
color: #000;
}
.number-input :deep(.el-input__inner[type="number"]::-webkit-inner-spin-button),
.number-input :deep(.el-input__inner[type="number"]::-webkit-outer-spin-button) {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,535 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input{
color: #000;
}
.number-input :deep(.el-input__inner) {
color: #000;
}
.number-input :deep(.el-input__inner[type="number"]::-webkit-inner-spin-button),
.number-input :deep(.el-input__inner[type="number"]::-webkit-outer-spin-button) {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,535 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input{
color: #000;
}
.number-input .el-input__inner {
color: #000;
}
.number-input :deep(.el-input__inner[type="number"]::-webkit-inner-spin-button),
.number-input :deep(.el-input__inner[type="number"]::-webkit-outer-spin-button) {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,535 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input{
color: #000;
}
.number-input ::v-deep .el-input__inner {
color: #000;
}
.number-input :deep(.el-input__inner[type="number"]::-webkit-inner-spin-button),
.number-input :deep(.el-input__inner[type="number"]::-webkit-outer-spin-button) {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,535 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input{
color: #000;
}
.number-input ::v-deep .el-input__inner {
color: #000;
}
.number-input :deep(.el-input__inner[type="number"]::-webkit-inner-spin-button),
.number-input :deep(.el-input__inner[type="number"]::-webkit-outer-spin-button) {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,530 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-inner-spin-button,
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,530 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" class="number-input" type="number" placeholder="最小值" clearable style="width: 80px;" />
-
<el-input v-model="queryParams.maxNum" class="number-input" type="number" placeholder="最大值" clearable style="width: 80px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-inner-spin-button,
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,530 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxNum" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-inner-spin-button,
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -1,531 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxPrice" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" class="number-input" type="number" placeholder="最小值" clearable style="width: 120px;" />
-
<el-input v-model="queryParams.maxNum" class="number-input" type="number" placeholder="最大值" clearable style="width: 120px;" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input
v-model="queryParams.cateId"
placeholder="请输入分类"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<!-- 新增状态 -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<!-- 新增创建时间范围 -->
<el-form-item label="创建时间">
<el-date-picker
v-model="queryParams.beginTime"
type="date"
placeholder="开始日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
-
<el-date-picker
v-model="queryParams.endTime"
type="date"
placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:IntegralProduct:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:IntegralProduct:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="IntegralProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" width="55" prop="id" />
<el-table-column label="分类" align="center" prop="cateName" />
<el-table-column label="名称" align="center" prop="title" />
<el-table-column label="主图" align="center" prop="image" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.image" :width="50" :height="50"/>
</template>
</el-table-column>
<!-- 市场价范围 -->
<el-form-item label="市场价">
<el-input v-model="queryParams.minPrice" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
-
<el-input v-model="queryParams.maxPrice" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d\\.]/g,'')" />
</el-form-item>
<!-- 积分范围 -->
<el-form-item label="积分">
<el-input v-model="queryParams.minNum" placeholder="最小值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
-
<el-input v-model="queryParams.maxNum" placeholder="最大值" style="width: 80px;" oninput="value=value.replace(/[^\\d]/g,'')" />
</el-form-item>
<el-table-column label="排序" align="center" width="75" prop="sort">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sort', '排序')">{{ scope.row.sort }}</span>
<svg @click="openEditDialog(scope.row, 'sort', '排序')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="销量" align="center" width="75" prop="sales">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'sales', '销量')">{{ scope.row.sales }}</span>
<svg @click="openEditDialog(scope.row, 'sales', '销量')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="库存" align="center" width="75" prop="stock">
<template slot-scope="scope">
<div style="cursor:pointer;color:#409EFF;display:inline-block;">
<span @click="openEditDialog(scope.row, 'stock', '库存')">{{ scope.row.stock }}</span>
<svg @click="openEditDialog(scope.row, 'stock', '库存')" width="14" height="14" viewBox="0 0 1024 1024" fill="#bbb" style="margin-left:4px;vertical-align:middle;cursor:pointer;"><path d="M880.64 227.84l-84.48-84.48c-25.6-25.6-67.2-25.6-92.8 0l-59.52 59.52 177.28 177.28 59.52-59.52c25.6-25.6 25.6-67.2 0-92.8zM160 736v128h128l376.32-376.32-128-128L160 736z"/></svg>
<div style="border-bottom:1px dashed #bbb;width:100%;margin-top:2px;"></div>
</div>
</template>
</el-table-column>
<el-table-column label="状态" width="85" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updatedAt" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:IntegralProduct:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:IntegralProduct:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改积分商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="65%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="市场价" prop="price">
<el-input v-model="form.price" placeholder="请输入市场价" />
</el-form-item>
<el-form-item label="积分" prop="num">
<el-input v-model="form.num" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="销量" prop="sales">
<el-input v-model="form.sales" placeholder="请输入销量" />
</el-form-item>
<el-form-item label="库存" prop="stock">
<el-input v-model="form.stock" placeholder="请输入库存" />
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
</el-form-item>
<el-form-item label="分类" prop="cateId">
<el-input v-model="form.cateId" placeholder="请输入分类" />
</el-form-item>
<el-form-item label="规格" prop="sku">
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="详情">
<editor v-model="form.contetnt" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="editDialogVisible" title="编辑" width="300px">
<el-form>
<el-form-item :label="editFieldLabel">
<el-input v-model="editFieldValue" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEditField">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listIntegralProduct, getIntegralProduct, delIntegralProduct, addIntegralProduct, updateIntegralProduct,changetypeStatus } from "@/api/system/IntegralProduct"
export default {
name: "IntegralProduct",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
IntegralProductList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: null,
price: null,
status: null,
tags: null,
//
minPrice: null,
maxPrice: null,
beginTime: null,
endTime: null,
//
minNum: null,
maxNum: null,
cateId: null,
skuType: null,
},
//
form: {},
//
rules: {
title: [
{ required: true, message: "名称不能为空", trigger: "blur" }
],
price: [
{ required: true, message: "市场价不能为空", trigger: "blur" }
],
num: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
sales: [
{ required: true, message: "销量不能为空", trigger: "blur" }
],
stock: [
{ required: true, message: "库存不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "blur" }
],
cateId: [
{ required: true, message: "分类不能为空", trigger: "blur" }
],
skuType: [
{ required: true, message: "1单规格 2多规格不能为空", trigger: "change" }
],
sku: [
{ required: true, message: "规格不能为空", trigger: "blur" }
],
},
editDialogVisible: false,
editFieldValue: '',
editField: '',
editFieldLabel: '',
editRow: null,
}
},
created() {
this.getList()
},
methods: {
/** 查询积分商品列表 */
getList() {
this.loading = true
listIntegralProduct(this.queryParams).then(response => {
this.IntegralProductList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
title: null,
image: null,
images: null,
price: null,
num: null,
sort: null,
sales: null,
stock: null,
status: null,
tags: null,
cateId: null,
skuType: null,
sku: null,
contetnt: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
//
if (this.queryParams.minPrice !== null && this.queryParams.maxPrice !== null && this.queryParams.minPrice > this.queryParams.maxPrice) {
this.$message.warning("市场价范围不合法");
return;
}
if (this.queryParams.minNum !== null && this.queryParams.maxNum !== null && this.queryParams.minNum > this.queryParams.maxNum) {
this.$message.warning("积分范围不合法");
return;
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
return changetypeStatus(row.id, row.status)
}).then(() => {
this.$modal.msgSuccess(text + "成功")
}).catch(function() {
row.status = row.status === "0" ? "1" : "0"
})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加积分商品"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getIntegralProduct(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改积分商品"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addIntegralProduct(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除积分商品编号为"' + ids + '"的数据项?').then(function() {
return delIntegralProduct(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/IntegralProduct/export', {
...this.queryParams
}, `IntegralProduct_${new Date().getTime()}.xlsx`)
},
openEditDialog(row, field, label) {
this.editRow = row;
this.editField = field;
this.editFieldLabel = label;
this.editFieldValue = row[field];
this.editDialogVisible = true;
},
async saveEditField() {
if (!this.editRow) return;
//
const numberFields = ['price', 'num', 'sort', 'sales', 'stock'];
const value = numberFields.includes(this.editField)
? Number(this.editFieldValue)
: this.editFieldValue;
const payload = {
id: this.editRow.id,
[this.editField]: value
};
try {
await updateIntegralProduct(payload);
this.$message.success('修改成功');
this.editDialogVisible = false;
this.getList();
} catch (e) {
this.$message.error('修改失败');
}
},
}
}
</script>
<style scoped>
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-inner-spin-button,
.number-input ::v-deep .el-input__inner[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
</style>

View File

@ -3,6 +3,8 @@ package com.ruoyi.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.ControllerUtil.AppletControllerUtil;
import com.ruoyi.system.domain.IntegralCate;
import com.ruoyi.system.service.IIntegralCateService;
import org.springframework.security.access.prepost.PreAuthorize;
@ -48,6 +50,7 @@ public class IntegralProductController extends BaseController
startPage();
List<IntegralProduct> list = integralProductService.selectIntegralProductList(integralProduct);
for(IntegralProduct data:list){
data.setImage(AppletControllerUtil.buildImageUrl(data.getImage()));
IntegralCate integralCate=integralCateService.selectIntegralCateById(data.getCateId());
if(integralCate!=null){
data.setCateName(integralCate.getTitle());
@ -80,7 +83,24 @@ public class IntegralProductController extends BaseController
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(integralProductService.selectIntegralProductById(id));
IntegralProduct serviceGoods = integralProductService.selectIntegralProductById(id);
serviceGoods.setImage(AppletControllerUtil.buildImageUrl(serviceGoods.getImage()));
if (serviceGoods.getSkuType()==null){
serviceGoods.setSkuType(1L);
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
serviceGoods.setSku(jsonObject.toJSONString());
integralProductService.updateIntegralProduct(serviceGoods);
}
if (serviceGoods.getSku()!=null){
if (serviceGoods.getSku().equals("{}")){
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
serviceGoods.setSku(jsonObject.toJSONString());
integralProductService.updateIntegralProduct(serviceGoods);
}
}
return success(serviceGoods);
}
@ -102,6 +122,21 @@ public class IntegralProductController extends BaseController
@PostMapping
public AjaxResult add(@RequestBody IntegralProduct integralProduct)
{
if (integralProduct.getSkuType()==null){
integralProduct.setSkuType(1L);
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
integralProduct.setSku(jsonObject.toJSONString());
integralProductService.updateIntegralProduct(integralProduct);
}
if (integralProduct.getSku()!=null){
if (integralProduct.getSku().equals("{}")){
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
integralProduct.setSku(jsonObject.toJSONString());
integralProductService.updateIntegralProduct(integralProduct);
}
}
return toAjax(integralProductService.insertIntegralProduct(integralProduct));
}
@ -113,6 +148,22 @@ public class IntegralProductController extends BaseController
@PutMapping
public AjaxResult edit(@RequestBody IntegralProduct integralProduct)
{
if (integralProduct.getSkuType()==null){
integralProduct.setSkuType(1L);
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
integralProduct.setSku(jsonObject.toJSONString());
integralProductService.updateIntegralProduct(integralProduct);
}
if (integralProduct.getSku()!=null){
if (integralProduct.getSku().equals("{}")){
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
integralProduct.setSku(jsonObject.toJSONString());
integralProductService.updateIntegralProduct(integralProduct);
}
}
return toAjax(integralProductService.updateIntegralProduct(integralProduct));
}

View File

@ -1,6 +1,7 @@
package com.ruoyi.system.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -667,14 +668,25 @@ public class OrderController extends BaseController {
return error("订单不存在");
}
// 验证订单状态
if (order.getStatus() != 1) {
return error("只有待接单状态的订单才能派单");
}
// // 验证订单状态
// if (order.getStatus() != 1) {
// return error("只有待接单状态的订单才能派单");
// }
if (order.getWorkerId()!=null){
//给师傅派单的时候的推送
ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(order.getProductId());
WXsendMsgUtil.sendMsgForWorkerInfo(users.getOpenid(), order, serviceGoods);
DispatchUtil.creatWorkerForOrder(order,users);
}else{
changeWorkerOrder(order.getId(), workerId);
}
//
// // 更新订单的派单类型
// order.setReceiveType(receiveType.longValue());
@ -694,6 +706,109 @@ public class OrderController extends BaseController {
}
}
public AjaxResult changeWorkerOrder(Long orderId,Long newWorkerId) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 1. 查询订单
Order order = orderService.selectOrderById(orderId);
if (order == null) {
return AjaxResult.error("订单不存在");
}
// 2. 查询新师傅信息
Users newWorker = usersService.selectUsersById(newWorkerId);
if (newWorker == null) {
return AjaxResult.error("新师傅不存在");
}
// 3. 查询原师傅信息
Users oldWorker = null;
if (order.getWorkerId() != null) {
oldWorker = usersService.selectUsersById(order.getWorkerId());
}
// 4. 修改订单的师傅id
order.setWorkerId(newWorkerId);
order.setStatus(1L);
order.setIsAccept(0);
int updateOrder = orderService.updateOrder(order);
if (updateOrder <= 0) {
return AjaxResult.error("订单更新失败");
}
//查询最新的订单日志
OrderLog log = orderLogService.selectDataTheFirstNew(order.getId());
OrderLog log1 = new OrderLog();
log1.setOid(order.getId());
//原订单日志下所有师傅id需更换为新的师傅id
List<OrderLog> logList = orderLogService.selectOrderLogList(log1);
if (!logList.isEmpty()) {
for (OrderLog l : logList) {
if (l.getWorkerId() != null) {
l.setWorkerId(newWorkerId);
orderLogService.updateOrderLog(l);
}
}
}
//如果订单状态为6就继续做
if (log.getType().compareTo(new BigDecimal("6.0")) == 0) {
// 2. 组装日志内容为数组格式
Map<String, Object> logItem = new LinkedHashMap<>();
JSONArray jsonArray = JSONArray.parseArray(log.getContent());
logItem.put("name", "师傅" + newWorker.getName() + "将继续为您服务 不需要预约时间");
logItem.put("name", "暂停服务");
logItem.put("image", "");
logItem.put("reson", "由于订单师傅更换,自动暂停服务");
logItem.put("next_time", "");
logItem.put("type", 2);
logItem.put("date", sdf.format(new Date()));
jsonArray.add(logItem);
if (log != null) {
log.setIsPause(2);
log.setContent(jsonArray.toJSONString());
orderLogService.updateOrderLog(log);
order.setIsPause(2);
order.setWorkerId(newWorkerId);
orderService.updateOrder(order);
}
} else {
// 5. 插入转单日志
OrderLog newlog = new OrderLog();
if (log.getType().compareTo(new BigDecimal("5.0")) == 0) {
newlog.setType(new BigDecimal(6.0));
} else {
newlog.setType(new BigDecimal(1.1));
}
com.alibaba.fastjson2.JSONObject jsonObjectnew = new com.alibaba.fastjson2.JSONObject();
jsonObjectnew.put("name", "师傅" + newWorker.getName() + "将继续为您服务 不需要预约时间");
jsonObjectnew.put("convert", oldWorker.getName() + "将订单转给" + newWorker.getName());
newlog.setContent(jsonObjectnew.toJSONString());
newlog.setOid(order.getId());
newlog.setOrderId(order.getOrderId());
newlog.setWorkerId(newWorkerId);
newlog.setWorkerLogId(newWorkerId);
newlog.setTitle("转单");
newlog.setIsPause(2);
orderLogService.insertOrderLog(newlog);
//需要解绑原订单上原师傅和客户的虚拟号
VoiceResponseResult resultObj = YunXinPhoneUtilAPI.httpsPrivacyUnbind(order.getWorkerPhone(), order.getUserPhone(), order.getMiddlePhone(), order.getId());
if (resultObj.getResult().equals("000000")) {
orderService.updateOrderPhone(order.getId());
// orderService.updateOrder(order);
}
//绑定新师傅的虚拟号
//给新师傅进行电话通知
YunXinPhoneUtilAPI.httpsAxbTransfer(newWorker.getPhone(), order.getId());
}
return AjaxResult.success("转单成功");
} catch (Exception e) {
return AjaxResult.error("转单失败:" + e.getMessage());
}
}
/**
* 获取可派单工人列表
*/

View File

@ -4,6 +4,9 @@ import java.math.BigDecimal;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.ControllerUtil.AppletControllerUtil;
import com.ruoyi.system.domain.ServiceCate;
import com.ruoyi.system.service.IServiceCateService;
import org.springframework.security.access.prepost.PreAuthorize;
@ -311,7 +314,35 @@ public class ServiceGoodsController extends BaseController {
@PreAuthorize("@ss.hasPermi('system:ServiceGoods:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(serviceGoodsService.selectServiceGoodsById(id));
ServiceGoods serviceGoods = serviceGoodsService.selectServiceGoodsById(id);
serviceGoods.setIcon(AppletControllerUtil.buildImageUrl(serviceGoods.getIcon()));
if (serviceGoods != null){
if (serviceGoods.getSkuType()==null){
serviceGoods.setSkuType(1);
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
serviceGoods.setSku(jsonObject.toJSONString());
serviceGoodsService.updateServiceGoods(serviceGoods);
}
if (serviceGoods.getSku()!=null){
if (serviceGoods.getSku().equals("{}")){
JSONObject jsonObject =new JSONObject();
jsonObject.put("type","single");
serviceGoods.setSku(jsonObject.toJSONString());
serviceGoodsService.updateServiceGoods(serviceGoods);
}
}
if(StringUtils.isNotBlank(serviceGoods.getSkillIds())){
serviceGoods.setSkillIds(AppletControllerUtil.convertToJSONArray(serviceGoods.getSkillIds()).toJSONString());
}
if(StringUtils.isNotBlank(serviceGoods.getImgs())){
serviceGoods.setImgs(AppletControllerUtil.convertToJSONArray(serviceGoods.getImgs()).toJSONString());
}
}
return success(serviceGoods);
}
/**
@ -330,7 +361,13 @@ public class ServiceGoodsController extends BaseController {
if (serviceGoods.getPostage()==null){
serviceGoods.setPostage(BigDecimal.ZERO);
}
if(StringUtils.isNotBlank(serviceGoods.getSkillIds())){
serviceGoods.setSkillIds(AppletControllerUtil.convertToJSONArray(serviceGoods.getSkillIds()).toJSONString());
}
if(StringUtils.isNotBlank(serviceGoods.getImgs())){
serviceGoods.setImgs(AppletControllerUtil.convertToJSONArray(serviceGoods.getImgs()).toJSONString());
}
return toAjax(serviceGoodsService.insertServiceGoods(serviceGoods));
}
@ -343,7 +380,13 @@ public class ServiceGoodsController extends BaseController {
public AjaxResult edit(@RequestBody ServiceGoods serviceGoods) {
// 验证和处理基检现象数据格式
validateAndProcessBasicField(serviceGoods);
if(StringUtils.isNotBlank(serviceGoods.getSkillIds())){
serviceGoods.setSkillIds(AppletControllerUtil.convertToJSONArray(serviceGoods.getSkillIds()).toJSONString());
}
if(StringUtils.isNotBlank(serviceGoods.getImgs())){
serviceGoods.setImgs(AppletControllerUtil.convertToJSONArray(serviceGoods.getImgs()).toJSONString());
}
// 处理一级和二级分类ID
processCategoryIds(serviceGoods);

View File

@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectServiceGoodsVo">
select id, title, icon, imgs,isforservice,forserviceid, sub_title, info, price,questions, price_zn, sales,servicetype, stock, status, description, sku_type,groupnum,sku, latitude, longitude, type, cate_id, first_cate_id, second_cate_id, project, sort, material, postage, basic, margin, skill_ids, created_at, updated_at, deleted_at, isgroup, groupprice, isonce, onceprice, commissiontype, commission, dispatchtype, workerids, isfixed, fixedprice from service_goods
select id, title, icon, imgs,isforservice,city,forserviceid, sub_title, info, price,questions, price_zn, sales,servicetype, stock, status, description, sku_type,groupnum,sku, latitude, longitude, type, cate_id, first_cate_id, second_cate_id, project, sort, material, postage, basic, margin, skill_ids, created_at, updated_at, deleted_at, isgroup, groupprice, isonce, onceprice, commissiontype, commission, dispatchtype, workerids, isfixed, fixedprice from service_goods
</sql>
<select id="selectServiceGoodsList" parameterType="ServiceGoods" resultMap="ServiceGoodsResult">

View File

@ -104,9 +104,10 @@
</select>
<update id="updateWorkerMoneyLogStatusIfEndlookAfterNow">
UPDATE worker_money_log
SET status = 2
WHERE endlook > NOW() AND status = 1
UPDATE worker_money_log SET status = 2 WHERE endlook &lt; NOW() AND status = 1
</update>

View File

@ -1,14 +1,14 @@
<template>
<div class="component-upload-image">
<el-upload
multiple
:multiple="!single"
:disabled="disabled"
:action="uploadImgUrl"
list-type="picture-card"
:on-success="handleUploadSuccess"
:before-upload="handleBeforeUpload"
:data="data"
:limit="limit"
:limit="single ? 1 : limit"
:on-error="handleUploadError"
:on-exceed="handleExceed"
ref="imageUpload"
@ -17,7 +17,7 @@
:headers="headers"
:file-list="fileList"
:on-preview="handlePictureCardPreview"
:class="{hide: this.fileList.length >= this.limit}"
:class="{hide: this.fileList.length >= (single ? 1 : limit)}"
>
<i class="el-icon-plus"></i>
</el-upload>
@ -90,6 +90,11 @@ export default {
drag: {
type: Boolean,
default: true
},
//
single: {
type: Boolean,
default: false
}
},
data() {
@ -115,8 +120,15 @@ export default {
onEnd: (evt) => {
const movedItem = this.fileList.splice(evt.oldIndex, 1)[0]
this.fileList.splice(evt.newIndex, 0, movedItem)
// URL
if (this.single) {
const firstImage = this.fileList[0];
this.$emit("input", firstImage ? this.getPureUrl(firstImage.url) : "");
} else {
this.$emit("input", this.fileList.map(f => this.getPureUrl(f.url)))
}
}
})
})
}
@ -126,26 +138,29 @@ export default {
handler(val) {
if (val) {
//
const list = Array.isArray(val) ? val : this.value.split(',')
const list = Array.isArray(val) ? val : (typeof val === 'string' && val.includes(',') ? val.split(',') : [val])
//
this.fileList = list.map(item => {
this.fileList = list.filter(item => item && item.trim()).map(item => {
if (typeof item === "string") {
let cleanItem = item.trim()
// URL
cleanItem = this.cleanImageUrl(cleanItem)
// URL使
if (isExternal(item) || item.startsWith('http://') || item.startsWith('https://')) {
item = { name: item, url: item }
} else if (item.indexOf(this.baseUrl) === -1) {
if (isExternal(cleanItem) || cleanItem.startsWith('http://') || cleanItem.startsWith('https://')) {
return { name: cleanItem, url: cleanItem }
} else if (cleanItem && cleanItem.indexOf(this.baseUrl) === -1) {
// baseUrl
item = { name: this.baseUrl + item, url: this.baseUrl + item }
return { name: this.baseUrl + cleanItem, url: this.baseUrl + cleanItem }
} else {
//
item = { name: item, url: item }
return { name: cleanItem, url: cleanItem }
}
}
return item
})
} else {
this.fileList = []
return []
}
},
deep: true,
@ -205,6 +220,14 @@ export default {
let fileUrl = res.url || res.fileName;
let fileName = res.fileName;
// URL
if (fileUrl) {
fileUrl = this.cleanImageUrl(fileUrl);
}
if (fileName) {
fileName = this.cleanImageUrl(fileName);
}
// URL使
if (fileUrl && (fileUrl.startsWith('http://') || fileUrl.startsWith('https://'))) {
this.uploadList.push({ name: fileUrl, url: fileUrl })
@ -240,7 +263,15 @@ export default {
this.fileList = this.fileList.concat(this.uploadList)
this.uploadList = []
this.number = 0
// URL
if (this.single) {
const firstImage = this.fileList[0];
this.$emit("input", firstImage ? this.getPureUrl(firstImage.url) : "");
} else {
this.$emit("input", this.fileList.map(f => this.getPureUrl(f.url)))
}
this.$modal.closeLoading()
}
},
@ -256,6 +287,8 @@ export default {
for (let i in list) {
if (list[i].url) {
let url = list[i].url
// URL
url = this.cleanImageUrl(url)
// URL使URLbaseUrl
if (url.startsWith('http://') || url.startsWith('https://')) {
strs += url + separator
@ -266,6 +299,37 @@ export default {
}
return strs != '' ? strs.substr(0, strs.length - 1) : ''
},
// URL
cleanImageUrl(url) {
if (!url || typeof url !== 'string') return '';
let cleanUrl = url.trim();
// /dev-api
if (cleanUrl.startsWith('/dev-api')) {
cleanUrl = cleanUrl.replace('/dev-api', '');
}
// baseUrl
if (cleanUrl.startsWith(this.baseUrl)) {
cleanUrl = cleanUrl.replace(this.baseUrl, '');
}
// HTML
cleanUrl = cleanUrl.replace(/&quot;/g, '"');
cleanUrl = cleanUrl.replace(/&amp;/g, '&');
cleanUrl = cleanUrl.replace(/&lt;/g, '<');
cleanUrl = cleanUrl.replace(/&gt;/g, '>');
//
cleanUrl = cleanUrl.replace(/^["\[]+|["\]]+$/g, '');
//
cleanUrl = cleanUrl.replace(/^\/+/, '');
return cleanUrl;
},
// baseUrl/dev-api
getPureUrl(url) {
if (!url) return '';

View File

@ -376,13 +376,37 @@
<el-input v-model="form.title" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="主图" prop="image">
<image-upload v-model="form.image"/>
<image-upload v-model="form.image" :single="true"/>
</el-form-item>
<el-form-item label="轮播图" prop="images">
<image-upload v-model="form.images"/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-input v-model="form.tags" placeholder="请输入标签" />
<div class="tags-container">
<div class="tags-list">
<el-tag
v-for="(tag, index) in form.tagsArray"
:key="index"
closable
@close="removeTag(index)"
style="margin-right: 8px; margin-bottom: 8px;"
>
{{ tag }}
</el-tag>
</div>
<div class="tag-input-container">
<el-input
v-model="tagInputValue"
placeholder="请输入标签,按回车添加"
size="small"
style="width: 200px;"
@keyup.enter.native="addTag"
@blur="addTag"
>
<el-button slot="append" @click="addTag" size="small">添加</el-button>
</el-input>
</div>
</div>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-switch v-model="form.status" :active-value="1" :inactive-value="0" />
@ -567,6 +591,8 @@ export default {
skuList: [{ name: "", value: "" }],
specList: [{ name: "", values: [""] }],
skuTable: [],
//
tagInputValue: "",
};
},
created() {
@ -601,7 +627,8 @@ export default {
sales: null,
stock: null,
status: null,
tags: null,
tags: "[]",
tagsArray: [],
cateId: null,
skuType: 1,
sku: "{}",
@ -698,6 +725,25 @@ export default {
console.warn('解析单规格数据失败:', e);
}
}
//
if (this.form.tags) {
try {
// JSON
if (this.form.tags.startsWith('[') && this.form.tags.endsWith(']')) {
this.form.tagsArray = JSON.parse(this.form.tags);
} else {
//
this.form.tagsArray = this.form.tags.split(',').filter(tag => tag.trim());
}
} catch (e) {
console.warn('解析标签数据失败:', e);
this.form.tagsArray = [];
}
} else {
this.form.tagsArray = [];
}
this.open = true;
this.title = "修改积分商品";
});
@ -707,6 +753,21 @@ export default {
//
this.form.skuType = this.skuType;
//
if (Array.isArray(this.form.image)) {
this.form.image = this.form.image.length > 0 ? this.form.image[0] : "";
}
if (Array.isArray(this.form.images)) {
this.form.images = this.form.images.join(',');
}
// JSON
if (this.form.tagsArray && this.form.tagsArray.length > 0) {
this.form.tags = JSON.stringify(this.form.tagsArray);
} else {
this.form.tags = "[]";
}
console.log(this.skuType);
//
if (this.skuType === 2) {
//
@ -721,25 +782,7 @@ export default {
this.$modal.msgError("规格信息不能为空");
return;
}
} else {
//
if (!this.form.skuName || !this.form.skuValue) {
this.$modal.msgError("请完善单规格信息");
return;
}
const singleSku = {
name: this.form.skuName,
value: this.form.skuValue
};
this.form.sku = JSON.stringify(singleSku);
}
// sku
if (!this.form.sku || this.form.sku === '{}') {
this.$modal.msgError("规格信息不能为空");
return;
}
this.$refs["form"].validate((valid) => {
if (valid) {
if (this.form.id != null) {
@ -809,6 +852,23 @@ export default {
this.$message.error("修改失败");
}
},
//
addTag() {
if (this.tagInputValue && this.tagInputValue.trim()) {
const tag = this.tagInputValue.trim();
//
if (!this.form.tagsArray.includes(tag)) {
this.form.tagsArray.push(tag);
}
this.tagInputValue = "";
}
},
//
removeTag(index) {
this.form.tagsArray.splice(index, 1);
},
},
};
</script>
@ -822,4 +882,18 @@ export default {
-webkit-appearance: none;
margin: 0;
}
.tags-container {
width: 100%;
}
.tags-list {
margin-bottom: 10px;
min-height: 32px;
}
.tag-input-container {
display: flex;
align-items: center;
}
</style>

View File

@ -1595,8 +1595,8 @@ export default {
this.$message.success("完成服务成功!");
this.completeServiceDialogVisible = false;
this.completeServiceImages = [];
//
await this.refreshOrderData();
//
this.handleClose();
} else {
this.$message.error("完成服务失败:" + (response.msg || "未知错误"));
}
@ -1631,8 +1631,8 @@ export default {
if (response.code === 200) {
this.$message.success("接单成功!");
//
await this.refreshOrderData();
//
this.handleClose();
} else {
this.$message.error("接单失败:" + response.msg);
}
@ -1663,8 +1663,8 @@ export default {
if (response.code === 200) {
this.$message.success("确认到达成功!");
//
await this.refreshOrderData();
//
this.handleClose();
} else {
this.$message.error("确认到达失败:" + response.msg);
}
@ -1709,8 +1709,8 @@ export default {
this.$message.success("开始服务成功!");
this.startServiceDialogVisible = false;
this.startServiceImages = [];
//
await this.refreshOrderData();
//
this.handleClose();
} else {
this.$message.error("开始服务失败:" + (response.msg || "未知错误"));
}
@ -1814,8 +1814,8 @@ export default {
this.$message.success("订单已结束");
this.endOrderDialogVisible = false;
this.resetEndOrderForm();
//
await this.refreshOrderData();
//
this.handleClose();
} else {
this.$message.error(
"结束订单失败:" + (response.msg || "未知错误")
@ -1944,13 +1944,8 @@ export default {
this.changeWorkerDialogVisible = false;
this.selectedWorker = null;
//
if (this.orderInfo.workerId) {
this.loadWorkerInfo();
}
//
await this.refreshOrderData();
//
this.handleClose();
} catch (error) {
console.error("更换师傅失败:", error);
this.$message.error("更换师傅失败:" + (error.message || "未知错误"));

View File

@ -1,5 +1,25 @@
<template>
<div class="app-container">
<!-- 添加调试信息 -->
<!-- <div v-if="true" style="background: #f0f9ff; border: 1px solid #0ea5e9; padding: 10px; margin-bottom: 10px; border-radius: 4px;">-->
<!-- <strong>调试信息</strong>-->
<!-- <div>文件总行数: {{ totalLines }}</div>-->
<!-- <div>当前时间: {{ new Date().toLocaleString() }}</div>-->
<!-- <div>Element UI 版本: {{ $ELEMENT ? $ELEMENT.version : '未知' }}</div>-->
<!-- <div>分类列表长度: {{ serviceCateList.length }}</div>-->
<!-- <div>城市列表长度: {{ cityList.length }}</div>-->
<!-- <div>技能列表长度: {{ siteSkillList.length }}</div>-->
<!-- <el-button size="small" @click="getserviceCateList" style="margin-right: 10px;">重新加载分类</el-button>-->
<!-- <el-button size="small" @click="getCityList" style="margin-right: 10px;">重新加载城市</el-button>-->
<!-- <el-button size="small" @click="getSiteSkillList">重新加载技能</el-button>-->
<!-- </div>-->
<!-- 错误边界 -->
<div v-if="hasError" style="background: #fef2f2; border: 1px solid #ef4444; padding: 10px; margin-bottom: 10px; border-radius: 4px;">
<strong>组件错误:</strong> {{ errorMessage }}
<el-button size="small" @click="retryLoad" style="margin-left: 10px;">重试</el-button>
</div>
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="分类" prop="cateId">
<el-select v-model="queryParams.cateId" placeholder="请选择分类" clearable filterable>
@ -9,7 +29,7 @@
:label="group.label"
>
<el-option
v-for="cate in group.children"
v-for="cate in getValidChildren(group.children)"
:key="cate.id"
:label="formatCateLabel(cate)"
:value="cate.id"
@ -312,9 +332,20 @@
</el-form-item>
<el-form-item label="图标" prop="icon">
<image-upload v-model="form.icon" :limit="1"/>
<!-- 调试信息 -->
<!-- <div v-if="form.icon" style="margin-top: 8px; font-size: 12px; color: #909399;">-->
<!-- <i class="el-icon-info"></i> 当前图标URL: {{ form.icon }}-->
<!-- </div>-->
</el-form-item>
<el-form-item label="轮播图" prop="imgs">
<image-upload v-model="form.imgs"/>
<!-- 调试信息 -->
<!-- <div v-if="form.imgs && form.imgs.length > 0" style="margin-top: 8px; font-size: 12px; color: #909399;">-->
<!-- <i class="el-icon-info"></i> 当前轮播图数量: {{ form.imgs.length }}-->
<!-- <div v-for="(img, index) in form.imgs" :key="index" style="margin-top: 4px;">-->
<!-- {{ index + 1 }}. {{ img }}-->
<!-- </div>-->
<!-- </div>-->
</el-form-item>
<el-form-item label="简介" prop="info">
<el-input v-model="form.info" type="textarea" placeholder="请输入内容" />
@ -341,7 +372,7 @@
:label="group.label"
>
<el-option
v-for="cate in group.children"
v-for="cate in getValidChildren(group.children)"
:key="cate.id"
:label="formatCateLabel(cate)"
:value="cate.id"
@ -393,13 +424,12 @@
style="width: 100%;"
:loading="cityLoading"
@change="handleCityChange"
collapse-tags
:collapse-tags-tooltip="true"
:class="{ 'city-select-loading': cityLoading }"
no-data-text="暂无城市数据,请检查网络连接或联系管理员"
>
<el-option
v-for="city in cityList"
v-for="city in getValidCities(cityList)"
:key="city.id"
:label="city.title"
:value="city.id"
@ -414,19 +444,27 @@
<span style="color: #c0c4cc;">暂无城市数据</span>
</el-option>
</el-select>
<!-- 调试信息 -->
<div style="font-size: 12px; color: #909399; margin-top: 5px;">
<i class="el-icon-info"></i> 城市列表状态: {{ cityLoading ? '加载中...' : `已加载 ${cityList.length} 个城市` }}
<el-button
v-if="!cityLoading && cityList.length === 0"
type="text"
size="mini"
@click="getCityList"
style="margin-left: 10px;"
>
<i class="el-icon-refresh"></i> 重新加载
</el-button>
</div>
<!-- &lt;!&ndash; 调试信息 &ndash;&gt;-->
<!-- <div style="font-size: 12px; color: #909399; margin-top: 5px;">-->
<!-- <i class="el-icon-info"></i> 城市列表状态: {{ cityLoading ? '加载中...' : `已加载 ${cityList.length} 个城市` }}-->
<!-- <el-button-->
<!-- v-if="!cityLoading && cityList.length === 0"-->
<!-- type="text"-->
<!-- size="mini"-->
<!-- @click="getCityList"-->
<!-- style="margin-left: 10px;"-->
<!-- >-->
<!-- <i class="el-icon-refresh"></i> 重新加载-->
<!-- </el-button>-->
<!-- </div>-->
<!-- 临时调试信息 -->
<!-- <div v-if="true" style="font-size: 11px; color: #e6a23c; margin-top: 5px; background: #fdf6ec; padding: 5px; border-radius: 3px;">-->
<!-- <strong>调试信息:</strong><br/>-->
<!-- 城市列表长度: {{ cityList.length }}<br/>-->
<!-- 表单城市数组: {{ form.cityArray }}<br/>-->
<!-- 城市选择器值: {{ form.cityArray }}<br/>-->
<!-- getValidCities结果长度: {{ getValidCities(cityList).length }}-->
<!-- </div>-->
<div style="font-size: 12px; color: #909399; margin-top: 5px;">
<i class="el-icon-info"></i> 可多选城市不选择则适用于所有城市
</div>
@ -463,7 +501,7 @@
@change="handleSkillChange"
>
<el-option
v-for="skill in siteSkillList"
v-for="skill in getValidSkills(siteSkillList)"
:key="skill.id"
:label="skill.title"
:value="skill.id"
@ -613,7 +651,7 @@
<el-form-item label="指定工人集合" prop="workerids" v-if="form.dispatchtype === 3">
<el-select v-model="form.workerids" filterable placeholder="请选择工人" style="width: 100%">
<el-option
v-for="worker in listworkerlist"
v-for="worker in getValidWorkers(listworkerlist)"
:key="worker.id"
:label="worker.name + '' + worker.phone + ''"
:value="worker.id"
@ -830,6 +868,8 @@ export default {
showSearch: true,
//
listworkerlist: [],
//
totalLines: 2555,
serviceCateList: [],
//
groupedServiceCateList: [],
@ -948,16 +988,26 @@ export default {
//
cityList: [],
cityLoading: false,
hasError: false,
errorMessage: '',
}
},
created() {
this.getList()
this.getList();
this.getserviceCateList();
this.getSiteSkillList();
this.testSkillList();
this.getlistworkerdatalist();
this.testJsonConversion(); // JSON
this.getCityList(); //
this.getlistworkerlist();
this.getCityList();
//
console.log('ServiceGoods 组件已创建');
console.log('Element UI 版本:', this.$ELEMENT);
console.log('当前组件实例:', this);
//
this.$nextTick(() => {
this.$forceUpdate();
});
},
watch: {
// UI
@ -987,6 +1037,62 @@ export default {
}
},
methods: {
//
getValidChildren(children) {
console.log('getValidChildren 输入:', children);
if (!children || !Array.isArray(children)) {
console.log('getValidChildren 返回空数组,原因:', !children ? 'children为空' : 'children不是数组');
return [];
}
const validChildren = children.filter(cate => cate && cate.id);
console.log('getValidChildren 输出:', validChildren);
return validChildren;
},
//
getValidCities(cities) {
console.log('=== getValidCities 调用 ===');
console.log('输入参数:', cities);
console.log('输入类型:', typeof cities);
console.log('是否为数组:', Array.isArray(cities));
if (!cities || !Array.isArray(cities)) {
console.log('getValidCities 返回空数组,原因:', !cities ? 'cities为空' : 'cities不是数组');
return [];
}
console.log('输入数组长度:', cities.length);
console.log('输入数组前3项:', cities.slice(0, 3));
const validCities = cities.filter(city => city && city.id);
console.log('过滤后的有效城市:', validCities);
console.log('有效城市数量:', validCities.length);
if (validCities.length > 0) {
console.log('有效城市示例:', validCities.slice(0, 3).map(city => ({ id: city.id, title: city.title })));
}
console.log('=== getValidCities 完成 ===');
return validCities;
},
//
getValidSkills(skills) {
if (!skills || !Array.isArray(skills)) {
return [];
}
return skills.filter(skill => skill && skill.id);
},
//
getValidWorkers(workers) {
if (!workers || !Array.isArray(workers)) {
return [];
}
return workers.filter(worker => worker && worker.id);
},
//
handleGlobalError(error) {
console.error('全局错误:', error);
//
},
/** 查询服务内容列表 */
getList() {
this.loading = true
@ -994,7 +1100,12 @@ export default {
this.ServiceGoodsList = response.rows
this.total = response.total
this.loading = false
})
}).catch(error => {
console.error('获取服务内容列表失败:', error);
this.hasError = true;
this.errorMessage = '获取服务内容列表失败,请稍后重试';
this.loading = false;
});
},
//
cancel() {
@ -1134,9 +1245,18 @@ export default {
this.$set(this.form, 'firstCateId', null);
this.$set(this.form, 'secondCateId', null);
this.$set(this.form, 'cityArray', []); //
//
if (this.serviceCateList.length === 0) {
this.getserviceCateList();
}
if (this.cityList.length === 0) {
this.getCityList();
}
if (this.siteSkillList.length === 0) {
this.getSiteSkillList();
}
this.open = true
this.title = "添加服务内容"
this.handleServiceTypeChange(this.form.servicetype);
@ -1188,15 +1308,33 @@ export default {
this.reset()
const id = row.id || this.ids
this.getlistworkerdatalist();
//
if (this.serviceCateList.length === 0) {
this.getserviceCateList();
}
if (this.cityList.length === 0) {
this.getCityList();
}
const skillPromise = this.siteSkillList.length > 0 ?
Promise.resolve(this.siteSkillList) :
this.getSiteSkillList();
//
const cityPromise = this.cityList.length > 0 ?
Promise.resolve(this.cityList) :
this.getCityList().then(() => this.cityList);
Promise.all([
getServiceGoods(id),
skillPromise
]).then(([serviceResponse, skillData]) => {
this.form = serviceResponse.data
console.log('编辑数据:', this.form);
console.log('原始城市字段值:', this.form.city);
console.log('原始城市字段类型:', typeof this.form.city);
console.log('原始城市字段内容:', JSON.stringify(this.form.city));
//
if (this.form.questions) {
@ -1305,40 +1443,59 @@ export default {
if (this.form.city) {
try {
let cityArray = [];
console.log('=== 城市数据处理开始 ===');
console.log('原始城市数据:', this.form.city, '类型:', typeof this.form.city);
console.log('城市数据内容:', JSON.stringify(this.form.city));
if (typeof this.form.city === 'string') {
// JSON
try {
const parsedCity = JSON.parse(this.form.city);
console.log('JSON解析成功:', parsedCity);
if (Array.isArray(parsedCity)) {
cityArray = parsedCity.map(id => parseInt(id)).filter(id => !isNaN(id));
console.log('JSON数组转换成功:', cityArray);
} else {
// JSON
cityArray = this.form.city.split(',').map(id => {
const numId = parseInt(id.trim());
return isNaN(numId) ? null : numId;
}).filter(id => id !== null);
console.log('逗号分隔转换成功:', cityArray);
}
} catch (jsonError) {
console.log('JSON解析失败尝试逗号分隔:', jsonError);
// JSON
cityArray = this.form.city.split(',').map(id => {
const numId = parseInt(id.trim());
return isNaN(numId) ? null : numId;
}).filter(id => id !== null);
console.log('逗号分隔转换成功:', cityArray);
}
} else if (Array.isArray(this.form.city)) {
// 使
cityArray = this.form.city.map(id => parseInt(id)).filter(id => !isNaN(id));
console.log('直接数组转换成功:', cityArray);
}
this.$set(this.form, 'cityArray', cityArray);
console.log('转换后的城市数组:', this.form.cityArray);
console.log('最终设置的城市数组:', this.form.cityArray);
console.log('=== 城市数据处理完成 ===');
//
setTimeout(() => {
console.log('延迟后的城市数组:', this.form.cityArray);
if (this.form.cityArray && this.form.cityArray.length > 0) {
console.log('城市数组已设置,长度:', this.form.cityArray.length);
this.$forceUpdate();
}
}, 100);
} catch (e) {
console.error('城市数据转换错误:', e);
this.$set(this.form, 'cityArray', []);
}
} else {
console.log('城市数据为空,设置空数组');
this.$set(this.form, 'cityArray', []);
}
@ -1451,6 +1608,32 @@ export default {
} else if (!Array.isArray(this.form.imgs)) {
this.form.imgs = [];
}
// URL
if (this.form.icon && typeof this.form.icon === 'string') {
this.form.icon = this.cleanImageUrl(this.form.icon);
}
if (this.form.imgs && Array.isArray(this.form.imgs)) {
this.form.imgs = this.form.imgs.map(img => {
if (typeof img === 'string') {
return this.cleanImageUrl(img);
}
return img;
}).filter(Boolean);
}
//
console.log('=== 编辑表单数据加载完成 ===');
console.log('表单城市数组:', this.form.cityArray);
console.log('城市列表长度:', this.cityList.length);
console.log('城市列表前5项:', this.cityList.slice(0, 5));
console.log('getValidCities结果:', this.getValidCities(this.cityList));
//
this.$nextTick(() => {
console.log('nextTick后的城市数组:', this.form.cityArray);
this.$forceUpdate();
});
}).catch(error => {
console.error('编辑数据加载失败:', error);
this.$message.error('编辑数据加载失败,请重试');
@ -1560,6 +1743,14 @@ export default {
this.form.imgs = this.form.imgs.filter(Boolean).join(',');
}
// URL
if (this.form.icon && typeof this.form.icon === 'string') {
this.form.icon = this.cleanImageUrl(this.form.icon);
}
if (this.form.imgs && typeof this.form.imgs === 'string') {
this.form.imgs = this.cleanImageUrl(this.form.imgs);
}
// this.form
const submitData = { ...this.form };
// workerids
@ -1616,15 +1807,22 @@ export default {
});
},
getserviceCateList(){
console.log('开始获取分类列表...');
//
getAllServiceCateList(1).then(response => {
console.log('分类API响应:', response);
this.serviceCateList = response.rows || []
console.log('设置分类列表:', this.serviceCateList);
console.log('分类列表长度:', this.serviceCateList.length);
this.processServiceCateList()
}).catch(error => {
console.error('获取分类列表失败:', error)
// 使
selectServiceCateList(1).then(response => {
console.log('降级分类API响应:', response);
this.serviceCateList = response.data || []
console.log('降级设置分类列表:', this.serviceCateList);
console.log('降级分类列表长度:', this.serviceCateList.length);
this.processServiceCateList()
}).catch(err => {
console.error('降级获取分类列表也失败:', err)
@ -1687,6 +1885,10 @@ export default {
分组数: this.groupedServiceCateList.length,
分组详情: this.groupedServiceCateList
})
//
console.log('groupedServiceCateList 设置完成:', this.groupedServiceCateList);
console.log('firstLevelCateList 设置完成:', this.firstLevelCateList);
},
/** 导出按钮操作 */
handleExport() {
@ -2256,13 +2458,27 @@ export default {
/** 获取城市列表 */
getCityList() {
console.log('开始获取城市列表...');
console.log('=== 开始获取城市列表 ===');
this.cityLoading = true;
getFirstLevelCities().then(response => {
console.log('城市API响应:', response);
console.log('响应数据类型:', typeof response);
console.log('响应结构:', Object.keys(response));
this.cityList = response.rows || [];
console.log('设置城市列表:', this.cityList);
console.log('城市列表长度:', this.cityList.length);
console.log('城市列表前5项:', this.cityList.slice(0, 5));
//
if (this.cityList.length > 0) {
const validCities = this.cityList.filter(city => city && city.id && city.title);
console.log('有效城市数量:', validCities.length);
console.log('有效城市示例:', validCities.slice(0, 3));
}
this.cityLoading = false;
console.log('=== 城市列表获取完成 ===');
}).catch(error => {
console.error("获取城市列表失败:", error);
this.cityLoading = false;
@ -2320,7 +2536,80 @@ export default {
console.log('删除城市:', cityId, '剩余:', this.form.cityArray);
}
},
/** 清理图片URL移除多余的前缀和字符 */
cleanImageUrl(url) {
if (!url || typeof url !== 'string') return '';
let cleanUrl = url.trim();
// /dev-api
if (cleanUrl.startsWith('/dev-api')) {
cleanUrl = cleanUrl.replace('/dev-api', '');
}
// baseUrl
const baseUrl = process.env.VUE_APP_BASE_API;
if (baseUrl && cleanUrl.startsWith(baseUrl)) {
cleanUrl = cleanUrl.replace(baseUrl, '');
}
// HTML
cleanUrl = cleanUrl.replace(/&quot;/g, '"');
cleanUrl = cleanUrl.replace(/&amp;/g, '&');
cleanUrl = cleanUrl.replace(/&lt;/g, '<');
cleanUrl = cleanUrl.replace(/&gt;/g, '>');
//
cleanUrl = cleanUrl.replace(/^["\[]+|["\]]+$/g, '');
//
cleanUrl = cleanUrl.replace(/^\/+/, '');
console.log('清理图片URL:', { 原始: url, 清理后: cleanUrl });
return cleanUrl;
},
retryLoad() {
this.hasError = false;
this.errorMessage = '';
this.getList();
},
},
mounted() {
//
this.$nextTick(() => {
try {
// Element UI
if (this.$options.components) {
console.log('组件已正确注册:', Object.keys(this.$options.components));
}
// el-option
if (this.$options.components['el-option']) {
console.log('el-option 组件已注册');
} else {
console.warn('el-option 组件未注册,尝试手动注册');
//
}
//
this.$root.$on('error', this.handleGlobalError);
//
this.$forceUpdate();
} catch (error) {
console.error('组件注册检查失败:', error);
}
});
},
beforeDestroy() {
//
if (this.$root) {
this.$root.$off('error', this.handleGlobalError);
}
},
}
</script>