package com.youlai.boot.device.controller; import com.youlai.boot.common.annotation.Log; import com.youlai.boot.common.enums.ActionTypeEnum; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.result.PageResult; import com.youlai.boot.common.result.Result; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.boot.device.model.vo.AppIconVO; import com.youlai.boot.device.service.AppIconService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.util.List; /** * 应用图标库控制层 * * @author TTSTD * @since 2026-08-05 */ @Tag(name = "应用图标库") @RestController @RequestMapping("/api/v1/app-icons") @RequiredArgsConstructor public class AppIconController { private final AppIconService appIconService; @Operation(summary = "获取应用当前生效图标信息") @GetMapping("/{packageName}") @Log(module = LogModuleEnum.DEVICE, value = ActionTypeEnum.VIEW) public Result getCurrentIcon(@PathVariable String packageName) { return Result.success(appIconService.getCurrentIcon(packageName)); } @Operation(summary = "获取应用图标历史版本列表(含当前,按版本倒序)") @GetMapping("/{packageName}/history") @Log(module = LogModuleEnum.DEVICE, value = ActionTypeEnum.LIST) public Result> getHistory(@PathVariable String packageName) { return Result.success(appIconService.getHistory(packageName)); } @Operation(summary = "选取历史版本并锁定") @PostMapping("/{packageName}/lock") @Log(module = LogModuleEnum.DEVICE, value = ActionTypeEnum.LOCK_APP_ICON) public Result lock( @Parameter(description = "应用包名") @PathVariable String packageName, @Parameter(description = "选中图标记录ID") @RequestParam Long iconId ) { return Result.judge(appIconService.lockIcon(packageName, iconId)); } @Operation(summary = "解锁当前图标") @PostMapping("/{packageName}/unlock") @Log(module = LogModuleEnum.DEVICE, value = ActionTypeEnum.UNLOCK_APP_ICON) public Result unlock(@Parameter(description = "应用包名") @PathVariable String packageName) { return Result.judge(appIconService.unlockIcon(packageName)); } @Operation(summary = "上传应用图标(全局库)") @PostMapping("/{packageName}/upload") @Log(module = LogModuleEnum.DEVICE, value = ActionTypeEnum.UPLOAD_APP_ICON) public Result upload( @Parameter(description = "应用包名") @PathVariable String packageName, @Parameter(description = "应用名称(可选,不传则沿用已有名称)") @RequestParam(required = false) String appName, @Parameter(description = "图标文件(jpg/jpeg/png/webp)") @RequestPart(value = "file") MultipartFile file ) { return Result.success(appIconService.uploadIcon(packageName, appName, file, "admin")); } @Operation(summary = "删除应用图标版本") @DeleteMapping("/{packageName}/{iconId}") @Log(module = LogModuleEnum.DEVICE, value = ActionTypeEnum.DELETE) public Result deleteIcon( @Parameter(description = "应用包名") @PathVariable String packageName, @Parameter(description = "图标记录ID") @PathVariable Long iconId ) { return Result.judge(appIconService.deleteIcon(packageName, iconId)); } @Operation(summary = "应用图标库分页列表") @GetMapping("/page") public PageResult page( @Parameter(description = "页码", example = "1") @RequestParam(defaultValue = "1") Long pageNum, @Parameter(description = "每页条数", example = "10") @RequestParam(defaultValue = "10") Long pageSize, @Parameter(description = "应用包名(可选,不传返回全部)") @RequestParam(required = false) String packageName ) { IPage page = new Page<>(pageNum, pageSize); return PageResult.success(appIconService.pageAppIcons(page, packageName)); } }