diff --git a/.gitignore b/.gitignore index c2065bc..d5eeea3 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ build/ bin/ !**/src/main/**/bin/ !**/src/test/**/bin/ - +logs ### IntelliJ IDEA ### .idea *.iws diff --git a/docs/schema.sql b/docs/schema.sql index a1dc9aa..10cb482 100644 --- a/docs/schema.sql +++ b/docs/schema.sql @@ -70,6 +70,41 @@ CREATE TABLE `qc_photo` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='QC 测试照片表'; +-- ============================================================ +-- 固件表 +-- ============================================================ + +CREATE TABLE `app_aat_version` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `firmware_type` VARCHAR(50) NOT NULL COMMENT '固件类型: lb_main / lb_signal_master / lbPro_main / lbPro_signal_master / lbPro_screen_ui', + `firmware_name` VARCHAR(100) NOT NULL COMMENT '固件文件名', + `firmware_version` VARCHAR(20) NOT NULL COMMENT '固件版本号', + `min_hardware_version` VARCHAR(20) NOT NULL DEFAULT '0.0' COMMENT '最低硬件版本', + `download_url` VARCHAR(500) DEFAULT NULL COMMENT '固件下载地址', + `firmware_size` BIGINT DEFAULT NULL COMMENT '固件大小(字节)', + `firmware_description` TEXT DEFAULT NULL COMMENT '固件描述', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_type_version` (`firmware_type`, `firmware_version`), + KEY `idx_firmware_type` (`firmware_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AAT固件版本表'; + +-- 插入固件数据 +INSERT INTO `app_aat_version` (`firmware_type`, `firmware_name`, `firmware_version`, `min_hardware_version`) +VALUES +-- lb_main +('lb_main', 'lb_main_2.1.bin', '2.1', '1.0'), +-- lb_signal_master +('lb_signal_master', 'lbsm_1.1.bin', '1.1', '0.0'), +-- lbPro_main +('lbPro_main', 'lbPro_main_2.3.bin', '2.3', '0.0'), +-- lbPro_signal_master +('lbPro_signal_master', 'lbPro_sm_1.4.bin', '1.4', '0.0'), +-- lbPro_screen_ui +('lbPro_screen_ui', 'lbPro_ui_2.7.tft', '2.7', '0.0'); + + -- ============================================================ -- 示例数据(可选) -- ============================================================ diff --git a/src/main/java/com/corewing/app/config/SaTokenConfig.java b/src/main/java/com/corewing/app/config/SaTokenConfig.java index 1641897..fe01de1 100644 --- a/src/main/java/com/corewing/app/config/SaTokenConfig.java +++ b/src/main/java/com/corewing/app/config/SaTokenConfig.java @@ -40,12 +40,14 @@ public class SaTokenConfig implements WebMvcConfigurer { .excludePathPatterns("/privacy_policy", "/privacy_policy/**") // 排除固件查询接口(不需要登录) .excludePathPatterns("/firmware/**") + // 排除AAT固件版本接口 + .excludePathPatterns("/aat_version/**") // 排除公共固件 .excludePathPatterns("/public_firmware/**") // 排除系统登录页(不需要登录) // .excludePathPatterns("/loading.html", "/admin/login.html") // 排除静态资源 - .excludePathPatterns("/", "/*.css", "/*.js", "/*.ico", "/static/**", "/assets/**") + .excludePathPatterns("/", "/*.html", "/*.css", "/*.js", "/*.ico", "/static/**", "/assets/**") // 排除接口静态资源 .excludePathPatterns("/doc.html", "/webjars/**") .excludePathPatterns("/v3/api-docs/swagger-config", "/v3/api-docs/**", "/swagger-resources") diff --git a/src/main/java/com/corewing/app/entity/AatVersion.java b/src/main/java/com/corewing/app/entity/AatVersion.java new file mode 100644 index 0000000..dbf6fc6 --- /dev/null +++ b/src/main/java/com/corewing/app/entity/AatVersion.java @@ -0,0 +1,74 @@ +package com.corewing.app.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * AAT固件版本实体类 + */ +@Data +@TableName("app_aat_version") +public class AatVersion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 固件类型: lb_main / lb_signal_master / lbPro_main / lbPro_signal_master / lbPro_screen_ui + */ + private String firmwareType; + + /** + * 固件文件名 + */ + private String firmwareName; + + /** + * 固件版本号 + */ + private String firmwareVersion; + + /** + * 最低硬件版本 + */ + private String minHardwareVersion; + + /** + * 固件下载地址 + */ + private String downloadUrl; + + /** + * 固件大小(字节) + */ + private Long firmwareSize; + + /** + * 固件描述 + */ + private String firmwareDescription; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; +} diff --git a/src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java b/src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java index f40ae33..7880ed8 100644 --- a/src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java +++ b/src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java @@ -57,6 +57,11 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { // 兼容 Date 和 LocalDateTime 类型的 createTime 填充 fillTimeField(metaObject, CREATE_TIME); } catch (ReflectionException ignored) { } + + try { + // 兼容 Date 和 LocalDateTime 类型的 updateTime 填充 + fillTimeField(metaObject, UPDATE_TIME); + } catch (ReflectionException ignored) { } } @Override diff --git a/src/main/java/com/corewing/app/mapper/AatVersionMapper.java b/src/main/java/com/corewing/app/mapper/AatVersionMapper.java new file mode 100644 index 0000000..be5920e --- /dev/null +++ b/src/main/java/com/corewing/app/mapper/AatVersionMapper.java @@ -0,0 +1,13 @@ +package com.corewing.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.corewing.app.entity.AatVersion; +import org.apache.ibatis.annotations.Mapper; + +/** + * AAT固件版本 Mapper 接口 + */ +@Mapper +public interface AatVersionMapper extends BaseMapper { + +} diff --git a/src/main/java/com/corewing/app/modules/app/AppAatVersionController.java b/src/main/java/com/corewing/app/modules/app/AppAatVersionController.java new file mode 100644 index 0000000..323674f --- /dev/null +++ b/src/main/java/com/corewing/app/modules/app/AppAatVersionController.java @@ -0,0 +1,186 @@ +package com.corewing.app.modules.app; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.corewing.app.common.Result; +import com.corewing.app.common.annotation.CommonLog; +import com.corewing.app.entity.AatVersion; +import com.corewing.app.service.AatVersionService; +import com.corewing.app.util.I18nUtil; +import com.corewing.app.util.OSSUploadUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * AAT固件版本 Controller + */ +@Api(tags = "AAT固件版本接口") +@RestController +@RequestMapping("/aat_version") +public class AppAatVersionController { + + private final AatVersionService aatVersionService; + + public AppAatVersionController(AatVersionService aatVersionService) { + this.aatVersionService = aatVersionService; + } + + /** + * 查询所有类型的最新固件版本(返回与原始JSON结构一致) + */ + @CommonLog("查询所有AAT最新固件版本") + @ApiOperation("查询所有AAT最新固件版本") + @GetMapping("/latest") + public Result> getAllLatestVersions() { + return Result.success(aatVersionService.getAllLatestVersions()); + } + + /** + * 根据固件类型查询最新版本 + */ + @CommonLog("根据类型查询AAT最新固件版本") + @ApiOperation("根据类型查询AAT最新固件版本") + @GetMapping("/latest/{firmwareType}") + public Result getLatestByType(@PathVariable String firmwareType) { + AatVersion version = aatVersionService.getLatestByType(firmwareType); + if (version != null) { + return Result.success(version); + } + return Result.error(I18nUtil.getMessage("firmware.not.found")); + } + + /** + * 根据固件类型查询版本列表 + */ + @CommonLog("根据类型查询AAT固件版本列表") + @ApiOperation("根据类型查询AAT固件版本列表") + @GetMapping("/type/{firmwareType}") + public Result> listByType(@PathVariable String firmwareType) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("firmware_type", firmwareType); + wrapper.orderByDesc("create_time"); + return Result.success(aatVersionService.list(wrapper)); + } + + /** + * 分页查询固件版本列表 + */ + @CommonLog("分页查询AAT固件版本列表") + @ApiOperation("分页查询AAT固件版本列表") + @GetMapping("/page") + public Result> page( + @RequestParam(defaultValue = "1") Long current, + @RequestParam(defaultValue = "10") Long size, + @RequestParam(required = false) String firmwareType, + @RequestParam(required = false) String firmwareName) { + + Page page = new Page<>(current, size); + QueryWrapper wrapper = new QueryWrapper<>(); + + if (StringUtils.hasText(firmwareType)) { + wrapper.eq("firmware_type", firmwareType); + } + if (StringUtils.hasText(firmwareName)) { + wrapper.like("firmware_name", firmwareName); + } + wrapper.orderByDesc("create_time"); + + return Result.success(aatVersionService.page(page, wrapper)); + } + + /** + * 查询所有固件版本 + */ + @CommonLog("查询所有AAT固件版本") + @ApiOperation("查询所有AAT固件版本") + @GetMapping("/list") + public Result> list() { + return Result.success(aatVersionService.list()); + } + + /** + * 根据ID查询固件版本 + */ + @CommonLog("根据ID查询AAT固件版本") + @ApiOperation("根据ID查询AAT固件版本") + @GetMapping("/{id}") + public Result getById(@PathVariable Long id) { + AatVersion version = aatVersionService.getById(id); + if (version != null) { + return Result.success(version); + } + return Result.error(I18nUtil.getMessage("firmware.not.found")); + } + + /** + * 新增固件版本 + */ + @CommonLog("新增AAT固件版本") + @ApiOperation("新增AAT固件版本") + @PostMapping + public Result add(@RequestBody AatVersion aatVersion) { + boolean saved = aatVersionService.save(aatVersion); + return saved ? Result.success(aatVersion) : Result.error(); + } + + /** + * 修改固件版本 + */ + @CommonLog("修改AAT固件版本") + @ApiOperation("修改AAT固件版本") + @PutMapping + public Result update(@RequestBody AatVersion aatVersion) { + return Result.isBool(aatVersionService.updateById(aatVersion)); + } + + /** + * 删除固件版本 + */ + @CommonLog("删除AAT固件版本") + @ApiOperation("删除AAT固件版本") + @DeleteMapping("/{id}") + public Result delete(@PathVariable Long id) { + AatVersion version = aatVersionService.getById(id); + if (version == null) { + return Result.error(I18nUtil.getMessage("firmware.not.found")); + } + // 删除OSS上的文件 + if (StringUtils.hasText(version.getDownloadUrl())) { + String objectName = version.getDownloadUrl().replace("https://oss.corewing.com/", ""); + OSSUploadUtil.deleteFile(objectName); + } + return Result.isBool(aatVersionService.removeById(id)); + } + + /** + * 上传固件文件 + */ + @CommonLog("上传AAT固件文件") + @ApiOperation("上传AAT固件文件") + @PostMapping("/upload/{id}") + public Result upload(@PathVariable Long id, @RequestParam("file") MultipartFile file) { + AatVersion version = aatVersionService.getById(id); + if (version == null) { + return Result.error(I18nUtil.getMessage("firmware.not.found")); + } + try { + String objectName = "aat_firmware/" + file.getOriginalFilename(); + String downloadUrl = OSSUploadUtil.uploadFile(file.getInputStream(), objectName); + version.setDownloadUrl(downloadUrl); + version.setFirmwareSize(file.getSize()); + version.setFirmwareName(file.getOriginalFilename()); + aatVersionService.updateById(version); + return Result.success(version); + } catch (IOException e) { + return Result.error("上传失败: " + e.getMessage()); + } + } +} diff --git a/src/main/java/com/corewing/app/service/AatVersionService.java b/src/main/java/com/corewing/app/service/AatVersionService.java new file mode 100644 index 0000000..a32fd94 --- /dev/null +++ b/src/main/java/com/corewing/app/service/AatVersionService.java @@ -0,0 +1,28 @@ +package com.corewing.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.corewing.app.entity.AatVersion; + +import java.util.List; +import java.util.Map; + +/** + * AAT固件版本 Service 接口 + */ +public interface AatVersionService extends IService { + + /** + * 根据固件类型查询最新版本 + * + * @param firmwareType 固件类型 + * @return 最新固件版本 + */ + AatVersion getLatestByType(String firmwareType); + + /** + * 查询所有类型的最新固件版本(返回与原始JSON结构一致的格式) + * + * @return 所有类型的最新版本映射 + */ + Map getAllLatestVersions(); +} diff --git a/src/main/java/com/corewing/app/service/impl/AatVersionServiceImpl.java b/src/main/java/com/corewing/app/service/impl/AatVersionServiceImpl.java new file mode 100644 index 0000000..f30593d --- /dev/null +++ b/src/main/java/com/corewing/app/service/impl/AatVersionServiceImpl.java @@ -0,0 +1,55 @@ +package com.corewing.app.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.corewing.app.entity.AatVersion; +import com.corewing.app.mapper.AatVersionMapper; +import com.corewing.app.service.AatVersionService; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * AAT固件版本 Service 实现类 + */ +@Service +public class AatVersionServiceImpl extends ServiceImpl implements AatVersionService { + + @Override + public AatVersion getLatestByType(String firmwareType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AatVersion::getFirmwareType, firmwareType); + wrapper.orderByDesc(AatVersion::getCreateTime); + wrapper.last("LIMIT 1"); + return getOne(wrapper); + } + + @Override + public Map getAllLatestVersions() { + // 查询所有固件,按类型分组,每组取最新的一条 + List allVersions = list( + new LambdaQueryWrapper().orderByDesc(AatVersion::getCreateTime) + ); + + Map result = new LinkedHashMap<>(); + Map> grouped = allVersions.stream() + .collect(Collectors.groupingBy(AatVersion::getFirmwareType, LinkedHashMap::new, Collectors.toList())); + + for (Map.Entry> entry : grouped.entrySet()) { + Map typeInfo = new HashMap<>(); + List> firmwares = new ArrayList<>(); + // 取该类型下最新的一条 + AatVersion latest = entry.getValue().get(0); + Map firmwareInfo = new HashMap<>(); + firmwareInfo.put("firmware_name", latest.getFirmwareName()); + firmwareInfo.put("firmware_version", latest.getFirmwareVersion()); + firmwareInfo.put("min_hardware_version", latest.getMinHardwareVersion()); + firmwares.add(firmwareInfo); + typeInfo.put("firmwares", firmwares); + result.put(entry.getKey(), typeInfo); + } + + return result; + } +} diff --git a/src/main/resources/static/aat_version.html b/src/main/resources/static/aat_version.html new file mode 100644 index 0000000..70fa44f --- /dev/null +++ b/src/main/resources/static/aat_version.html @@ -0,0 +1,295 @@ + + + + + + AAT 固件版本管理 + + + +
+

AAT 固件版本管理

+ +
+ + +
+ + + + + + + + + + + + + + + + + +
ID固件类型固件名称版本号最低硬件版本文件大小下载地址操作
加载中...
+
+ + + + + + + + + +