feat(challenges): 支持自定义挑战类型并优化必填字段验证

- 新增 CUSTOM 挑战类型枚举值
- requirementLabel 字段改为可选,允许为空并添加默认值处理
- minimumCheckInDays 最大值从 365 提升至 1000,支持更长周期挑战
- 推送通知模板支持自定义挑战的动态文案生成
- 新增 getCustomEncouragementTemplate 和 getCustomInvitationTemplate 函数
This commit is contained in:
richarjiang
2025-11-27 11:11:26 +08:00
parent 7a05097226
commit ac231a7742
6 changed files with 58 additions and 15 deletions

View File

@@ -46,6 +46,9 @@ export const ENCOURAGEMENT_TEMPLATES = {
{ title: '团队体重挑战', body: '今天体重挑战群里又有很多人完成了目标!一起健康生活!' },
{ title: '健康生活记录', body: '挑战者们都在坚持健康饮食+适量运动,你也是其中一员!' },
],
[ChallengeType.CUSTOM]: [
// 自定义挑战使用动态模板,不在此处定义
],
};
/**
@@ -82,6 +85,9 @@ export const INVITATION_TEMPLATES = {
{ title: '健康体重挑战', body: '21天体重管理见证自己的变化' },
{ title: '体重目标挑战', body: '科学管理体重,享受健康生活!' },
],
[ChallengeType.CUSTOM]: [
// 自定义挑战使用动态模板,不在此处定义
],
};
/**
@@ -106,7 +112,12 @@ export function getRandomTemplate<T>(templates: T[]): T {
/**
* 根据挑战类型获取鼓励文案
*/
export function getEncouragementTemplate(challengeType: ChallengeType) {
export function getEncouragementTemplate(challengeType: ChallengeType, challengeTitle?: string) {
// 自定义挑战使用动态模板
if (challengeType === ChallengeType.CUSTOM && challengeTitle) {
return getCustomEncouragementTemplate(challengeTitle);
}
const templates = ENCOURAGEMENT_TEMPLATES[challengeType] || ENCOURAGEMENT_TEMPLATES[ChallengeType.EXERCISE];
return getRandomTemplate(templates);
}
@@ -114,7 +125,12 @@ export function getEncouragementTemplate(challengeType: ChallengeType) {
/**
* 根据挑战类型获取邀请文案
*/
export function getInvitationTemplate(challengeType: ChallengeType) {
export function getInvitationTemplate(challengeType: ChallengeType, challengeTitle?: string) {
// 自定义挑战使用动态模板
if (challengeType === ChallengeType.CUSTOM && challengeTitle) {
return getCustomInvitationTemplate(challengeTitle);
}
const templates = INVITATION_TEMPLATES[challengeType] || INVITATION_TEMPLATES[ChallengeType.EXERCISE];
return getRandomTemplate(templates);
}
@@ -124,4 +140,30 @@ export function getInvitationTemplate(challengeType: ChallengeType) {
*/
export function getGeneralInvitationTemplate() {
return getRandomTemplate(GENERAL_INVITATION_TEMPLATES);
}
/**
* 生成自定义挑战的鼓励文案模板
*/
export function getCustomEncouragementTemplate(challengeTitle: string) {
const templates = [
{ title: `${challengeTitle}进行中`, body: `今天已有多人参与「${challengeTitle}」!你也要加油哦!` },
{ title: `${challengeTitle}提醒`, body: `挑战伙伴们都在坚持「${challengeTitle}」,每一步努力都值得!` },
{ title: `${challengeTitle}打卡`, body: `看到很多挑战者都在参与「${challengeTitle}」,你也是其中一员!` },
{ title: `团队挑战`, body: `${challengeTitle}」挑战群里又有很多人完成了目标!别掉队,一起加油!` },
{ title: `挑战分享`, body: `挑战者们都在分享「${challengeTitle}」的心得,你今天打卡了吗?` },
];
return getRandomTemplate(templates);
}
/**
* 生成自定义挑战的邀请文案模板
*/
export function getCustomInvitationTemplate(challengeTitle: string) {
const templates = [
{ title: `${challengeTitle}邀请`, body: `加入「${challengeTitle}」,一起挑战自我,收获成长!` },
{ title: `挑战邀请`, body: `${challengeTitle}」正在进行中,快来加入我们吧!` },
{ title: `一起挑战`, body: `开启「${challengeTitle}」之旅,遇见更好的自己!` },
];
return getRandomTemplate(templates);
}