# HorScheduleManage 横版赛程管理
# 引入
import PressHorScheduleManage from 'press-plus/press-hor-schedule-manage/press-hor-schedule-manage';
export default {
components: {
PressHorScheduleManage,
}
}
# 代码演示
# 基础用法
<PressHorScheduleManage
:tab-index="curTab"
:team-map="teamMap"
:search-team-list="searchTeamList"
:num-per-group="numPerGroup"
:to-select-num-list="toSelectNumList"
:is-all-confirmed="isAllConfirmed"
@close="close"
@changeTab="changeTab"
@search="search"
@selectNumPerGroup="selectNumPerGroup"
@confirmAdjustGroup="confirmAdjustGroup"
@toggleAllQualification="toggleAllQualification"
@doneConfirmSignUp="doneConfirmSignUp"
@publishScore="publishScore"
@startGame="startGame"
@startAllGame="startAllGame"
/>
import { MOCK_USER_META } from 'src/packages/press-message-detail/demo-helper/data';
const ROUND_TOTAL = 5;
export const getTeamList = (length, start = 0) => Array.from({ length }).map((_, index) => ({
teamavatar: MOCK_USER_META.avatar,
teamname: `name-${index + 1 + start}`,
memnum: 2,
isPass: index % 5 !== 0,
checked: true,
disabled: index % 5 === 0,
members: Array.from({ length: 3 }).map((_, idx) => ({
head: MOCK_USER_META.avatar,
nick: `${MOCK_USER_META.nick} - ${idx + 1}`,
uid: `${index}-${idx}`,
})),
}));
const getGroupTeamList = len => Array.from({ length: len }).map(() => ({
teamAvatar: MOCK_USER_META.avatar,
}));
export const getGroupList = (length = 9, start = 0) => Array.from({ length }).map((_, index) => ({
groupSeq: index + 1 + start,
teamLen: index + 1,
teamList: getGroupTeamList(index + 1),
started: true,
}));
function getGroupMap(): any {
return Array.from({ length: ROUND_TOTAL }).reduce((acc: any, item, index) => {
acc[index + 1] = {
list: getGroupList(),
finished: false,
loading: false,
};
return acc;
}, {});
}
function getRoundList() {
return Array.from({ length: ROUND_TOTAL }).map((_, index) => ({
roundId: index + 1,
started: index % 2 === 0,
}));
}
export function getTeamScoreList() {
return Array.from({ length: 12 }).map((_, index) => ({
teamName: `A-${index + 1}`,
totalScore: 1,
scoreStr: '1 | 2 | 3',
rank: index + 1,
historyScoreList: [
{
roundStr: '第一场',
rank: 1,
score: 2,
},
{
roundStr: '第二场',
rank: 1,
score: 2,
},
],
}));
}
export function getDemoData() {
const teamList = getTeamList(10);
const groupMap = getGroupMap();
const roundList = getRoundList();
const toSelectNumList = Array.from({ length: teamList.length }).map((_, index) => index + 1);
return {
teamList,
groupMap,
groupList: groupMap[1].list,
roundList,
toSelectNumList,
};
}
function resumeViewPort() {
// #ifdef H5
document.querySelector('meta[name=\'viewport\']').content = 'width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover';
// #endif
}
function setViewport() {
// #ifdef H5
document.querySelector('meta[name=\'viewport\']').content = 'width=821, user-scalable=no, viewport-fit=cover';
// #endif
}
export default {
data() {
return {
curTab: 0,
teamMap: {
list: [],
finished: false,
loading: false,
},
searchTeamMap: {
list: [],
finished: false,
loading: false,
},
groupListMap: {
list: [],
finished: false,
loading: false,
},
groupMap: {
1: {
list: [],
finished: false,
loading: false,
},
},
searchTeamMapInGroup: {
list: [],
finished: false,
loading: false,
},
isAllConfirmed: true,
toSelectNumList: [1],
numPerGroup: 1,
curStartRoundId: 1,
curScoreRoundId: 1,
roundList: [],
teamScoreMap: { ['1-1']: { list: getTeamScoreList() } },
};
},
mounted() {
const { teamList, groupMap, roundList, toSelectNumList, groupList } = getDemoData();
setTimeout(() => {
this.teamMap.list = teamList;
this.groupMap = groupMap;
this.roundList = roundList;
this.toSelectNumList = toSelectNumList;
this.groupListMap.list = groupList;
}, 1000);
setViewport();
},
beforeDestroy() {
resumeViewPort();
},
methods: {
close() {
routerBack.call(this);
},
changeTab(tab) {
console.log('changeTab', tab);
this.curTab = tab;
},
search(value) {
console.log('[search] ', value);
this.searchTeamMap.list = this.teamMap.list.filter(item => item.teamname.indexOf(value) > -1);
},
searchTeamGroup(value) {
console.log('[searchTeamGroup] ', value);
this.searchTeamMapInGroup.list = this.teamMap.list.filter(item => item.teamname.indexOf(value) > -1);
},
selectNumPerGroup(num) {
console.log('[selectNumPerGroup]', num);
this.numPerGroup = num;
},
confirmAdjustGroup() {
this.onGTip('[confirmAdjustGroup]');
},
toggleAllQualification() {
this.onGTip('[toggleAllQualification]');
this.isAllConfirmed = !this.isAllConfirmed;
},
doneConfirmSignUp() {
this.onGTip('[doneConfirmSignUp]');
},
publishScore() {
this.onGTip('[publishScore]');
},
startGame() {
this.onGTip('[startGame]');
},
startAllGame() {
this.onGTip('[startAllGame]');
},
changeScoreRoundId(roundId) {
console.log('[changeScoreRoundId] roundId', roundId);
this.onGTip(`[changeScoreRoundId] ${roundId}`);
this.curScoreRoundId = roundId;
},
changeStartRoundId(roundId) {
console.log('[changeStartRoundId] roundId', roundId);
this.onGTip(`[changeStartRoundId] ${roundId}`);
this.curStartRoundId = roundId;
},
selectGroupInScore(groupSeq) {
console.log('[selectGroupInScore] groupSeq', groupSeq);
this.onGTip(`[selectGroupInScore] ${groupSeq}`);
},
checkTeam(team) {
this.$set(team, 'checked', !team.checked);
},
loadMore(key) {
console.log('[demo loadMore]');
const loadMoreMap = {
teamMap: this.loadMoreTeamList,
searchTeamMap: this.loadMoreSearchTeamList,
groupListMap: this.loadMoreGroupListMap,
groupMap: this.loadMoreGroupMap,
searchTeamMapInGroup: this.loadMoreSearchTeamMapInGroup,
};
if (typeof loadMoreMap[key] === 'function') {
loadMoreMap[key]();
}
},
loadMoreTeamList() {
this.loadMoreCommon(
'teamMap',
getTeamList(10, this.teamMap.list.length),
);
},
loadMoreSearchTeamList() {
this.loadMoreCommon(
'searchTeamMap',
getTeamList(10, this.searchTeamMap.list.length),
);
},
loadMoreSearchTeamMapInGroup() {
this.loadMoreCommon(
'searchTeamMapInGroup',
getTeamList(10, this.searchTeamMapInGroup.list.length),
);
},
loadMoreCommon(key, moreList, key2) {
let data = this[key];
if (key2) {
data = data[key2];
}
setTimeout(() => {
data.list = data.list.concat(moreList);
data.loading = false;
data.finished = data.list.length >= 50;
}, 300);
},
loadMoreGroupListMap() {
this.loadMoreCommon(
'groupListMap',
getGroupList(10, this.groupListMap.list.length),
);
},
loadMoreGroupMap() {
this.loadMoreCommon(
'groupMap',
getGroupList(10, this.groupMap[this.curStartRoundId].list.length),
this.curStartRoundId,
);
},
updateLoading(key, value) {
if (key === 'groupMap') {
this.groupMap[this.curStartRoundId].loading = value;
return;
}
this[key].loading = value;
},
}
}
# API
# Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| tab-index | 当前 tab 索引 | number | 0 |
| cur-going-tab | 正在进行中的 tab 索引 | number | 0 |
| team-map | 队伍列表信息 | object | - |
| search-team-map | 搜索队伍信息 | object | - |
| is-all-confirmed | 是否已全部确认 | boolean | false |
| team-total | 队伍总数 | number | 0 |
| checked-team-total | 已确认到场的队伍数目 | number | 0 |
| num-per-group | 每组队伍数 | number | 1 |
| to-select-num-list | 可分配的每组队伍数目列表 | array | [1] |
| group-num | 分组总数 | number | 0 |
| group-list-map | 全部分组信息 | object | - |
| round-total | 轮次数 | number | 1 |
| group-map | 分组对象 | object | - |
| cur-start-round-id | 确认开赛的当前轮次 Id | number | 1 |
| cur-score-round-id | 公布成绩的当前轮次 Id | number | 1 |
| team-score-map | 队伍比分对象 | object | - |
| search-team-map-in-group | 分组中的搜索队伍信息 | object | - |
| round-list | 轮次列表 | array | - |
| published-score | 是否已公布成绩 | boolean | false |
| only-show-disabled-button | 是否只显示禁用按钮状态,数组每一项代表 TabIndex,从 0 开始 | array | - |
| show-confirm-start-o-b | 是否显示确认开赛中的观战按钮 | boolean | false |
| show-publish-score-o-b | 是否显示公布成绩中的观战按钮 | boolean | false |
| history-score-map | 历史战绩详情 | object | - |
# Events
| 事件名 | 说明 | 参数 |
|---|---|---|
| close | 关闭本页面 | - |
| changeTab | 切换 tab | tabIndex |
| toggleAllQualification | 全部确认或取消资格 | - |
| doneConfirmSignUp | 确认资格完毕,进入下一步 | - |
| checkTeam | 确认或取消单个队伍的资格 | team, teamIndex |
| selectNumPerGroup | 选择每组队伍数 | num |
| confirmAdjustGroup | 确认调整分组 | - |
| changeStartRoundId | 确认开赛中的切换轮次 Id | roundId |
| changeScoreRoundId | 公布成绩中的切换轮次 Id | roundId |
| startGame | 单场开赛 | item |
| startAllGame | 整轮开赛 | - |
| publishScore | 公布成绩 | - |
| clickSearch | 确认资格中,点击搜索 | - |
| search | 确认资格中,搜素队伍 | value |
| searchTeamGroup | 确认开赛中,搜素队伍 | value |
| selectGroupInScore | 公布成绩中,切换分组 | groupSeq |
| loadMore | 加载更多 | key, value |
| clickTeamGroupCard | 点击队伍分组卡片 | groupItem, groupIndex, groupList |
| clickSearchTeamCard | 点击搜索队伍分组卡片 | teamItem, teamIndex |
| clickConfirmStartOB | 点击确认开赛中的观战按钮 | - |
| clickPublishScoreOB | 点击公布成绩中的观战按钮 | tableItem, tableIndex |
| clickScoreDetail | 点击成绩详情 | tableItem, tableIndex |
# 类型说明
teamMap
// 队员信息
type IMember = {
head: string; // 头像
is_cap: boolean; // 是否为队长
uid: string;
nick: string;
}
// 队伍信息
type ITeamInfo = {
teamavatar: string;
teamname: string;
memnum: number; // 队伍人数
isPass: boolean; // 是否满足参赛人数
checked: boolean; // 是否已确认资格
disabled: boolean; // 是否禁用
members: Array<IMember>; // 队员信息
}
// teamMap
type ITeamMap = {
list: ITeamList;
finished: boolean;
loading: boolean;
}
// teamList
type ITeamList = Array<ITeamInfo>
// searchTeamMap
type ISearchTeamMap = {
list: Array<ITeamInfo>;
finished: boolean;
loading: boolean;
}
groupListMap & groupMap
groupListMap 是所有轮次的分组信息,groupMap 是某一轮的分组信息。
// 分组信息
type IGroupInfo = {
title: string; // 标题名称,默认为 第 x 组
groupSeq: number; // 第几组,从 1 开始
roundId: number; // 第几轮,从 1 开始
teamLen: number; // 队伍数目
started: boolean; // 是否已开赛
finished: boolean; // 是否已结束
teamList: Array<{
teamAvatar: string; // 队伍头像
showTeamAvatar?: boolean; // 是否显示队伍头像
teamDesc?: string; // 战队描述
teamNumDesc?: string; // 人数描述,比如 3/5
rankIcon?: string; // 段位信息
} & ITeamInfo>;
}
// groupListMap
type IGroupListMap = {
list: Array<GroupInfo>;
finished: boolean;
loading: boolean;
}
// groupMap
type IGroupMap = Record<number, {
list: Array<GroupInfo>;
finished: boolean;
loading: boolean;
}>
// searchTeamMapInGroup
type ISearchTeamMapInGroup = {
list: Array<ITeamInfo>;
finished: boolean;
loading: boolean;
}
teamScoreMap
// teamScoreMap, key 为 `${curScoreRoundId}-${curGroupSeq}`
type ITeamScoreMap = Record<string, {
list: Array<{
rank: number; // 排名
teamAvatar: string;
teamName: string;
scoreStr: string; // 比分,可以为如下形式: 1 | 2 | 1
totalScore: number; // 总积分
historyScoreList: Array<{
roundStr: string; // 轮次描述,比如 第一场
rank: number;
score: number; // 比分
}>
}>;
}>
roundList
type IRoundList = Array<{
roundId: number;
started: boolean; // 是否已开赛
}>