<template> <view class="page"> <u-navbar title="店铺管理" :border-bottom="false" :background="bgc" back-icon-color="#fff" title-color='#fff' title-size='36' height='58'></u-navbar> <view class="fzbox"> <!-- 禁用 --> <view class="card" :class="{fixed: index === 0}" v-for="(item,index) in groupList " :key="index" v-if="index==0"> <view class="card_left"> <view class="img"> <image src="https://api.ccttiot.com/smartmeter/img/static/u3jTlduBUSi1yA2H56m9" mode="" v-show="index === 0"></image> <image src="https://api.ccttiot.com/smartmeter/img/static/uPN9ht93jyHZHQGzbsQC" mode="" v-show="index !== 0"></image> </view> <view class="txt" style="font-size: 28rpx;"> {{item.name.length > 10 ? item.name.substring(0, 10) + '...' : item.name }}({{item.deviceCount}}) </view> </view> <view class="card_right"> <image src="https://api.ccttiot.com/smartmeter/img/static/uzgOF6t4abt95qDf111j" mode="" style="width: 34rpx;height: 34rpx;margin-right: 30rpx;"></image> <image src="https://api.ccttiot.com/smartmeter/img/static/u5rf4EUUv9e5KBef4efW" mode=""></image> </view> </view> <HM-dragSorts ref="dragSorts" :list="newobj" :autoScroll="true" :feedbackGenerator="false" @newList="handleNewList" rowHeight='50' @change="change" @confirm="confirm" @onclick="onclick" :listBackgroundColor='F7FAFE'></HM-dragSorts> </view> <!-- <view class="btn" @click="sprice()"> <image src="https://api.ccttiot.com/smartmeter/img/static/uGAS855QnMnfJjPEKK5K" mode=""></image> 新建分组 </view> --> <u-popup v-model="showpopup" mode="center" border-radius='20'> <view class="popcard" v-if="showremake"> <view class="tit"> 修改分组名称 </view> <view class="ipt"> <u-input v-model="remake" placeholder=" " border='surround' placeholder-style='font-size: 24rpx;' /> </view> <view class="btnbox"> <view class="btn2" @click="close()"> 取消 </view> <view class="btn1" @click="sub(1)"> 确定 </view> </view> </view> <view class="popcard" v-if="showpeice" > <!-- <view class="tit"> 新建分组 </view> --> <view class="ipt"> <u-input v-model="price" placeholder="请输入分组名称" border='surround' placeholder-style='font-size: 24rpx;'/> </view> <view class="btnbox"> <view class="btn2" @click="close()"> 取消 </view> <view class="btn1" @click="sub(2)"> 确定 </view> </view> </view> </u-popup> </view> </template> <script> import dragSorts from '@/page_user/HM-dragSorts/HM-dragSorts.vue' export default { components: { 'HM-dragSorts': dragSorts }, data() { return { bgc: { backgroundColor: "#8883f0", }, obj: [], newobj:[], cardHeight: 114, touchStartIndex: -1, startY: 0, direction: 'vertical', touchMoveTimer: null, groupList:[], showpopup:false, remake:'', price:'', showpeice:false, showremake:false, firstlist:[] }; }, computed: { totalHeight() { return this.obj.length * this.cardHeight; }, }, onLoad() { this.getgroup(); }, methods: { sub(num){ if(num==1){ let data ={ storeId:this.groupid, name:this.remake } this.$u.put("/app/store",data).then((res) => { // this.$forceUpdate() if (res.code == 200) { this.showpopup=false this.showremake=false this.getgroup(); uni.navigateBack() // this.loadings=true // this.initChart() } }); }else if(num==2){ let data ={ name:this.price, groupSort:1 } this.showpopup=false this.showpeice=false this.$u.post("/app/store",data).then((res) => { // this.$forceUpdate() if (res.code == 200) { this.getgroup(); // this.loadings=true // this.initChart() } }); } }, getgroup(){ this.$u.get("app/store/listCount").then((res) => { // this.$forceUpdate() if (res.code == 200) { this.groupList=res.data // console.log(this.groupList) this.firstlist= this.groupList[0] this.newobj = this.groupList.slice(1) // this.newobj = this.groupList this.remake='' this.price='' // this.loadings=true // this.initChart() } }); }, delgroup(id){ this.$u.delete("/app/store/"+id).then((res) => { // this.$forceUpdate() if (res.code == 200) { this.getgroup(); } }); }, putgroupname(id){ this.groupid=id this.sremake() }, handleNewList(newList) { let list = [this.firstlist, ...newList]; const newSortedList = list.map((item, index) => { return { storeId: item.storeId, groupSort: index + 1 // 使用索引值加 1 作为 groupSort }; }); console.log("新的排列数据:", newSortedList); setTimeout(()=> { this.$u.put("/app/store/changeSort",newSortedList).then((res) => { // this.$forceUpdate() if (res.code == 200) { // this.getgroup() } }); }, 200); // 在这里处理新的排列数据,可以将其存储到父组件的数据中,或者进行其他操作 }, sremake(){ this.showpopup=true this.showremake=true }, sprice(){ this.showpopup=true this.showpeice=true }, close() { this.showpeice=false this.showremake=false this.showpopup=false }, push() { // 和数组的push使用方法一致,可以push单行,也可以push多行 this.$refs.dragSorts.push({ "name": "push行", "icon": "/static/img/2.png" }); }, unshift() { // 和数组的unshift使用方法一致,可以unshift单行,也可以unshift多行 this.$refs.dragSorts.unshift({ "name": "unshift行", "icon": "/static/img/2.png" }); }, splice() { // 和数组的unshift使用方法一致 下标1开始删除1个并在下标1位置插入行 this.$refs.dragSorts.splice(1, 1, { "name": "splice行", "icon": "/static/img/2.png" }); }, onclick(e) { }, change(e) { // console.log('=== change start ==='); // console.log("被拖动行: " + JSON.stringify(e.moveRow)); // console.log('原始下标:', e.index); // console.log('移动到:', e.moveTo); // console.log('=== change end ==='); }, confirm(e) { }, handleTouchStart(e) { this.touchStartIndex = e.currentTarget.dataset.index; this.startY = e.touches[0].clientY; }, handleTouchMove(e) { clearTimeout(this.touchMoveTimer); this.touchMoveTimer = setTimeout(() => { const deltaY = e.touches[0].clientY - this.startY; const newIndex = Math.floor((this.obj[this.touchStartIndex].top + deltaY) / this.cardHeight); const maxIndex = this.obj.length - 1; if (newIndex >= 1 && newIndex <= maxIndex) { this.obj[this.touchStartIndex].top += deltaY; this.obj[newIndex].top -= deltaY; this.startY = e.touches[0].clientY; this.$nextTick(() => { this.direction = 'vertical'; }); } else { this.direction = 'none'; } }, 16); // 控制触发频率,大约 60 帧每秒 }, handleTouchEnd() { this.touchStartIndex = -1; this.startY = 0; }, handleMoveChange(e) { this.obj = e.detail.source; // 调整位置,防止重叠 this.obj.forEach((item, index) => { // 添加保护,确保 item 存在 if (item) { item.top = index * this.cardHeight; } }); }, }, }; </script> <style lang="scss"> page { background-color: #F7FAFE; } .page { width: 750rpx; padding-bottom: 200rpx; .popcard{ display: flex; justify-content: center; flex-wrap: wrap; // padding: 40rpx; width: 550rpx; height: 400rpx; border-radius: 20rpx; .tit{ display: flex; justify-content: center; width: 100%; align-items: center; font-size: 28rpx; font-weight: 700; } .ipt{ margin-top: 60rpx; width: 80%; // width: 60%; .u-input::placeholder { font-size: 20px; color: red; } } .btnbox{ width: 100%; display: flex; flex-wrap: nowrap; border-radius: 0 0 20rpx 20rpx; .btn2{ display: flex; align-items: center; justify-content: center; width: 50%; // justify-content: center; // width: 200rpx; // height: 70rpx; // border-radius: 20rpx; font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #FFFFFF; background-color: #2A82E4; } .btn1{ display: flex; align-items: center; justify-content: center; width: 50%; // justify-content: center; // width: 200rpx; // height: 70rpx; // border-radius: 20rpx; font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #000; background-color: #fff; border: 1rpx solid #ccc; } } } .fzbox { .card { display: flex; align-items: center; justify-content: space-between; margin: 32rpx auto 0; width: 682rpx; height: 114rpx; background: #FFFFFF; border-radius: 30rpx; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); .card_left { display: flex; flex-wrap: nowrap; align-items: center; margin-left: 48rpx; .img { width: 35.3rpx; height: 35.3rpx; } .txt { margin-left: 52rpx; font-size: 36rpx; font-weight: 400; color: #000000; } } .card_right { margin-right: 38rpx; image { width: 45.51rpx; height: 31.86rpx; } } } } .btn { display: flex; align-items: center; justify-content: center; margin: 32rpx auto 0; border-radius: 30rpx; width: 682rpx; height: 114rpx; background: #FFFFFF; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); image { margin-right: 28rpx; width: 39.92rpx; height: 39.92rpx; } font-size: 36rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #000000; } } </style>