-
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'; |
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); |
||||
|
} |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
} |