267 lines
7.2 KiB
TypeScript
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)
|
|
}
|