web-模块、权限、成就

This commit is contained in:
2025-10-25 17:45:47 +08:00
parent f7057a0cc9
commit 5d211faee1
32 changed files with 4024 additions and 876 deletions

View File

@@ -0,0 +1,233 @@
/**
* @description 成就相关API
* @author yslg
* @since 2025-10-24
*/
import { api } from '@/apis/index';
import type { Achievement, UserAchievement, UserAchievementProgress, AchievementVO, AchievementEvent, ResultDomain, PageParam } from '@/types';
/**
* 成就API服务
*/
export const achievementApi = {
// ==================== 成就定义管理(管理员)====================
/**
* 创建成就
* @param achievement 成就信息
* @returns Promise<ResultDomain<Achievement>>
*/
async createAchievement(achievement: Achievement): Promise<ResultDomain<Achievement>> {
const response = await api.post<Achievement>('/achievements/achievement', achievement);
return response.data;
},
/**
* 更新成就
* @param achievement 成就信息
* @returns Promise<ResultDomain<Achievement>>
*/
async updateAchievement(achievement: Achievement): Promise<ResultDomain<Achievement>> {
const response = await api.put<Achievement>('/achievements/achievement', achievement);
return response.data;
},
/**
* 删除成就
* @param achievement 成就信息包含achievementID
* @returns Promise<ResultDomain<void>>
*/
async deleteAchievement(achievement: Achievement): Promise<ResultDomain<void>> {
const response = await api.delete<void>('/achievements/achievement', achievement);
return response.data;
},
/**
* 获取所有成就列表
* @param filter 过滤条件type: 成就类型, level: 成就等级)
* @returns Promise<ResultDomain<Achievement>>
*/
async getAllAchievements(filter?: Partial<Achievement>): Promise<ResultDomain<Achievement>> {
const response = await api.post<Achievement>('/achievements/list', filter || {});
return response.data;
},
/**
* 分页查询成就
* @param filter 过滤条件
* @param pageParam 分页参数
* @returns Promise<ResultDomain<Achievement>>
*/
async getAchievementPage(filter?: Partial<Achievement>, pageParam?: PageParam): Promise<ResultDomain<Achievement>> {
const response = await api.post<Achievement>('/achievements/page', { filter, pageParam });
return response.data;
},
/**
* 获取成就详情
* @param achievementID 成就ID
* @returns Promise<ResultDomain<Achievement>>
*/
async getAchievementDetail(achievementID: string): Promise<ResultDomain<Achievement>> {
const response = await api.get<Achievement>(`/achievements/detail/${achievementID}`);
return response.data;
},
// ==================== 用户成就查询 ====================
/**
* 获取用户已获得的成就
* @param userID 用户ID
* @param type 成就类型(可选)
* @returns Promise<ResultDomain<UserAchievement>>
*/
async getUserAchievements(userID: string, type?: number): Promise<ResultDomain<UserAchievement>> {
const params: Record<string, any> = {};
if (type !== undefined) {
params.type = type;
}
const response = await api.get<UserAchievement>(`/achievements/user/${userID}`, params);
return response.data;
},
/**
* 获取当前用户的成就列表(含进度信息)
* 返回所有成就,包括:
* - 已获得的成就:显示获得时间
* - 未获得的成就:显示当前进度
* @param type 成就类型(可选)
* @returns Promise<ResultDomain<AchievementVO>>
*/
async getMyAchievements(type?: number): Promise<ResultDomain<AchievementVO>> {
const params: Record<string, any> = {};
if (type !== undefined) {
params.type = type;
}
const response = await api.get<AchievementVO>('/achievements/my', params);
return response.data;
},
/**
* 检查用户是否已获得成就
* @param userID 用户ID
* @param achievementID 成就ID
* @returns Promise<ResultDomain<boolean>>
*/
async hasAchievement(userID: string, achievementID: string): Promise<ResultDomain<boolean>> {
const response = await api.get<boolean>(`/achievements/check/${userID}/${achievementID}`);
return response.data;
},
// ==================== 成就授予(管理员)====================
/**
* 手动授予用户成就
* @param userID 用户ID
* @param achievementID 成就ID
* @returns Promise<ResultDomain<UserAchievement>>
*/
async grantAchievement(userID: string, achievementID: string): Promise<ResultDomain<UserAchievement>> {
const response = await api.post<UserAchievement>('/achievements/grant', null, {
params: { userID, achievementID }
});
return response.data;
},
/**
* 撤销用户成就
* @param userID 用户ID
* @param achievementID 成就ID
* @returns Promise<ResultDomain<void>>
*/
async revokeAchievement(userID: string, achievementID: string): Promise<ResultDomain<void>> {
const response = await api.delete<void>('/achievements/revoke', null, {
params: { userID, achievementID }
});
return response.data;
},
// ==================== 成就进度查询 ====================
/**
* 获取用户成就进度
* @param userID 用户ID
* @param achievementID 成就ID可选为空则获取所有进度
* @returns Promise<ResultDomain<UserAchievementProgress>>
*/
async getUserAchievementProgress(userID: string, achievementID?: string): Promise<ResultDomain<UserAchievementProgress>> {
const params: Record<string, any> = {};
if (achievementID) {
params.achievementID = achievementID;
}
const response = await api.get<UserAchievementProgress>(`/achievements/progress/${userID}`, params);
return response.data;
},
// ==================== 成就检测 ====================
/**
* 处理成就事件(内部接口,由其他服务调用)
* @param event 成就事件
* @returns Promise<ResultDomain<UserAchievement>>
*/
async processAchievementEvent(event: AchievementEvent): Promise<ResultDomain<UserAchievement>> {
const response = await api.post<UserAchievement>('/achievements/event/process', event);
return response.data;
},
/**
* 检查用户是否满足成就条件
* @param userID 用户ID
* @param achievementID 成就ID
* @returns Promise<ResultDomain<boolean>>
*/
async checkAchievementCondition(userID: string, achievementID: string): Promise<ResultDomain<boolean>> {
const response = await api.get<boolean>(`/achievements/condition/check/${userID}/${achievementID}`);
return response.data;
},
/**
* 批量检查用户可获得的成就
* @param userID 用户ID
* @returns Promise<ResultDomain<Achievement>>
*/
async checkAvailableAchievements(userID: string): Promise<ResultDomain<Achievement>> {
const response = await api.get<Achievement>(`/achievements/available/${userID}`);
return response.data;
},
// ==================== 成就统计 ====================
/**
* 获取用户成就统计
* @param userID 用户ID
* @returns Promise<ResultDomain<Record<string, any>>>
*/
async getUserAchievementStatistics(userID: string): Promise<ResultDomain<Record<string, any>>> {
const response = await api.get<Record<string, any>>(`/achievements/statistics/${userID}`);
return response.data;
},
/**
* 获取成就排行榜
* @param limit 排行榜条数默认10条
* @returns Promise<ResultDomain<Record<string, any>>>
*/
async getAchievementRanking(limit = 10): Promise<ResultDomain<Record<string, any>>> {
const response = await api.get<Record<string, any>>('/achievements/ranking', { limit });
return response.data;
},
/**
* 获取最近获得成就的用户
* @param pageParam 分页参数
* @param filter 过滤条件
* @param limit 查询条数默认10条
* @returns Promise<ResultDomain<UserAchievement>>
*/
async getRecentAchievers(pageParam: PageParam, filter?:Achievement ): Promise<ResultDomain<UserAchievement>> {
const response = await api.post<UserAchievement>(`/achievements/recent`, {pageParam, filter });
return response.data;
}
};

View File

@@ -0,0 +1 @@
export * from './achievement';