292 lines
11 KiB
Vue
292 lines
11 KiB
Vue
<template>
|
||
<view class="">
|
||
<!-- Header -->
|
||
<view class="header bg-white">
|
||
<u-search placeholder="输入商品名称" @change="change(current)" :show-action="false" v-model="keyword"></u-search>
|
||
</view>
|
||
|
||
<!-- Nav -->
|
||
<view class="nav bg-white">
|
||
<u-tabs name="name" :show-bar="false" :list="list" :is-scroll="true" :current="current" @change="change"
|
||
active-color="#40AFFA" />
|
||
</view>
|
||
|
||
<!-- Section -->
|
||
<view class="section" :style="{'height': height}">
|
||
<swiper :duration="400" style="height: 100%; overflow: hidden;" @change="change" :current="current">
|
||
<swiper-item v-for="(items, index) in list" :key="index">
|
||
<view v-show="index == current">
|
||
<mescroll-uni ref="mescrollRef" bottom="220rpx" height="100%" @init="mescrollInit"
|
||
@up="upCallback" :up="upOption" @down="downCallback">
|
||
|
||
<view class="title muted sm">
|
||
共{{ count }}件商品
|
||
</view>
|
||
|
||
<block v-for="(item2, index2) in items.lists" :key="index2">
|
||
<goods-card :data="item2">
|
||
<template v-if="btns.recycle_btn">
|
||
<button class="btn hollow br60 flex row-center normal"
|
||
@click="openFunc(item2, 'recycle')">移至回收站</button>
|
||
</template>
|
||
<template v-if="btns.edit_btn">
|
||
<router-link :to="'/bundle/pages/spec_edit/spec_edit?id='+item2.id">
|
||
<button class="btn hollow br60 flex row-center normal">编辑</button>
|
||
</router-link>
|
||
</template>
|
||
<template v-if="btns.delete_btn">
|
||
<button class="btn hollow br60 flex row-center normal"
|
||
@click.stop="openFunc(item2, 'del')">删除</button>
|
||
</template>
|
||
<template v-if="current==0">
|
||
<button class="btn solid br60 flex row-center normal"
|
||
@click.stop="openFunc(item2, 'off_shelf')">下架</button>
|
||
</template>
|
||
<template v-if="current==1">
|
||
<button class="btn solid br60 flex row-center normal"
|
||
@click.stop="openFunc(item2, 'on_shelf')"
|
||
style="background: #40AFFA;">上架</button>
|
||
</template>
|
||
<template v-if="btns.warehouse_btn">
|
||
<button class="btn solid br60 flex row-center normal"
|
||
@click.stop="openFunc(item2, 'warehouse')"
|
||
style="background: #40AFFA;">放入仓库</button>
|
||
</template>
|
||
</goods-card>
|
||
</block>
|
||
|
||
</mescroll-uni>
|
||
</view>
|
||
</swiper-item>
|
||
</swiper>
|
||
</view>
|
||
|
||
<modal height="200rpx" v-model="off_shelf" @confirm="goodsSetting">
|
||
<view class="black nr" style="height: 200rpx;">
|
||
确认下架:<text style="color:#FF4141;">{{curData.name}}</text>
|
||
</view>
|
||
</modal>
|
||
|
||
<modal height="200rpx" v-model="on_shelf" @confirm="goodsSetting">
|
||
<view class="black nr" style="height: 200rpx;">
|
||
确认上架:<text style="color:#FF4141;">{{curData.name}}</text>
|
||
</view>
|
||
</modal>
|
||
|
||
<modal height="200rpx" v-model="del" @confirm="goodsSetting">
|
||
<view class="black nr" style="height: 200rpx;">
|
||
确认删除:<text style="color:#FF4141;">{{curData.name}}</text>
|
||
</view>
|
||
</modal>
|
||
|
||
<modal height="200rpx" v-model="recycle" @confirm="goodsSetting">
|
||
<view class="black nr" style="height: 200rpx;">
|
||
确认移至回收站:<text style="color:#FF4141;">{{curData.name}}</text>
|
||
</view>
|
||
</modal>
|
||
|
||
<modal height="200rpx" v-model="warehouse" @confirm="goodsSetting">
|
||
<view class="black nr" style="height: 200rpx;">
|
||
确认放入仓库:<text style="color:#FF4141;">{{curData.name}}</text>
|
||
</view>
|
||
</modal>
|
||
|
||
<u-toast ref="uToast" />
|
||
</view>
|
||
</template>
|
||
|
||
|
||
<script>
|
||
import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
|
||
import {
|
||
apiGoodsLists,
|
||
apiGoodsOperation
|
||
} from '@/api/goods'
|
||
import {
|
||
debounce
|
||
} from "@/utils/tools.js"
|
||
export default {
|
||
mixins: [MescrollMixin],
|
||
data() {
|
||
return {
|
||
height: '100%',
|
||
|
||
keyword: '',
|
||
list: [{
|
||
name: '销售中',
|
||
type: 1,
|
||
lists: []
|
||
},
|
||
{
|
||
name: '仓库中',
|
||
type: 2,
|
||
lists: []
|
||
},
|
||
{
|
||
name: '库存预警',
|
||
type: 3,
|
||
lists: []
|
||
},
|
||
{
|
||
name: '回收站',
|
||
type: 4,
|
||
lists: []
|
||
},
|
||
{
|
||
name: '待审核',
|
||
type: 5,
|
||
lists: []
|
||
},
|
||
{
|
||
name: '未通过',
|
||
type: 6,
|
||
lists: []
|
||
}
|
||
],
|
||
current: 0,
|
||
count: 0,
|
||
|
||
action: '',
|
||
curData: {},
|
||
|
||
btns: {},
|
||
|
||
off_shelf: false, //下架
|
||
on_shelf: false, // 上架
|
||
del: false, //删除
|
||
recycle: false, //回收站
|
||
warehouse: false, //放入仓库
|
||
|
||
upOption: {
|
||
empty: {
|
||
icon: '/static/images/empty/shop.png',
|
||
tip: '暂无商品!', // 提示
|
||
fixed: true,
|
||
top: "200rpx",
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
async onShow() {
|
||
// 使用防抖是为了防止v-show的时候出发多条数据,所以使用防抖触发多次的时候可以只成为触发一次,优化性能请求
|
||
this.upCallback = debounce(this.upCallback, 200, this)
|
||
this.$nextTick(() => {
|
||
this.$refs.mescrollRef[this.current].mescroll.resetUpScroll()
|
||
})
|
||
|
||
uni.getSystemInfo({
|
||
success: (res) => {
|
||
this.height = res.windowHeight - 107 + 'px';
|
||
}
|
||
});
|
||
},
|
||
|
||
methods: {
|
||
|
||
change(event) {
|
||
let index;
|
||
event.detail ? index = event.detail.current : index = event
|
||
this.current = Number(index)
|
||
this.$refs.mescrollRef[this.current].mescroll.resetUpScroll()
|
||
},
|
||
|
||
async upCallback(page) {
|
||
const index = this.current;
|
||
const pageNum = page.num
|
||
const pageSize = page.size
|
||
|
||
apiGoodsLists({
|
||
name: this.keyword,
|
||
type: this.list[index].type,
|
||
page_no: pageNum,
|
||
page_size: pageSize,
|
||
}).then(({
|
||
lists,
|
||
page_size,
|
||
btns,
|
||
more,
|
||
count,
|
||
}) => {
|
||
// 如果是第一页需手动置空列表
|
||
if (pageNum == 1 || this.keyword) this.list[index].lists = []
|
||
// 重置列表数据
|
||
this.btns = btns;
|
||
this.count = count;
|
||
const hasNext = !!more;
|
||
this.list[index].lists = [...this.list[index].lists, ...lists]
|
||
this.$refs.mescrollRef[index].mescroll.endSuccess(lists.length, hasNext);
|
||
}).catch((err) => {
|
||
console.log(err)
|
||
this.mescroll.endErr()
|
||
})
|
||
},
|
||
|
||
openFunc(item, action) {
|
||
this.curData = item;
|
||
this.action = action;
|
||
this[action] = true;
|
||
},
|
||
|
||
// 操作商品
|
||
async goodsSetting() {
|
||
let id = this.curData.id,
|
||
action = this.action == 'del' ? 'delete' : this.action
|
||
await apiGoodsOperation({
|
||
action,
|
||
id
|
||
})
|
||
|
||
this.$refs.mescrollRef[this.current].mescroll.resetUpScroll()
|
||
this.$refs.uToast.show({
|
||
title: '操作成功',
|
||
type: 'success'
|
||
})
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
|
||
<style lang="scss">
|
||
/*根元素需要有固定的高度*/
|
||
page {
|
||
height: 100%;
|
||
box-sizing: border-box;
|
||
|
||
.header {
|
||
padding: 16rpx 30rpx;
|
||
}
|
||
|
||
.nav {
|
||
padding: 15rpx 0;
|
||
}
|
||
|
||
.section {
|
||
overflow: hidden;
|
||
.title {
|
||
padding: 20rpx;
|
||
}
|
||
|
||
.btn {
|
||
margin-top: 20rpx;
|
||
margin-left: 20rpx;
|
||
width: 180rpx;
|
||
height: 64rpx;
|
||
// border-radius: 8rpx;
|
||
font-size: $-font-size-sm;
|
||
}
|
||
|
||
.solid {
|
||
color: $-color-white;
|
||
background-color: #FF4141;
|
||
}
|
||
|
||
.hollow {
|
||
color: $-color-lighter;
|
||
border: 1px solid #DBDBDB;
|
||
}
|
||
}
|
||
}
|
||
</style>
|