From 153137379dc3539ccadbd78d73cd74dca75971c5 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Fri, 5 Sep 2025 09:53:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E4=BC=A0apk?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E4=BF=A1=E6=81=AF=EF=BC=8C=E6=9C=AA=E5=8A=A0?= =?UTF-8?q?=E9=89=B4=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../videotablet/bean/ApkUploadRequest.java | 13 ++++ .../controller/ApkInfoController.java | 37 ---------- .../controller/DeviceApkInfoController.java | 43 +++++++++++ .../controller/UserController.java | 10 +++ .../videotablet/entity/ApkInfo.java | 29 ++++---- .../videotablet/entity/DeviceApkInfo.java | 32 ++++++++ .../repository/ApkInfoRepository.java | 28 ------- .../repository/DeviceApkInfoRepository.java | 18 +++++ .../videotablet/service/ApkInfoService.java | 74 ------------------- .../service/DeviceApkInfoService.java | 49 ++++++++++++ .../resources/application-debug.properties | 2 +- .../resources/application-prod.properties | 3 + .../resources/application-test.properties | 3 + 13 files changed, 186 insertions(+), 155 deletions(-) create mode 100644 src/main/java/com/onekeycall/videotablet/bean/ApkUploadRequest.java delete mode 100644 src/main/java/com/onekeycall/videotablet/controller/ApkInfoController.java create mode 100644 src/main/java/com/onekeycall/videotablet/controller/DeviceApkInfoController.java create mode 100644 src/main/java/com/onekeycall/videotablet/entity/DeviceApkInfo.java delete mode 100644 src/main/java/com/onekeycall/videotablet/repository/ApkInfoRepository.java create mode 100644 src/main/java/com/onekeycall/videotablet/repository/DeviceApkInfoRepository.java delete mode 100644 src/main/java/com/onekeycall/videotablet/service/ApkInfoService.java create mode 100644 src/main/java/com/onekeycall/videotablet/service/DeviceApkInfoService.java diff --git a/src/main/java/com/onekeycall/videotablet/bean/ApkUploadRequest.java b/src/main/java/com/onekeycall/videotablet/bean/ApkUploadRequest.java new file mode 100644 index 0000000..5d80ad7 --- /dev/null +++ b/src/main/java/com/onekeycall/videotablet/bean/ApkUploadRequest.java @@ -0,0 +1,13 @@ +package com.onekeycall.videotablet.bean; + +import com.onekeycall.videotablet.entity.ApkInfo; +import lombok.Data; + +import java.util.List; + +@Data +public class ApkUploadRequest { + private String sn; + + private List apk_list; +} diff --git a/src/main/java/com/onekeycall/videotablet/controller/ApkInfoController.java b/src/main/java/com/onekeycall/videotablet/controller/ApkInfoController.java deleted file mode 100644 index e562aab..0000000 --- a/src/main/java/com/onekeycall/videotablet/controller/ApkInfoController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.onekeycall.videotablet.controller; - - -import com.onekeycall.videotablet.entity.ApkInfo; -import com.onekeycall.videotablet.service.ApkInfoService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/api/apks") -public class ApkInfoController { - - @Autowired - private ApkInfoService apkInfoService; - - @GetMapping("/device/{deviceId}") - public List getApksByDeviceId(@PathVariable String deviceId) { - return apkInfoService.getApkInfosByDeviceId(deviceId); - } - - @PostMapping - public ApkInfo saveApkInfo(@RequestBody ApkInfo apkInfo) { - return apkInfoService.saveOrUpdateApkInfo(apkInfo); - } - - @PostMapping("/batch") - public List saveApkInfos(@RequestBody List apkInfos) { - return apkInfoService.saveAllApkInfos(apkInfos); - } - - @DeleteMapping("/{packageName}") - public void deleteApkInfo(@PathVariable String packageName) { - apkInfoService.deleteApkInfoByPackageName(packageName); - } -} \ No newline at end of file diff --git a/src/main/java/com/onekeycall/videotablet/controller/DeviceApkInfoController.java b/src/main/java/com/onekeycall/videotablet/controller/DeviceApkInfoController.java new file mode 100644 index 0000000..25ec76f --- /dev/null +++ b/src/main/java/com/onekeycall/videotablet/controller/DeviceApkInfoController.java @@ -0,0 +1,43 @@ +package com.onekeycall.videotablet.controller; + +import com.aliyun.core.annotation.Body; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.onekeycall.videotablet.bean.ApkUploadRequest; +import com.onekeycall.videotablet.entity.ApkInfo; +import com.onekeycall.videotablet.entity.DeviceApkInfo; +import com.onekeycall.videotablet.result.Result; +import com.onekeycall.videotablet.service.DeviceApkInfoService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/sn") +public class DeviceApkInfoController { + static Logger logger = LoggerFactory.getLogger(DeviceApkInfoController.class); + + private final ObjectMapper objectMapper; // Spring默认已注入 + + public DeviceApkInfoController(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + @Autowired + private DeviceApkInfoService deviceApkInfoService; + + @PostMapping("/upload_install_apks") + public Result uploadInstallApks(@RequestBody ApkUploadRequest request) { + String sn = request.getSn(); + List apkList = request.getApk_list(); + if (apkList == null || apkList.size() == 0) { + return Result.error().message("应用列表为空"); + } + deviceApkInfoService.saveOrUpdateDeviceApkInfo(sn, apkList); + return Result.ok(); + } +} diff --git a/src/main/java/com/onekeycall/videotablet/controller/UserController.java b/src/main/java/com/onekeycall/videotablet/controller/UserController.java index ca6b63c..79094a9 100644 --- a/src/main/java/com/onekeycall/videotablet/controller/UserController.java +++ b/src/main/java/com/onekeycall/videotablet/controller/UserController.java @@ -2,10 +2,12 @@ package com.onekeycall.videotablet.controller; import com.nimbusds.openid.connect.sdk.claims.UserInfo; import com.onekeycall.videotablet.dto.TokenPair; +import com.onekeycall.videotablet.entity.DeviceApkInfo; import com.onekeycall.videotablet.entity.DeviceInfo; import com.onekeycall.videotablet.entity.DeviceLocation; import com.onekeycall.videotablet.entity.User; import com.onekeycall.videotablet.result.Result; +import com.onekeycall.videotablet.service.DeviceApkInfoService; import com.onekeycall.videotablet.service.DeviceLocationService; import com.onekeycall.videotablet.service.DeviceSnService; import com.onekeycall.videotablet.service.UserService; @@ -36,6 +38,8 @@ public class UserController { private DeviceSnService deviceSnService; @Autowired private DeviceLocationService deviceLocationService; + @Autowired + private DeviceApkInfoService deviceApkInfoService; Logger logger = LoggerFactory.getLogger(LoginController.class); @@ -137,4 +141,10 @@ public class UserController { return Result.ok().data("device_location", deviceLocation); } + + @GetMapping("/get_device_apk_list") + public Result getDeviceApkList(@RequestParam String sn) { + DeviceApkInfo deviceApkInfo = deviceApkInfoService.getDeviceApkInfoBySn(sn); + return Result.ok().data("deviceApkInfo", deviceApkInfo); + } } diff --git a/src/main/java/com/onekeycall/videotablet/entity/ApkInfo.java b/src/main/java/com/onekeycall/videotablet/entity/ApkInfo.java index ff1db54..3661b7a 100644 --- a/src/main/java/com/onekeycall/videotablet/entity/ApkInfo.java +++ b/src/main/java/com/onekeycall/videotablet/entity/ApkInfo.java @@ -1,43 +1,42 @@ package com.onekeycall.videotablet.entity; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; -import org.springframework.data.mongodb.core.index.Indexed; -import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; -import org.springframework.data.annotation.Id; import java.util.Date; @Data -@Document(collection = "apk_info") // 指定集合名 public class ApkInfo { - @Id // 标识主键 - private String id; // MongoDB默认使用ObjectId,这里用String接收 - + @JsonProperty("package_name") @Field("package_name") // 可指定字段在数据库中的名称 private String packageName; + @JsonProperty("app_name") @Field("app_name") private String appName; + @JsonProperty("version_name") @Field("version_name") private String versionName; + @JsonProperty("version_code") @Field("version_code") - private Integer versionCode; + private Long versionCode; + @JsonProperty("install_time") @Field("install_time") - private Date installTime; // MongoDB支持Date类型[9,11](@ref) + private Date installTime; // MongoDB支持Date类型 + @JsonProperty("last_update_time") @Field("last_update_time") private Date lastUpdateTime; + @JsonProperty("icon_url") + @Field("icon_url") + private String iconUrl; + private Long size; // APK大小,单位可以是字节 - // 建议增加一个字段标识该列表所属的设备或用户 - @Indexed // 为设备ID创建索引 - @Field("device_sn") - private String deviceSn; - - + private String md5; } diff --git a/src/main/java/com/onekeycall/videotablet/entity/DeviceApkInfo.java b/src/main/java/com/onekeycall/videotablet/entity/DeviceApkInfo.java new file mode 100644 index 0000000..67d1c9b --- /dev/null +++ b/src/main/java/com/onekeycall/videotablet/entity/DeviceApkInfo.java @@ -0,0 +1,32 @@ +package com.onekeycall.videotablet.entity; + +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +import java.util.Date; +import java.util.List; + +@Data +@Document(collection = "device_apks") // 指定MongoDB集合名 +public class DeviceApkInfo { + + @Id + private String id; // MongoDB文档ID + + @Field("sn") + private String sn; // 设备序列号 + + @Field("apk_list") // 指定数据库中字段名称为apk_list + private List apkList; // APK信息列表 + + @Field("create_time") + private Date createTime; // 记录创建时间 + + @Field("update_time") + private Date updateTime; // 记录最后更新时间 + + // 构造方法、Getter和Setter省略(实际开发中必须要有) + // 推荐使用Lombok的@Getter和@Setter简化代码 +} \ No newline at end of file diff --git a/src/main/java/com/onekeycall/videotablet/repository/ApkInfoRepository.java b/src/main/java/com/onekeycall/videotablet/repository/ApkInfoRepository.java deleted file mode 100644 index b107b26..0000000 --- a/src/main/java/com/onekeycall/videotablet/repository/ApkInfoRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.onekeycall.videotablet.repository; - -import com.onekeycall.videotablet.entity.ApkInfo; -import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.stereotype.Repository; - -import java.util.Date; -import java.util.List; - -@Repository -public interface ApkInfoRepository extends MongoRepository { - // MongoRepository 中String是主键类型 - - // 根据包名查找应用 - ApkInfo findByPackageName(String packageName); - - // 根据设备ID查找该设备的所有应用 - List findByDeviceSn(String deviceSn); - - // 查找安装时间在某个时间点之后的应用 - List findByInstallTimeAfter(Date date); - - // 自定义查询:查找应用名称包含特定字符串的应用 - List findByAppNameLike(String appName); - - // 你可以根据业务需求定义更多查询方法 - // Spring Data MongoDB会根据方法名自动推导查询[2](@ref) -} diff --git a/src/main/java/com/onekeycall/videotablet/repository/DeviceApkInfoRepository.java b/src/main/java/com/onekeycall/videotablet/repository/DeviceApkInfoRepository.java new file mode 100644 index 0000000..2fc52be --- /dev/null +++ b/src/main/java/com/onekeycall/videotablet/repository/DeviceApkInfoRepository.java @@ -0,0 +1,18 @@ +package com.onekeycall.videotablet.repository; + +import com.onekeycall.videotablet.entity.DeviceApkInfo; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface DeviceApkInfoRepository extends MongoRepository { + + // 根据序列号sn查找设备应用列表 + DeviceApkInfo findDeviceApkInfoBySn(String sn); + + // 判断某个序列号的记录是否存在 + boolean existsBySn(String sn); + +} \ No newline at end of file diff --git a/src/main/java/com/onekeycall/videotablet/service/ApkInfoService.java b/src/main/java/com/onekeycall/videotablet/service/ApkInfoService.java deleted file mode 100644 index d81ffbd..0000000 --- a/src/main/java/com/onekeycall/videotablet/service/ApkInfoService.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.onekeycall.videotablet.service; - -import com.onekeycall.videotablet.entity.ApkInfo; -import com.onekeycall.videotablet.repository.ApkInfoRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Sort; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class ApkInfoService { - - @Autowired - private ApkInfoRepository apkInfoRepository; - - @Autowired - private MongoTemplate mongoTemplate; - - /** - * 保存或更新APK信息(如果ID存在则更新,不存在则新增) - */ - public ApkInfo saveOrUpdateApkInfo(ApkInfo apkInfo) { - return apkInfoRepository.save(apkInfo); - } - - /** - * 批量保存APK列表(例如从一台设备同步所有应用) - */ - public List saveAllApkInfos(List apkInfos) { - return apkInfoRepository.saveAll(apkInfos); - } - - /** - * 根据ID查询APK信息 - */ - public ApkInfo getApkInfoById(String id) { - return apkInfoRepository.findById(id).orElse(null); - } - - /** - * 根据设备ID查询该设备上的所有应用 - */ - public List getApkInfosByDeviceId(String deviceSn) { - return apkInfoRepository.findByDeviceSn(deviceSn); - } - - /** - * 根据包名删除应用信息 - */ - public void deleteApkInfoByPackageName(String packageName) { - ApkInfo apkInfo = apkInfoRepository.findByPackageName(packageName); - if (apkInfo != null) { - apkInfoRepository.delete(apkInfo); - } - } - - /** - * 获取所有APK信息 - */ - public List getAllApkInfos() { - return apkInfoRepository.findAll(); - } - - public List findTop5ByDeviceIdOrderBySizeDesc(String deviceSn) { - Query query = Query.query(Criteria.where("device_Sn").is(deviceSn)) - .with(Sort.by(Sort.Direction.DESC, "size")) - .limit(5); - return mongoTemplate.find(query, ApkInfo.class); - } -} \ No newline at end of file diff --git a/src/main/java/com/onekeycall/videotablet/service/DeviceApkInfoService.java b/src/main/java/com/onekeycall/videotablet/service/DeviceApkInfoService.java new file mode 100644 index 0000000..737f253 --- /dev/null +++ b/src/main/java/com/onekeycall/videotablet/service/DeviceApkInfoService.java @@ -0,0 +1,49 @@ +package com.onekeycall.videotablet.service; + +import com.onekeycall.videotablet.entity.ApkInfo; +import com.onekeycall.videotablet.entity.DeviceApkInfo; +import com.onekeycall.videotablet.repository.DeviceApkInfoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +@Service +public class DeviceApkInfoService { + + @Autowired + private DeviceApkInfoRepository deviceApkInfoRepository; + + /** + * 保存或更新设备APK列表信息 + * 如果该sn已存在,则更新其apkList和updateTime;不存在则新增 + */ + public void saveOrUpdateDeviceApkInfo(String sn, List apkList) { + DeviceApkInfo deviceApkInfo; + if (deviceApkInfoRepository.existsBySn(sn)) { + // 存在则更新 + deviceApkInfo = deviceApkInfoRepository.findDeviceApkInfoBySn(sn); + deviceApkInfo.setApkList(apkList); + deviceApkInfo.setUpdateTime(new Date()); + } else { + // 不存在则新增 + deviceApkInfo = new DeviceApkInfo(); + deviceApkInfo.setSn(sn); + deviceApkInfo.setApkList(apkList); + Date now = new Date(); + deviceApkInfo.setCreateTime(now); + deviceApkInfo.setUpdateTime(now); + } + deviceApkInfoRepository.save(deviceApkInfo); + } + + /** + * 根据序列号sn获取设备APK列表 + */ + public DeviceApkInfo getDeviceApkInfoBySn(String sn) { + return deviceApkInfoRepository.findDeviceApkInfoBySn(sn); + } + + +} diff --git a/src/main/resources/application-debug.properties b/src/main/resources/application-debug.properties index 0847148..62aabe0 100644 --- a/src/main/resources/application-debug.properties +++ b/src/main/resources/application-debug.properties @@ -23,7 +23,7 @@ spring.data.redis.lettuce.pool.max-wait=1ms spring.data.redis.lettuce.shutdown-timeout=100ms #MongoDB -spring.data.mongodb.uri=mongodb://fht:fanhuitong@139.199.77.221:27027/apk_installation_records +spring.data.mongodb.uri=mongodb://fht:fanhuitong@139.199.77.221:27027/device_apks?authSource=admin&connectTimeoutMS=5000 # Hibernate配置 #spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 20471ef..94a8f7a 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -22,6 +22,9 @@ spring.data.redis.lettuce.pool.max-active=8 spring.data.redis.lettuce.pool.max-wait=1ms spring.data.redis.lettuce.shutdown-timeout=100ms +#MongoDB +spring.data.mongodb.uri=mongodb://fht:fanhuitong@139.199.77.221:27027/device_apks?authSource=admin&connectTimeoutMS=5000 + # Hibernate配置 #spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 20471ef..94a8f7a 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -22,6 +22,9 @@ spring.data.redis.lettuce.pool.max-active=8 spring.data.redis.lettuce.pool.max-wait=1ms spring.data.redis.lettuce.shutdown-timeout=100ms +#MongoDB +spring.data.mongodb.uri=mongodb://fht:fanhuitong@139.199.77.221:27027/device_apks?authSource=admin&connectTimeoutMS=5000 + # Hibernate配置 #spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect