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';

View File

@@ -178,9 +178,6 @@ request.interceptors.response.use(
}
);
/**
* API封装
*/
/**
* API封装
*/

View File

@@ -12,4 +12,5 @@ export { menuApi } from './menu';
export { permissionApi } from './permission';
export { authApi } from './auth';
export { fileApi } from './file';
export { moduleApi } from './module';

View File

@@ -0,0 +1,197 @@
/**
* @description 系统模块相关API
* @author yslg
* @since 2025-10-25
*/
import { api } from '@/apis/index';
import type { SysModule, ResultDomain, PageParam, SysPermission } from '@/types';
/**
* 系统模块API服务
*/
export const moduleApi = {
baseUrl: '/system/modules',
/**
* 查询模块列表
* @param filter 过滤条件
* @returns Promise<ResultDomain<SysModule>>
*/
async getModuleList(filter?: Partial<SysModule>): Promise<ResultDomain<SysModule>> {
const response = await api.post<SysModule>(`${this.baseUrl}/list`, filter);
return response.data;
},
/**
* 根据模块ID查询模块信息
* @param moduleID 模块ID
* @returns Promise<ResultDomain<SysModule>>
*/
async getModuleById(moduleID: string): Promise<ResultDomain<SysModule>> {
const response = await api.get<SysModule>(`${this.baseUrl}/${moduleID}`);
return response.data;
},
/**
* 根据模块代码查询模块信息
* @param code 模块代码
* @returns Promise<ResultDomain<SysModule>>
*/
async getModuleByCode(code: string): Promise<ResultDomain<SysModule>> {
const response = await api.get<SysModule>(`${this.baseUrl}/code/${code}`);
return response.data;
},
/**
* 查询启用的模块列表
* @returns Promise<ResultDomain<SysModule>>
*/
async getActiveModules(): Promise<ResultDomain<SysModule>> {
const response = await api.get<SysModule>(`${this.baseUrl}/active`);
return response.data;
},
/**
* 创建模块
* @param module 模块信息
* @returns Promise<ResultDomain<SysModule>>
*/
async createModule(module: SysModule): Promise<ResultDomain<SysModule>> {
const response = await api.post<SysModule>(`${this.baseUrl}/module`, module);
return response.data;
},
/**
* 更新模块
* @param module 模块信息
* @returns Promise<ResultDomain<SysModule>>
*/
async updateModule(module: SysModule): Promise<ResultDomain<SysModule>> {
const response = await api.put<SysModule>(`${this.baseUrl}/module`, module);
return response.data;
},
/**
* 删除模块
* @param moduleID 模块ID
* @returns Promise<ResultDomain<boolean>>
*/
async deleteModule(moduleID: string): Promise<ResultDomain<boolean>> {
const response = await api.delete<boolean>(`${this.baseUrl}/module`, { moduleID });
return response.data;
},
/**
* 批量删除模块
* @param moduleIDs 模块ID列表
* @returns Promise<ResultDomain<boolean>>
*/
async batchDeleteModules(moduleIDs: string[]): Promise<ResultDomain<boolean>> {
const response = await api.delete<boolean>(`${this.baseUrl}/batch`, { moduleIDs });
return response.data;
},
/**
* 更新模块状态
* @param moduleID 模块ID
* @param status 状态0禁用 1启用
* @returns Promise<ResultDomain<boolean>>
*/
async updateModuleStatus(moduleID: string, status: number): Promise<ResultDomain<boolean>> {
const response = await api.put<boolean>(`${this.baseUrl}/${moduleID}/status/${status}`);
return response.data;
},
/**
* 更新模块排序
* @param moduleID 模块ID
* @param orderNum 排序号
* @returns Promise<ResultDomain<boolean>>
*/
async updateModuleOrder(moduleID: string, orderNum: number): Promise<ResultDomain<boolean>> {
const response = await api.put<boolean>(`${this.baseUrl}/${moduleID}/order/${orderNum}`);
return response.data;
},
/**
* 分页查询模块列表
* @param filter 过滤条件
* @param pageParam 分页参数
* @returns Promise<ResultDomain<SysModule>>
*/
async getModuleListPage(filter?: Partial<SysModule>, pageParam?: PageParam): Promise<ResultDomain<SysModule>> {
const response = await api.post<SysModule>(`${this.baseUrl}/page`, {
filter,
pageParam: {pageNumber: pageParam?.page || 1, pageSize: pageParam?.size || 10}
});
return response.data;
},
/**
* 统计模块数量
* @param filter 过滤条件
* @returns Promise<ResultDomain<number>>
*/
async countModules(filter?: Partial<SysModule>): Promise<ResultDomain<number>> {
const response = await api.post<number>(`${this.baseUrl}/count`, filter);
return response.data;
},
/**
* 检查模块代码是否存在
* @param code 模块代码
* @param excludeID 排除的模块ID
* @returns Promise<ResultDomain<boolean>>
*/
async checkModuleCodeExists(code: string, excludeID?: string): Promise<ResultDomain<boolean>> {
const response = await api.get<boolean>(`${this.baseUrl}/check-code`, {
code,
excludeID
});
return response.data;
},
/**
* 在模块中创建权限
* @param moduleID 模块ID
* @param permission 权限信息
* @returns Promise<ResultDomain<SysPermission>>
*/
async createPermissionInModule(moduleID: string, permission: SysPermission): Promise<ResultDomain<SysPermission>> {
const response = await api.post<SysPermission>(`${this.baseUrl}/${moduleID}/permissions`, permission);
return response.data;
},
/**
* 更新模块中的权限
* @param moduleID 模块ID
* @param permission 权限信息
* @returns Promise<ResultDomain<SysPermission>>
*/
async updatePermissionInModule(moduleID: string, permission: SysPermission): Promise<ResultDomain<SysPermission>> {
const response = await api.put<SysPermission>(`${this.baseUrl}/${moduleID}/permissions`, permission);
return response.data;
},
/**
* 删除模块中的权限
* @param moduleID 模块ID
* @param permissionID 权限ID
* @returns Promise<ResultDomain<boolean>>
*/
async deletePermissionInModule(moduleID: string, permissionID: string): Promise<ResultDomain<boolean>> {
const response = await api.delete<boolean>(`${this.baseUrl}/${moduleID}/permissions/${permissionID}`);
return response.data;
},
/**
* 获取模块的权限列表
* @param moduleID 模块ID
* @returns Promise<ResultDomain<SysPermission>>
*/
async getModulePermissions(moduleID: string): Promise<ResultDomain<SysPermission>> {
const response = await api.get<SysPermission>(`${this.baseUrl}/${moduleID}/permissions`);
return response.data;
}
};

View File

@@ -1,46 +0,0 @@
/**
* @description 用户成就相关API
* @author yslg
* @since 2025-10-15
*/
import { api } from '@/apis/index';
import type { UserAchievement, Achievement, ResultDomain } from '@/types';
/**
* 用户成就API服务
*/
export const userAchievementApi = {
/**
* 获取用户成就列表
* @param userID 用户ID
* @returns Promise<ResultDomain<UserAchievement>>
*/
async getUserAchievements(userID: string): Promise<ResultDomain<UserAchievement>> {
const response = await api.get<UserAchievement>('/usercenter/achievement/user-list', { userID });
return response.data;
},
/**
* 获取所有成就列表
* @returns Promise<ResultDomain<Achievement>>
*/
async getAllAchievements(): Promise<ResultDomain<Achievement>> {
const response = await api.get<Achievement>('/usercenter/achievement/list');
return response.data;
},
/**
* 检查用户成就进度
* @param userID 用户ID
* @param achievementID 成就ID
* @returns Promise<ResultDomain<{ progress: number; isCompleted: boolean }>>
*/
async checkAchievementProgress(userID: string, achievementID: string): Promise<ResultDomain<{ progress: number; isCompleted: boolean }>> {
const response = await api.get<{ progress: number; isCompleted: boolean }>('/usercenter/achievement/progress', {
userID,
achievementID
});
return response.data;
}
};

View File

@@ -8,5 +8,4 @@
export { userCollectionApi } from './collection';
export { userBrowseRecordApi } from './browse-record';
export { userPointsApi } from './points';
export { userAchievementApi } from './achievement';
export { userProfileApi } from './profile';