Files
plates-server/src/push-notifications/templates/challenge-templates.ts
richarjiang ac231a7742 feat(challenges): 支持自定义挑战类型并优化必填字段验证
- 新增 CUSTOM 挑战类型枚举值
- requirementLabel 字段改为可选,允许为空并添加默认值处理
- minimumCheckInDays 最大值从 365 提升至 1000,支持更长周期挑战
- 推送通知模板支持自定义挑战的动态文案生成
- 新增 getCustomEncouragementTemplate 和 getCustomInvitationTemplate 函数
2025-11-27 11:11:26 +08:00

169 lines
9.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ChallengeType } from '../../challenges/models/challenge.model';
/**
* 挑战鼓励文案模板 - 针对已参与挑战的用户
*/
export const ENCOURAGEMENT_TEMPLATES = {
[ChallengeType.WATER]: [
{ title: '饮水挑战进行中', body: '今天已有多人完成饮水目标!你也要记得多喝水哦!' },
{ title: '健康饮水提醒', body: '加入饮水挑战的小伙伴们今天都很棒!你今天喝水达标了吗?' },
{ title: '水分补充时间', body: '挑战者们都在坚持每日饮水目标,你也要跟上大家的步伐!' },
{ title: '饮水习惯养成', body: '看到很多挑战伙伴都养成了良好饮水习惯,你也是其中一员!' },
{ title: '团队饮水挑战', body: '今天挑战群里又有很多人完成了目标!别掉队,一起加油!' },
],
[ChallengeType.EXERCISE]: [
{ title: '运动挑战进行时', body: '今天已有多人完成运动目标!你也来动一动吧!' },
{ title: '活力运动提醒', body: '挑战伙伴们都在坚持运动,每一滴汗水都是进步的见证!' },
{ title: '运动习惯养成', body: '看到很多挑战者都养成了运动习惯,你也是其中一员!' },
{ title: '团队运动挑战', body: '今天运动挑战群里又有很多人完成了目标!别掉队,一起加油!' },
{ title: '运动生活分享', body: '挑战者们都在分享运动心得,你的今天运动了吗?' },
],
[ChallengeType.DIET]: [
{ title: '饮食挑战进行中', body: '今天已有多人记录了健康饮食!你也要记得合理搭配哦!' },
{ title: '营养均衡提醒', body: '挑战伙伴们都在坚持健康饮食,为身体提供充足营养!' },
{ title: '健康饮食分享', body: '看到很多挑战者都在分享健康餐,你今天吃了什么?' },
{ title: '团队饮食挑战', body: '今天饮食挑战群里又有很多人完成了目标!一起健康饮食!' },
{ title: '营养生活记录', body: '挑战者们都在记录饮食,关注健康,让每一餐都有意义!' },
],
[ChallengeType.MOOD]: [
{ title: '心情记录挑战', body: '今天已有多人记录了心情!你也来分享今天的感受吧!' },
{ title: '情绪管理提醒', body: '挑战伙伴们都在关注情绪变化,让心情更加愉悦平和!' },
{ title: '心情日记分享', body: '看到很多挑战者都在记录心情故事,你今天心情如何?' },
{ title: '团队心情挑战', body: '今天心情挑战群里又有很多人分享了感受!一起关注心理健康!' },
{ title: '情绪健康关怀', body: '挑战者们都在关爱自己的情绪,从记录心情开始!' },
],
[ChallengeType.SLEEP]: [
{ title: '睡眠挑战进行中', body: '今天已有多人保持了规律作息!你也要早睡早起哦!' },
{ title: '优质睡眠提醒', body: '挑战伙伴们都在保持良好睡眠质量,享受每一个宁静的夜晚!' },
{ title: '规律作息养成', body: '看到很多挑战者都养成了规律作息,你也是其中一员!' },
{ title: '团队睡眠挑战', body: '今天睡眠挑战群里又有很多人完成了目标!一起健康作息!' },
{ title: '休息时光分享', body: '挑战者们都在分享睡眠心得,你今天休息得好吗?' },
],
[ChallengeType.WEIGHT]: [
{ title: '体重管理挑战', body: '今天已有多人记录了体重变化!你也要坚持健康生活方式!' },
{ title: '健康体重提醒', body: '挑战伙伴们都在坚持体重管理,享受轻松自在的生活!' },
{ title: '体重记录分享', body: '看到很多挑战者都在记录体重变化,见证自己的进步!' },
{ title: '团队体重挑战', body: '今天体重挑战群里又有很多人完成了目标!一起健康生活!' },
{ title: '健康生活记录', body: '挑战者们都在坚持健康饮食+适量运动,你也是其中一员!' },
],
[ChallengeType.CUSTOM]: [
// 自定义挑战使用动态模板,不在此处定义
],
};
/**
* 挑战邀请文案模板 - 针对未参与挑战但有userId的用户
*/
export const INVITATION_TEMPLATES = {
[ChallengeType.WATER]: [
{ title: '饮水挑战邀请', body: '加入21天饮水挑战养成健康饮水习惯' },
{ title: '健康饮水挑战', body: '每天适量饮水,让身体更健康。立即加入挑战!' },
{ title: '饮水习惯养成', body: '挑战自己,养成良好饮水习惯,收获健康!' },
],
[ChallengeType.EXERCISE]: [
{ title: '运动挑战邀请', body: '加入运动挑战,让身体充满活力!' },
{ title: '健身挑战', body: '21天运动挑战塑造更好的自己' },
{ title: '运动习惯养成', body: '坚持运动,收获健康体魄,立即加入!' },
],
[ChallengeType.DIET]: [
{ title: '饮食挑战邀请', body: '加入健康饮食挑战,培养良好饮食习惯!' },
{ title: '营养挑战', body: '21天饮食挑战让营养均衡成为习惯' },
{ title: '健康饮食计划', body: '科学饮食,健康生活,从挑战开始!' },
],
[ChallengeType.MOOD]: [
{ title: '心情记录挑战', body: '加入心情记录挑战,关注情绪健康!' },
{ title: '情绪管理挑战', body: '21天心情记录让心灵更加宁静。' },
{ title: '心理健康挑战', body: '记录心情,关爱自己,从现在开始!' },
],
[ChallengeType.SLEEP]: [
{ title: '睡眠挑战邀请', body: '加入优质睡眠挑战,养成规律作息!' },
{ title: '作息规律挑战', body: '21天睡眠挑战让身体得到充分休息。' },
{ title: '健康睡眠计划', body: '改善睡眠质量,享受每一个清晨!' },
],
[ChallengeType.WEIGHT]: [
{ title: '体重管理挑战', body: '加入体重管理挑战,收获健康理想体重!' },
{ title: '健康体重挑战', body: '21天体重管理见证自己的变化' },
{ title: '体重目标挑战', body: '科学管理体重,享受健康生活!' },
],
[ChallengeType.CUSTOM]: [
// 自定义挑战使用动态模板,不在此处定义
],
};
/**
* 通用邀请文案模板 - 针对没有userId的用户
*/
export const GENERAL_INVITATION_TEMPLATES = [
{ title: '健康挑战邀请', body: '加入我们的健康挑战,开启健康生活新篇章!' },
{ title: '21天挑战', body: '21天养成健康习惯你准备好了吗' },
{ title: '健康生活', body: '追求健康生活,从参加挑战开始!' },
{ title: '挑战自我', body: '挑战自己,收获健康,让生活更美好!' },
{ title: '健康之旅', body: '开启健康之旅,遇见更好的自己!' },
];
/**
* 随机选择一个模板
*/
export function getRandomTemplate<T>(templates: T[]): T {
const randomIndex = Math.floor(Math.random() * templates.length);
return templates[randomIndex];
}
/**
* 根据挑战类型获取鼓励文案
*/
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);
}
/**
* 根据挑战类型获取邀请文案
*/
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);
}
/**
* 获取通用邀请文案
*/
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);
}