-
12src/api/server.js
-
19src/pages.json
-
16src/pages/index/index.vue
-
BINsrc/static/images/tab/index_a.png
-
BINsrc/static/images/tab/index_g.png
-
BINsrc/static/images/tab/mine_a.png
-
BINsrc/static/images/tab/mine_g.png
-
BINsrc/static/images/tab/order_a.png
-
BINsrc/static/images/tab/order_g.png
-
3src/subpackage/authorize/api/index.js
-
129src/subpackage/authorize/pages/index.vue
-
69src/subpackage/groupon/components/site/footer.vue
-
61src/subpackage/groupon/components/site/table.vue
-
252src/subpackage/groupon/js/site_select/autoSelect.js
-
0src/subpackage/groupon/js/site_select/handle.js
-
50src/subpackage/groupon/pages/site_select.vue
-
16src/utils/polish.js
After Width: 104 | Height: 104 | Size: 1.6 KiB |
After Width: 104 | Height: 104 | Size: 1.3 KiB |
After Width: 104 | Height: 104 | Size: 1.6 KiB |
After Width: 104 | Height: 104 | Size: 1.4 KiB |
After Width: 104 | Height: 104 | Size: 831 B |
After Width: 104 | Height: 104 | Size: 688 B |
@ -1,7 +1,8 @@ |
|||
import server from '@/api/server'; |
|||
|
|||
// 公共
|
|||
export const douyinMiniAppBaseAuth = params => server.post({ url: '/user/douyinMiniAppBaseAuth', ...params }); // 抖音小程序code登录
|
|||
export const douyinMiniAppBaseAuth = params => server.post({ url: '/user/douyinMiniAppBaseAuth', ...params }); // 用户获取信息
|
|||
export const douyinMiniAppLoginAndSync = params => server.post({ url: '/user/douyinMiniAppLoginAndSync', ...params }); // 用户同步信息
|
|||
|
|||
|
|||
|
@ -0,0 +1,252 @@ |
|||
import { showModal } from '@/utils/polish'; |
|||
import { deepClone } from '@/utils' |
|||
/** |
|||
* 获取自动勾选场地 |
|||
* 起订和连场混处理, |
|||
* 只会向下判断 |
|||
* |
|||
*/ |
|||
export class AutoSelect { |
|||
items = []; // 场地列表 -> /stadium/book/list (不要修改,只读)
|
|||
index = -1; // 当前点击索引
|
|||
timeUnit = 0; // 时间间隔单位 (1=>1/ 2=>0.5)
|
|||
bookingHour = 0; // 起订小时
|
|||
tagItem = {}; // 当前点击 tag
|
|||
|
|||
constructor({ items, index, timeUnit, bookingHour }){ |
|||
this.items = deepClone(items); |
|||
this.index = index; |
|||
this.timeUnit = timeUnit === 1 ? 1 : timeUnit === 2 ? .5 : ''; // 时间间隔单位
|
|||
this.bookingHour = bookingHour ?? 0; // 起订小时
|
|||
this.tagItem = deepClone(items[index]); // 当前点击 tag
|
|||
|
|||
} |
|||
|
|||
// 获取连场/起订场地信息
|
|||
getInfo(){ |
|||
let _bookNum = (this.bookingHour / (this.timeUnit ?? 0)) - 1; // 起订场地数量 (-1 剔除_curTag)
|
|||
let _handleItems = deepClone(this.items); |
|||
let _curTag = deepClone(_handleItems[this.index]); // 当前命中 tag
|
|||
let _startIdx = this.index; |
|||
let _endIdx = this.index; |
|||
let _noticeList = []; |
|||
// 命中连场
|
|||
if(_curTag?.time_arrow_id){ |
|||
while( |
|||
_handleItems?.[_startIdx-1]?.is_valid |
|||
&&!_handleItems?.[_startIdx-1]?.isDisable |
|||
&&_handleItems?.[_startIdx-1]?.time_arrow_id === _curTag.time_arrow_id |
|||
){ |
|||
_startIdx--; |
|||
_bookNum-- |
|||
} |
|||
while( |
|||
_handleItems?.[_endIdx+1]?.is_valid |
|||
&&!_handleItems?.[_endIdx+1]?.isDisable |
|||
&&_handleItems?.[_endIdx+1]?.time_arrow_id === _curTag.time_arrow_id |
|||
){ |
|||
_endIdx++; |
|||
_bookNum-- |
|||
} |
|||
// 连场提示新增
|
|||
if(_curTag?._is_selected)_noticeList.push(this.getCtnOrderTip({ |
|||
ctnStartIdx: _startIdx, |
|||
ctnEndIdx: _endIdx |
|||
})) |
|||
} |
|||
|
|||
// 当前tag为已选中,只对命中连场处理,后续逻辑不处理
|
|||
if(!_curTag?._is_selected)return [ |
|||
this.getHandleItems({ |
|||
startIdx: _startIdx, |
|||
endIdx: _endIdx, |
|||
referTargetBolean: _curTag?._is_selected ?? true |
|||
}), |
|||
[] |
|||
]; |
|||
|
|||
// 获取目标后剩余空场地数量
|
|||
let _afterEmptyNum = this.getAfterEmptyNum({ index: _endIdx }); |
|||
|
|||
if( |
|||
_bookNum > 0 // 起订场地数量
|
|||
&&!this.otherItemIsSelect({ // 当前场馆存在其它已选,不执行起订逻辑
|
|||
oStartIdx: _startIdx, |
|||
oEndIdx: _endIdx |
|||
}) |
|||
&&_afterEmptyNum >= _bookNum // 后续场地不满足起订,不执行
|
|||
&&_handleItems?.[_endIdx+1]?.is_valid |
|||
&&!_handleItems?.[_endIdx+1]?.isDisable |
|||
){ |
|||
// 起订提示新增
|
|||
_noticeList.push(`此场地${ this.bookingHour }小时起订`) |
|||
|
|||
// 获取后续场地所需自动勾选范围
|
|||
let [ rangeEndIdx, noticeLs ] = this.getAutoSelectRange({ |
|||
rangeIndex: _endIdx + 1, |
|||
nums: _bookNum |
|||
}) |
|||
_endIdx = rangeEndIdx; |
|||
_noticeList.push(...noticeLs); |
|||
} |
|||
|
|||
return [ |
|||
this.getHandleItems({ |
|||
handleItems: _handleItems, |
|||
startIdx: _startIdx, |
|||
endIdx: _endIdx, |
|||
referTargetBolean: _curTag?._is_selected ?? true |
|||
}), |
|||
_noticeList |
|||
]; |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 获取勾选范围 |
|||
* @param {Number} rangeIndex 开始索引 |
|||
* @param {Number} nums 订场数量 |
|||
* @param {Array} ctnNoticeList 连场提示信息列表 |
|||
* @return {Array} [ rangeEndIdx, ctnNoticeList, nums ] |
|||
* */ |
|||
getAutoSelectRange({ |
|||
rangeIndex, nums, ctnNoticeList = [] |
|||
}){ |
|||
let _rangeItems = this.items; |
|||
let _curRangeTag = _rangeItems?.[rangeIndex] || {}; |
|||
let _rangeEndIdx = rangeIndex; |
|||
|
|||
if ( |
|||
_curRangeTag.is_valid |
|||
&&!_curRangeTag?.isDisable |
|||
&&nums>0 |
|||
)nums--; |
|||
|
|||
// 只要命中到第一个,就继续往后,不需要考虑nums
|
|||
if(!!_curRangeTag?.time_arrow_id){ |
|||
while( |
|||
_rangeItems?.[_rangeEndIdx+1]?.is_valid |
|||
&&!_rangeItems?.[_rangeEndIdx+1]?.isDisable |
|||
&&_rangeItems?.[_rangeEndIdx+1]?.time_arrow_id === _curRangeTag.time_arrow_id |
|||
){ |
|||
_rangeEndIdx++; |
|||
nums-- |
|||
} |
|||
// 连场提示新增
|
|||
ctnNoticeList.push(this.getCtnOrderTip({ |
|||
ctnStartIdx: rangeIndex, |
|||
ctnEndIdx: _rangeEndIdx |
|||
})) |
|||
} |
|||
|
|||
// 起订模式用递归,起订时长可能存在多个连场
|
|||
if( |
|||
nums>0 |
|||
&&_rangeItems?.[_rangeEndIdx+1]?.is_valid |
|||
&&!_rangeItems?.[_rangeEndIdx+1]?.isDisable |
|||
){ |
|||
let [ _endIdx, _num ] = this.getAutoSelectRange({ |
|||
rangeIndex: _rangeEndIdx + 1, |
|||
nums, |
|||
ctnNoticeList |
|||
}) |
|||
_rangeEndIdx = _endIdx; |
|||
nums = _num; |
|||
} |
|||
|
|||
return [ |
|||
_rangeEndIdx, |
|||
ctnNoticeList, |
|||
nums |
|||
] |
|||
} |
|||
|
|||
/** |
|||
* 获取连场提示 |
|||
* @param { Number } ctnStartIdx 连场开始索引 |
|||
* @param { Number } ctnEndIdx 连场结束索引 |
|||
* @return { String } 连场提示 |
|||
* */ |
|||
getCtnOrderTip({ ctnStartIdx, ctnEndIdx }){ |
|||
let _endItem = this.items[ctnEndIdx]; |
|||
let _endTime = _endItem.time.split('-')[1]; |
|||
return `${this.items[ctnStartIdx].duration}-${_endTime}为连场(${(ctnEndIdx - ctnStartIdx) + 1}场) 预订已自动为您勾选`; |
|||
} |
|||
|
|||
/** |
|||
* 获取处理后的场地列表 |
|||
* @param { Number } startIdx 开始索引 |
|||
* @param { Number } endIdx 结束索引 |
|||
* @param { Boolean } referTargetBolean 参考目标 |
|||
* @return { Array } [ this.items ] |
|||
* */ |
|||
getHandleItems({ |
|||
startIdx, endIdx, referTargetBolean |
|||
}){ |
|||
return this.items.map((e, i)=>{ |
|||
if(i>=startIdx&&i<=endIdx)e._is_selected = referTargetBolean; |
|||
return e; |
|||
}) |
|||
} |
|||
|
|||
/** |
|||
* 获取后续剩余空场地数量 |
|||
* @param { Number } index 当前点击索引 |
|||
* @return { Number } 后续剩余空场地数量 |
|||
* */ |
|||
getAfterEmptyNum({ index }){ |
|||
let _afterEmptyNum = 0; |
|||
while( |
|||
this.items?.[index + _afterEmptyNum + 1]?.is_valid |
|||
&&!this.items?.[index + _afterEmptyNum + 1]?.isDisable |
|||
&&!this.items?.[index + _afterEmptyNum + 1]?._is_selected |
|||
){ |
|||
_afterEmptyNum++; |
|||
} |
|||
return _afterEmptyNum; |
|||
} |
|||
|
|||
/** |
|||
* 当前列表是否存在其他已选场地 |
|||
* @param { Number } oStartIdx 排除开始索引 |
|||
* @param { Number } oEndIdx 排除结束索引 |
|||
* @return { Boolean } 是否存在其他已选场地 |
|||
* */ |
|||
otherItemIsSelect({ |
|||
oStartIdx, oEndIdx |
|||
}){ |
|||
for(let i=0; i<this.items.length; i++){ |
|||
if(i>=oStartIdx&&i<=oEndIdx)continue; |
|||
if(this.items[i]._is_selected)return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
/** |
|||
* 循环提示 |
|||
* @param {Array} arr 提示列表 |
|||
* */ |
|||
async showModalList(arr = []){ |
|||
if(!arr.length)return; |
|||
while(arr.length > 0){ |
|||
await this.showModal({ title: '提示', content: arr.shift() }); |
|||
} |
|||
} |
|||
/** |
|||
* 提示 |
|||
* @param {String} title 标题 |
|||
* @param {String} content 内容 |
|||
* @returns {Promise} Promise |
|||
* */ |
|||
showModal({ title, content }){ |
|||
return new Promise((resolve, reject)=>{ |
|||
showModal({ |
|||
title: title, |
|||
content: content, |
|||
success: res=>{ |
|||
resolve(res); |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
} |