| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- <template>
- <div class="product-profit-rate">
- <div class="header">
- <h2>产品利润率设置</h2>
- <div class="filters">
- <el-input v-model="searchText" placeholder="商品名称搜索" style="width: 200px;" clearable @keyup.enter.native="loadList" />
- <el-select v-model="typeFilter" placeholder="商品类型" @change="loadList" style="width: 140px;">
- <el-option label="全部类型" value="" />
- <el-option label="实物商品" value="physical" />
- <el-option label="虚拟商品" value="virtual" />
- <el-option label="优惠券" value="coupon" />
- </el-select>
- <el-button type="primary" @click="loadList">查询</el-button>
- </div>
- </div>
- <el-table :data="list" v-loading="loading" border stripe>
- <el-table-column prop="id" label="ID" width="70" />
- <el-table-column label="商品图片" width="70">
- <template slot-scope="{ row }">
- <img v-if="row.coverImage" :src="row.coverImage" class="product-thumb" />
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column prop="name" label="商品名称" min-width="160" show-overflow-tooltip />
- <el-table-column label="类型" width="90">
- <template slot-scope="{ row }">
- {{ typeLabel(row.productType) }}
- </template>
- </el-table-column>
- <el-table-column prop="price" label="售价(元)" width="90">
- <template slot-scope="{ row }">
- ¥{{ (row.price / 100).toFixed(2) }}
- </template>
- </el-table-column>
- <el-table-column label="当前利润率" width="120">
- <template slot-scope="{ row }">
- <span v-if="row.profitRate != null">{{ (row.profitRate * 100).toFixed(1) }}%</span>
- <span v-else class="text-muted">未设置</span>
- </template>
- </el-table-column>
- <el-table-column label="新利润率" width="180">
- <template slot-scope="{ row }">
- <el-input-number
- v-if="editId === row.id"
- v-model="editRate"
- :min="0"
- :max="1"
- :step="0.01"
- :precision="2"
- size="small"
- style="width: 140px;"
- />
- <span v-else class="text-muted">-</span>
- </template>
- </el-table-column>
- <el-table-column label="操作" width="150" fixed="right">
- <template slot-scope="{ row }">
- <el-button
- v-if="editId !== row.id"
- type="primary"
- size="small"
- @click="startEdit(row)"
- >设置</el-button>
- <template v-else>
- <el-button type="success" size="small" @click="saveRate(row)">保存</el-button>
- <el-button size="small" @click="cancelEdit">取消</el-button>
- </template>
- </template>
- </el-table-column>
- </el-table>
- <el-pagination
- @size-change="onPageChange"
- @current-change="onPageChange"
- :current-page="page"
- :page-size="size"
- :total="total"
- layout="total, prev, pager, next"
- style="margin-top: 20px; text-align: right;"
- />
- </div>
- </template>
- <script>
- import { getProductList, updateProductProfitRate } from '@/api/admin'
- export default {
- data() {
- return {
- list: [],
- loading: false,
- page: 1,
- size: 20,
- total: 0,
- searchText: '',
- typeFilter: '',
- editId: null,
- editRate: 0
- }
- },
- mounted() {
- this.loadList()
- },
- methods: {
- async loadList() {
- this.loading = true
- try {
- const res = await getProductList({ status: '', keyword: this.searchText, productType: this.typeFilter })
- this.list = res.data || []
- this.total = (res.data || []).length
- } catch (e) {
- this.$message.error('加载失败')
- } finally {
- this.loading = false
- }
- },
- onPageChange(val) {
- this.page = val
- this.loadList()
- },
- typeLabel(type) {
- const map = { physical: '实物商品', virtual: '虚拟商品', coupon: '优惠券' }
- return map[type] || type
- },
- startEdit(row) {
- this.editId = row.id
- this.editRate = row.profitRate != null ? row.profitRate : 0
- },
- cancelEdit() {
- this.editId = null
- this.editRate = 0
- },
- async saveRate(row) {
- if (this.editRate == null) {
- return this.$message.warning('请设置利润率')
- }
- try {
- await updateProductProfitRate(row.id, this.editRate)
- this.$message.success('设置成功')
- this.editId = null
- this.loadList()
- } catch (e) {
- this.$message.error('设置失败')
- }
- }
- }
- }
- </script>
- <style scoped>
- .product-profit-rate {
- padding: 20px;
- }
- .header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- }
- .header h2 {
- margin: 0;
- }
- .filters {
- display: flex;
- gap: 10px;
- align-items: center;
- }
- .product-thumb {
- width: 50px;
- height: 50px;
- object-fit: cover;
- border-radius: 4px;
- }
- .text-muted {
- color: #999;
- }
- </style>
|