Commit 9cc970f0 authored by lvtz's avatar lvtz

fix

parent 1a0d37df
import {
unlockSubjectListGet,
deletesubjects
} from '../../../service/business/common.js';
import Touches from '../../../utilities/touchs.js'
var app = getApp();
......@@ -67,8 +68,44 @@ Page({
lockSubjects && this.setData({ lockSubjects })
},
itemDelete (e) {
let lockSubjects = Touches.deleteItem(e, this.data.lockSubjects)
lockSubjects && this.setData({ lockSubjects })
const that = this;
const { item, index } = e.currentTarget.dataset;
if(index==0){
wx.showToast({
title: '第一关无法删除',
icon: 'none'
})
return
}
wx.showModal({
title: '',
content: item.clockCount>0?'删除后将清空此关卡打卡内容\r\n 确定要删除吗?':'确定要删除此关卡吗?',
confirmColor: '#35BAFD',
success (res) {
console.log(res);
if (res.confirm) {
deletesubjects({
id: item.id,
school_id: that.data.sid
})
.then(res => {
if (res.code == 200) {
wx.showToast({
title: "删除成功",
icon: "success",
duration: 2000
});
let lockSubjects = Touches.deleteItem(e, that.data.lockSubjects)
lockSubjects && that.setData({ lockSubjects });
}
})
.catch(() => {});
}
}
})
}
})
\ No newline at end of file
{
"navigationBarTitleText": "调整关卡顺序",
"enablePullDownRefresh": true,
"enablePullDownRefresh": false,
"usingComponents": {
"sjd-media-editor": "../../../components/newsjdmediaeditor",
"sound-recording": "../../../components/soundrecording",
"w-switch": "/dist/w-switch/index",
"w-button": "/dist/w-button/index",
"w-cell": "/dist/w-cell/index",
"w-cell-group": "/dist/w-cell-group/index",
"w-checkbox": "/dist/w-checkbox/index",
"w-pane": "/dist/w-pane/index",
"expiredTip": "../../components/expiredTip"
"sort-drag": "../../../components/sort-drag"
}
}
\ No newline at end of file
......@@ -13,7 +13,7 @@
</view>
<view class="box-opt">
<image class="icon-del" src="{{localImageRoot}}2b/themeeditor/icon_del.png?{{imageVersion}}"></image>
<view class="text" bindtap="itemDelete" data-index="{{index}}">删除</view>
<view class="text" bindtap="itemDelete" data-index="{{index}}" data-item="{{item}}">删除</view>
</view>
</view>
</view>
......
/**
* 判断是否超出范围
*/
const IsOutRange = (x1, y1, x2, y2, x3, y3) => {
return x1 < 0 || x1 >= y1 || x2 < 0 || x2 >= y2 || x3 < 0 || x3 >= y3
};
/**
* 版本号比较
*/
const compareVersion = (v1, v2) => {
v1 = v1.split('.')
v2 = v2.split('.')
const len = Math.max(v1.length, v2.length)
while (v1.length < len) {
v1.push('0')
}
while (v2.length < len) {
v2.push('0')
}
for (let i = 0; i < len; i++) {
const num1 = parseInt(v1[i])
const num2 = parseInt(v2[i])
if (num1 > num2) {
return 1
} else if (num1 < num2) {
return -1
}
}
return 0
}
Component({
options: {
multipleSlots: true
},
properties: {
beforeExtraNodes: {type: Array, value: []}, // 插入正常节点之前的额外节点
afterExtraNodes: {type: Array, value: []}, // 插入正常节点之后的额外节点
listData: {type: Array, value: []}, // 数据源
columns: {type: Number, value: 1}, // 列数
topSize: {type: Number, value: 0}, // 顶部高度
bottomSize: {type: Number, value: 0}, // 底部高度
scrollTop: {type: Number, value: 0} // 页面滚动高度
},
data: {
/* 未渲染数据 */
pageMetaSupport: false, // 当前版本是否支持 page-meta 标签
windowHeight: 0, // 视窗高度
platform: '', // 平台信息
realTopSize: 0, // 计算后顶部固定高度实际值
realBottomSize: 0, // 计算后底部固定高度实际值
rows: 0, // 行数
itemDom: {width: 0, height: 0, left: 0, top: 0}, // 每一项 item 的 dom 信息, 由于大小一样所以只存储一个
itemWrapDom: {width: 0, height: 0, left: 0, top: 0}, // 整个拖拽区域的 dom 信息
startId: 0, // 初始触摸点 identifier
preStartKey: -1, // 前一次排序时候的起始 sortKey 值
/* 渲染数据 */
list: [], // 渲染数据列
cur: -1, // 当前激活的元素
curZ: -1, // 当前激活的元素, 用于控制激活元素z轴显示
tranX: 0, // 当前激活元素的 X轴 偏移量
tranY: 0, // 当前激活元素的 Y轴 偏移量
itemWrapHeight: 0, // 动态计算父级元素高度
dragging: false, // 是否在拖拽中
itemTransition: false, // item 变换是否需要过渡动画, 首次渲染不需要
},
options: {
multipleSlots: true // 在组件定义时的选项中启用多slot支持
},
methods: {
/**
* 长按触发移动排序
*/
longPress(e) {
// 获取触摸点信息
let startTouch = e.changedTouches[0];
if (!startTouch) return;
// 固定项则返回
let index = e.currentTarget.dataset.index;
if (this.isFixed(index)) return;
// 防止多指触发 drag 动作, 如果已经在 drag 中则返回, touchstart 事件中有效果
if (this.data.dragging) return;
this.setData({dragging: true});
let {platform, itemDom, itemWrapDom} = this.data,
{pageX: startPageX, pageY: startPageY, identifier: startId} = startTouch;
// 计算X,Y轴初始位移, 使 item 中心移动到点击处
let tranX = startPageX - itemDom.width / 2 - itemWrapDom.left,
tranY = startPageY - itemDom.height / 2 - itemWrapDom.top;
// 单列时候X轴初始不做位移
if (this.data.columns === 1) tranX = 0;
this.data.startId = startId;
this.setData({cur: index, curZ: index, tranX, tranY});
if (platform !== "devtools") wx.vibrateShort();
},
touchMove(e) {
// 获取触摸点信息
let currentTouch = e.changedTouches[0];
if (!currentTouch) return;
if (!this.data.dragging) return;
let {pageMetaSupport, windowHeight, realTopSize, realBottomSize, itemDom, itemWrapDom, preStartKey, columns, rows} = this.data,
{pageX: currentPageX, pageY: currentPageY, identifier: currentId, clientY: currentClientY} = currentTouch;
// 如果不是同一个触发点则返回
if (this.data.startId !== currentId) return;
// 通过 当前坐标点, 初始坐标点, 初始偏移量 来计算当前偏移量
let tranX = currentPageX - itemDom.width / 2 - itemWrapDom.left,
tranY = currentPageY - itemDom.height / 2 - itemWrapDom.top;
// 单列时候X轴初始不做位移
if (columns === 1) tranX = 0;
// 到顶到底自动滑动
if (currentClientY > windowHeight - itemDom.height - realBottomSize) {
// 当前触摸点pageY + item高度 - (屏幕高度 - 底部固定区域高度)
if (pageMetaSupport) {
this.triggerEvent("scroll", {
scrollTop: currentPageY + itemDom.height - (windowHeight - realBottomSize)
});
} else {
wx.pageScrollTo({
scrollTop: currentPageY + itemDom.height - (windowHeight - realBottomSize),
duration: 300
});
}
} else if (currentClientY < itemDom.height + realTopSize) {
// 当前触摸点pageY - item高度 - 顶部固定区域高度
if (pageMetaSupport) {
this.triggerEvent("scroll", {
scrollTop: currentPageY - itemDom.height - realTopSize
});
} else {
wx.pageScrollTo({
scrollTop: currentPageY - itemDom.height - realTopSize,
duration: 300
});
}
}
// 设置当前激活元素偏移量
this.setData({tranX: tranX, tranY: tranY});
// 获取 startKey 和 endKey
let startKey = parseInt(e.currentTarget.dataset.key);
let curX = Math.round(tranX / itemDom.width), curY = Math.round(tranY / itemDom.height);
let endKey = curX + columns * curY;
// 遇到固定项和超出范围则返回
if (this.isFixed(endKey) || IsOutRange(curX, columns, curY, rows, endKey, this.data.list.length)) return;
// 防止拖拽过程中发生乱序问题
if (startKey === endKey || startKey === preStartKey) return;
this.data.preStartKey = startKey;
// 触发排序
this.sort(startKey, endKey);
},
touchEnd() {
if (!this.data.dragging) return;
this.triggerCustomEvent(this.data.list, "sortend");
this.clearData();
},
/**
* 根据 startKey 和 endKey 去重新计算每一项 sortKey
*/
sort(startKey, endKey) {
this.setData({itemTransition: true});
let list = this.data.list.map((item) => {
if (item.fixed) return item;
if (startKey < endKey) { // 正序拖动
if (item.sortKey > startKey && item.sortKey <= endKey) {
item.sortKey = this.excludeFix(item.sortKey - 1, startKey, 'reduce');
} else if (item.sortKey === startKey) {
item.sortKey = endKey;
}
return item;
} else if (startKey > endKey) { // 倒序拖动
if (item.sortKey >= endKey && item.sortKey < startKey) {
item.sortKey = this.excludeFix(item.sortKey + 1, startKey, 'add');
} else if (item.sortKey === startKey) {
item.sortKey = endKey;
}
return item;
}
});
this.updateList(list);
},
/**
* 排除固定项得到最终 sortKey
*/
excludeFix(sortKey, startKey, type) {
if (sortKey === startKey) return startKey;
if (this.data.list[sortKey].fixed) {
let _sortKey = type === 'reduce' ? sortKey - 1 : sortKey + 1;
return this.excludeFix(_sortKey, startKey, type);
} else {
return sortKey;
}
},
/**
* 根据排序后 list 数据进行位移计算
*/
updateList(data, vibrate = true) {
let {platform} = this.data;
let list = data.map((item, index) => {
item.tranX = `${(item.sortKey % this.data.columns) * 100}%`;
item.tranY = `${Math.floor(item.sortKey / this.data.columns) * 100}%`;
return item;
});
this.setData({list: list});
if (!vibrate) return;
if (platform !== "devtools") wx.vibrateShort();
this.triggerCustomEvent(list, "change");
},
/**
* 判断是否是固定的 item
*/
isFixed(index) {
let list = this.data.list;
if (list && list[index] && list[index].fixed) return 1;
return 0;
},
/**
* 清除参数
*/
clearData() {
this.setData({
preStartKey: -1,
dragging: false,
cur: -1,
tranX: 0,
tranY: 0
});
// 延迟清空
setTimeout(() => {
this.setData({
curZ: -1,
})
}, 300)
},
/**
* 点击每一项后触发事件
*/
itemClick(e) {
let {index, key} = e.currentTarget.dataset;
let list = this.data.list;
let currentItem = list[index];
if (!currentItem.extraNode) {
let _list = [];
list.forEach((item) => {
_list[item.sortKey] = item;
});
let currentKey = -1;
for (let i = 0, len = _list.length; i < len; i++) {
let item = _list[i];
if (!item.extraNode) {
currentKey++;
}
if (item.sortKey === currentItem.sortKey) {
break;
}
}
this.triggerEvent('click', {
key: currentKey,
data: currentItem.data
});
}
},
/**
* 封装自定义事件
* @param list 当前渲染的数据
* @param type 事件类型
*/
triggerCustomEvent(list, type) {
let _list = [], listData = [];
list.forEach((item) => {
_list[item.sortKey] = item;
});
_list.forEach((item) => {
if (!item.extraNode) {
listData.push(item.data);
}
});
this.triggerEvent(type, {listData: listData});
},
/**
* 初始化获取 dom 信息
*/
initDom() {
let {windowWidth, windowHeight, platform, SDKVersion} = wx.getSystemInfoSync();
this.data.pageMetaSupport = compareVersion(SDKVersion, '2.9.0') >= 0;
let remScale = (windowWidth || 375) / 375,
realTopSize = this.data.topSize * remScale / 2,
realBottomSize = this.data.bottomSize * remScale / 2;
this.data.windowHeight = windowHeight;
this.data.platform = platform;
this.data.realTopSize = realTopSize;
this.data.realBottomSize = realBottomSize;
this.createSelectorQuery().select(".list-item").boundingClientRect((res) => {
let rows = Math.ceil(this.data.list.length / this.data.columns);
this.data.rows = rows;
this.data.itemDom = res;
this.setData({
itemWrapHeight: rows * res.height,
});
this.createSelectorQuery().select(".list-box").boundingClientRect((res) => {
this.data.itemWrapDom = res;
this.data.itemWrapDom.top += this.data.scrollTop
}).exec();
}).exec();
},
/**
* 初始化函数
* {listData, columns, topSize, bottomSize} 参数改变需要重新调用初始化方法
*/
init() {
this.clearData();
this.setData({itemTransition: false});
// 避免获取不到节点信息报错问题
if (this.data.listData.length === 0) {
this.setData({list: [], itemWrapHeight: 0});
return;
}
let {listData, beforeExtraNodes, afterExtraNodes} = this.data;
let _listData = [];
let delItem = (item, extraNode) => ({
id: item.dragId,
slot: item.slot,
fixed: item.fixed,
extraNode: extraNode,
tranX: "0%",
tranY: "0%",
data: item
});
// 遍历数据源增加扩展项, 以用作排序使用
listData.forEach((item, index) => {
beforeExtraNodes.forEach((_item) => {
if (_item.destKey === index) _listData.push(delItem(_item, true));
});
_listData.push(delItem(item, false));
afterExtraNodes.forEach((_item, _index) => {
if (_item.destKey === index) _listData.push(delItem(_item, true));
});
});
let list = _listData.map((item, index) => {
return {
sortKey: index, // 初始化 sortKey 为当前项索引值
...item
};
});
this.updateList(list, false);
// 异步加载数据时候, 延迟执行 initDom 方法, 防止基础库 2.7.1 版本及以下无法正确获取 dom 信息
setTimeout(() => this.initDom(), 0);
}
},
ready() {
this.init();
}
});
<view class="list-box" style="height: {{ itemWrapHeight }}px;">
<view
class="list-item {{cur == index ? 'cur':''}} {{curZ == index ? 'zIndex':''}} {{itemTransition && index !== cur ? 'itemTransition':''}} {{item.fixed ? 'fixed' : ''}}"
wx:for="{{list}}"
wx:key="id"
data-key="{{item.sortKey}}"
data-index="{{index}}"
style="transform: translate3d({{index === cur ? tranX + 'px' : item.tranX}}, {{index === cur ? tranY + 'px' : item.tranY}}, 0);width: {{100 / columns}}%"
bindtap="itemClick"
bind:longpress="longPress"
catch:touchmove="{{dragging?'touchMove':''}}"
catch:touchend="{{dragging?'touchEnd':''}}">
<!-- start:请在该区域编写自己的渲染逻辑 -->
<!-- <view wx:if="{{columns === 1 && item.extraNode}}" >
<view class="cell__bd" style="height: 160rpx;">
<slot name="{{item.slot}}"></slot>
</view>
</view> -->
<slot name="slidecontent"></slot>
<!-- <view wx:elif="{{columns > 1 && item.extraNode}}" class="info">
<view class="info__item">
<slot name="{{item.slot}}"></slot>
</view>
</view>
<view wx:elif="{{columns > 1 && !item.extraNode}}" class="info">
<view class="info__item">
<image class="image" src="{{item.data.images}}"></image>
</view>
</view> -->
<!-- end:请在该区域编写自己的渲染逻辑 -->
</view>
</view>
.list-box {
position: relative;
padding: 15rpx 24rpx;
}
.list-box .list-item {
position: absolute;
width: 100%;
z-index: 1;
margin-bottom: 8rpx;
}
.list-box .list-item:last-of-type {
margin-bottom: 0;
}
.list-box .list-item.itemTransition {
transition: transform 0.3s !important;
}
.list-box .list-item.zIndex {
z-index: 2;
}
.list-box .list-item.cur {
transition: initial;
}
.list-box .list-item.fixed {
z-index: 0 !important;
}
.list-box .list-item .item-sorttitle {
font-size: 22rpx;
color: #999;
line-height: 30rpx;
padding: 16rpx 0;
}
.list-box .list-item .item-wrap {
background-color: #fff;
height: 100rpx;
position: relative;
border-radius: 20rpx;
overflow: hidden;
}
.list-box .list-item .item-info {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 2;
transition: left 0.2s ease-in-out;
background: #fff;
padding: 0 24rpx;
}
.list-box .list-item .item-info .item-title {
font-size: 26rpx;
color: #555;
line-height: 37rpx;
}
.list-box .list-item .item-info .icon-opt {
width: 26rpx;
height: 18rpx;
}
.list-box .list-item .box-opt {
position: absolute;
top: 0;
right: 0;
width: 125rpx;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: red;
border-radius: 0 22rpx 22rpx 0;
}
.list-box .list-item .box-opt .icon-del {
width: 30rpx;
height: 30rpx;
}
.list-box .list-item .box-opt .text {
font-size: 22rpx;
color: #fff;
padding-top: 10rpx;
}
......@@ -402,12 +402,12 @@ Page({
},
previewbanner() {
const that = this;
if (!that.data.moreTheme.banner) {
if (!that.data.moreTheme.land_content) {
return;
}
wxPreviewImage({
urls: [that.data.moreTheme.banner],
current: that.data.moreTheme.banner
urls: [that.data.moreTheme.land_content.cover],
current: that.data.moreTheme.land_content.cover
});
},
// 视频播放相关代码
......
......@@ -8,8 +8,7 @@
</btn-drag>
<view class="sharemoretheme-box">
<view class="top-img-box">
<!-- <image mode="aspectFill" src="https://cdn.img.shangjiadao.cn/source/images/dakav4/morethemeindex/unlockindex.png" class="img-box" alt="Image" /> -->
<image mode="aspectFill" src="{{filter.imagify(moreTheme.banner || 'https://cdn.img.shangjiadao.cn/qingxiao/daka/images/2c/sharemoretheme/newunlockbg.png')}}" bindtap="previewbanner" class="img-box" alt="Image" />
<image mode="aspectFill" src="{{filter.imagify(moreTheme.land_content.cover || 'https://cdn.img.shangjiadao.cn/qingxiao/daka/images/2c/sharemoretheme/newunlockbg.png')}}" bindtap="previewbanner" class="img-box" alt="Image" />
</view>
<view class="title-box">{{moreTheme.title}}</view>
<view class="coursecountbox">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment