lty/qy-lty-admin/lib/api/achievements.ts
2026-03-17 13:17:02 +08:00

267 lines
7.2 KiB
TypeScript

import type { Achievement } from "./types"
import { mockResponse, type PaginatedResponse, type PaginationParams } from "./client"
// 模拟成就数据
const mockAchievements: Achievement[] = [
{
id: "1",
name: "初次见面",
description: "第一次与洛天依对话",
icon: "message-circle",
category: "互动",
requirement: "与洛天依进行第一次对话",
rewardType: "经验值",
rewardAmount: 100,
rewardIcon: "zap",
isHidden: false,
unlockRate: 98.5,
createdAt: "2023-01-01",
updatedAt: "2023-01-01",
},
{
id: "2",
name: "亲密无间",
description: "与洛天依好感度达到80",
icon: "heart",
category: "好感度",
requirement: "将洛天依的好感度提升至80",
rewardType: "虚拟币",
rewardAmount: 500,
rewardIcon: "coins",
isHidden: false,
unlockRate: 45.2,
createdAt: "2023-01-02",
updatedAt: "2023-01-02",
},
{
id: "3",
name: "形影不离",
description: "与洛天依好感度达到100",
icon: "heart-handshake",
category: "好感度",
requirement: "将洛天依的好感度提升至100",
rewardType: "称号",
rewardAmount: 1,
rewardIcon: "badge",
isHidden: false,
unlockRate: 12.8,
createdAt: "2023-01-03",
updatedAt: "2023-01-03",
},
{
id: "4",
name: "热情如火",
description: "与洛天依单日互动达到50次",
icon: "flame",
category: "互动",
requirement: "在一天内与洛天依互动50次",
rewardType: "好感度",
rewardAmount: 20,
rewardIcon: "heart",
isHidden: false,
unlockRate: 23.7,
createdAt: "2023-01-04",
updatedAt: "2023-01-04",
},
{
id: "5",
name: "坚持不懈",
description: "连续7天与洛天依互动",
icon: "calendar-check",
category: "互动",
requirement: "连续7天每天至少与洛天依互动1次",
rewardType: "道具",
rewardAmount: 1,
rewardIcon: "gift",
isHidden: false,
unlockRate: 34.1,
createdAt: "2023-01-05",
updatedAt: "2023-01-05",
},
{
id: "6",
name: "时尚达人",
description: "收集10套服装",
icon: "shirt",
category: "收集",
requirement: "收集10套不同的服装",
rewardType: "服装",
rewardAmount: 1,
rewardIcon: "shirt",
isHidden: false,
unlockRate: 56.3,
createdAt: "2023-01-06",
updatedAt: "2023-01-06",
},
{
id: "7",
name: "音乐鉴赏家",
description: "收听20首不同的歌曲",
icon: "music",
category: "收集",
requirement: "收听20首不同的歌曲",
rewardType: "虚拟币",
rewardAmount: 300,
rewardIcon: "coins",
isHidden: false,
unlockRate: 42.9,
createdAt: "2023-01-07",
updatedAt: "2023-01-07",
},
{
id: "8",
name: "舞动青春",
description: "观看10支不同的舞蹈",
icon: "footprints",
category: "收集",
requirement: "观看10支不同的舞蹈表演",
rewardType: "经验值",
rewardAmount: 200,
rewardIcon: "zap",
isHidden: false,
unlockRate: 38.5,
createdAt: "2023-01-08",
updatedAt: "2023-01-08",
},
{
id: "9",
name: "美食家",
description: "收集15种不同的食物",
icon: "utensils",
category: "收集",
requirement: "收集15种不同的食物",
rewardType: "道具",
rewardAmount: 1,
rewardIcon: "gift",
isHidden: false,
unlockRate: 27.4,
createdAt: "2023-01-09",
updatedAt: "2023-01-09",
},
{
id: "10",
name: "隐藏的秘密",
description: "发现洛天依的秘密",
icon: "sparkles",
category: "隐藏",
requirement: "???",
rewardType: "称号",
rewardAmount: 1,
rewardIcon: "badge",
isHidden: true,
unlockRate: 5.2,
createdAt: "2023-01-10",
updatedAt: "2023-01-10",
},
]
// 获取成就列表
export const getAchievements = async (params?: PaginationParams): Promise<PaginatedResponse<Achievement>> => {
let filteredAchievements = [...mockAchievements]
// 搜索过滤
if (params?.search) {
const search = params.search.toLowerCase()
filteredAchievements = filteredAchievements.filter(
(achievement) =>
achievement.name.toLowerCase().includes(search) ||
achievement.description.toLowerCase().includes(search) ||
achievement.category.toLowerCase().includes(search),
)
}
// 排序
if (params?.sortBy) {
filteredAchievements.sort((a: any, b: any) => {
const aValue = a[params.sortBy!]
const bValue = b[params.sortBy!]
if (typeof aValue === "string" && typeof bValue === "string") {
return params.sortOrder === "desc" ? bValue.localeCompare(aValue) : aValue.localeCompare(bValue)
}
return params.sortOrder === "desc" ? bValue - aValue : aValue - bValue
})
}
// 分页
const page = params?.page || 1
const pageSize = params?.pageSize || 10
const startIndex = (page - 1) * pageSize
const paginatedAchievements = filteredAchievements.slice(startIndex, startIndex + pageSize)
return mockResponse({
items: paginatedAchievements,
total: filteredAchievements.length,
page,
pageSize,
totalPages: Math.ceil(filteredAchievements.length / pageSize),
})
}
// 获取单个成就
export const getAchievement = async (id: string): Promise<Achievement> => {
const achievement = mockAchievements.find((achievement) => achievement.id === id)
if (!achievement) {
return mockResponse({} as Achievement, "成就不存在")
}
return mockResponse(achievement)
}
// 创建成就
export const createAchievement = async (achievementData: Partial<Achievement>): Promise<Achievement> => {
const newAchievement: Achievement = {
id: String(mockAchievements.length + 1),
name: achievementData.name || "",
description: achievementData.description || "",
icon: achievementData.icon || "award",
category: achievementData.category || "特殊",
requirement: achievementData.requirement || "",
rewardType: achievementData.rewardType || "经验值",
rewardAmount: achievementData.rewardAmount || 0,
rewardIcon: achievementData.rewardIcon,
isHidden: achievementData.isHidden || false,
unlockRate: 0,
createdAt: new Date().toISOString().split("T")[0],
updatedAt: new Date().toISOString().split("T")[0],
}
mockAchievements.push(newAchievement)
return mockResponse(newAchievement)
}
// 更新成就
export const updateAchievement = async (id: string, achievementData: Partial<Achievement>): Promise<Achievement> => {
const achievementIndex = mockAchievements.findIndex((achievement) => achievement.id === id)
if (achievementIndex === -1) {
return mockResponse({} as Achievement, "成就不存在")
}
const updatedAchievement = {
...mockAchievements[achievementIndex],
...achievementData,
updatedAt: new Date().toISOString().split("T")[0],
}
mockAchievements[achievementIndex] = updatedAchievement
return mockResponse(updatedAchievement)
}
// 删除成就
export const deleteAchievement = async (id: string): Promise<boolean> => {
const achievementIndex = mockAchievements.findIndex((achievement) => achievement.id === id)
if (achievementIndex === -1) {
return mockResponse(false, "成就不存在")
}
mockAchievements.splice(achievementIndex, 1)
return mockResponse(true)
}