Spring Boot用户状态检测系统:睡眠状态识别与智能提醒实战
最近在开发一个智能提醒系统时遇到了一个有趣的技术需求如何准确识别用户状态并触发相应的提醒逻辑。特别是在睡眠状态检测这个场景下传统的方案往往依赖硬件传感器或复杂的生物特征分析但在某些轻量级应用中我们完全可以通过软件层面的状态管理来实现类似功能。本文将围绕状态检测与提醒系统的技术实现分享一套完整的解决方案涵盖状态建模、事件触发、消息推送等核心环节适合移动端和后端开发者参考使用。1. 状态检测的技术背景与应用场景1.1 什么是用户状态检测用户状态检测是指通过软件系统识别用户当前的活动状态如在线、离线、忙碌、空闲、睡眠等。在即时通讯、智能提醒、健康管理等应用中准确的状态判断能够显著提升用户体验。与硬件检测方案相比纯软件方案的优势在于部署成本低、兼容性好但需要更精细的数据建模和算法设计。1.2 典型应用场景分析在实际项目中状态检测技术可以应用于多个场景智能消息推送根据用户状态调整推送策略避免在睡眠时段打扰用户自动化工作流结合状态信息触发相应的业务流程如勿扰模式下的自动回复健康管理通过分析用户作息规律提供个性化的健康建议社交应用显示好友的实时状态增强社交互动的时效性2. 技术选型与环境准备2.1 核心技术与框架实现状态检测系统需要以下技术组件数据采集层移动端SDKAndroid/iOS或Web API用于收集用户行为数据数据处理层使用Spring Boot构建后端服务负责状态计算和逻辑判断消息推送集成第三方推送服务如极光推送、个推或自建WebSocket连接数据存储MySQL用于存储用户配置Redis用于缓存实时状态2.2 开发环境配置示例环境配置如下# Java环境 java version 11.0.12 Spring Boot 2.7.0 # 数据库 MySQL 8.0.28 Redis 6.2.6 # 构建工具 Maven 3.8.12.3 项目结构规划建议采用标准的分层架构src/ ├── main/ │ ├── java/ │ │ └── com/example/status/ │ │ ├── controller/ # 控制层 │ │ ├── service/ # 业务层 │ │ ├── repository/ # 数据层 │ │ ├── model/ # 实体类 │ │ └── config/ # 配置类 │ └── resources/ │ ├── application.yml # 主配置文件 │ └── static/ # 静态资源3. 状态建模与核心算法3.1 用户状态数据模型设计首先定义用户状态的核心实体类// 文件路径src/main/java/com/example/status/model/UserStatus.java public class UserStatus { private Long userId; private StatusType currentStatus; // 当前状态 private LocalDateTime lastUpdateTime; // 最后更新时间 private String timezone; // 用户时区 private SleepSchedule sleepSchedule; // 睡眠计划配置 // 枚举定义状态类型 public enum StatusType { ONLINE, // 在线 OFFLINE, // 离线 BUSY, // 忙碌 SLEEPING, // 睡眠中 AWAY // 离开 } // 睡眠计划配置类 public static class SleepSchedule { private LocalTime usualBedtime; // 通常就寝时间 private LocalTime usualWakeupTime; // 通常起床时间 private boolean autoDetection; // 是否启用自动检测 } }3.2 状态判断算法实现基于时间和用户行为的复合判断逻辑// 文件路径src/main/java/com/example/status/service/StatusDetectionService.java Service public class StatusDetectionService { Autowired private UserStatusRepository statusRepository; public UserStatus detectCurrentStatus(Long userId) { UserStatus userStatus statusRepository.findByUserId(userId); if (userStatus null) { return createDefaultStatus(userId); } // 多重条件判断 if (isSleepingBySchedule(userStatus)) { userStatus.setCurrentStatus(UserStatus.StatusType.SLEEPING); } else if (isSleepingByActivity(userStatus)) { userStatus.setCurrentStatus(UserStatus.StatusType.SLEEPING); } else { userStatus.setCurrentStatus(detectOtherStatus(userStatus)); } userStatus.setLastUpdateTime(LocalDateTime.now()); return statusRepository.save(userStatus); } private boolean isSleepingBySchedule(UserStatus status) { LocalTime now LocalTime.now(); LocalTime bedtime status.getSleepSchedule().getUsualBedtime(); LocalTime wakeupTime status.getSleepSchedule().getUsualWakeupTime(); // 处理跨夜时间判断 if (bedtime.isAfter(wakeupTime)) { return now.isAfter(bedtime) || now.isBefore(wakeupTime); } else { return now.isAfter(bedtime) now.isBefore(wakeupTime); } } private boolean isSleepingByActivity(UserStatus status) { // 基于用户最后活动时间判断 // 如果超过一定时间无活动可能处于睡眠状态 Duration inactiveDuration Duration.between( status.getLastUpdateTime(), LocalDateTime.now()); return inactiveDuration.toHours() 6; // 6小时无活动视为睡眠 } }4. 完整实战案例睡眠状态检测系统4.1 数据库表结构设计创建用户状态管理相关的数据表-- 用户状态表 CREATE TABLE user_status ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL UNIQUE, current_status VARCHAR(20) NOT NULL DEFAULT OFFLINE, last_update_time DATETIME NOT NULL, timezone VARCHAR(50) DEFAULT Asia/Shanghai, usual_bedtime TIME, usual_wakeup_time TIME, auto_detection BOOLEAN DEFAULT true, created_time DATETIME DEFAULT CURRENT_TIMESTAMP, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 用户活动记录表 CREATE TABLE user_activity ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL, activity_type VARCHAR(30) NOT NULL, activity_time DATETIME NOT NULL, device_info VARCHAR(200), INDEX idx_user_time (user_id, activity_time) );4.2 Spring Boot 核心配置应用配置文件示例# 文件路径src/main/resources/application.yml spring: datasource: url: jdbc:mysql://localhost:3306/status_db?useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 password: database: 0 jpa: hibernate: ddl-auto: update show-sql: true app: status: detection: sleep-threshold-hours: 6 check-interval-minutes: 54.3 状态检测定时任务实现定时状态检测和更新// 文件路径src/main/java/com/example/status/scheduler/StatusUpdateScheduler.java Component Slf4j public class StatusUpdateScheduler { Autowired private StatusDetectionService statusDetectionService; Autowired private UserStatusRepository userStatusRepository; Scheduled(fixedRate 300000) // 每5分钟执行一次 public void autoUpdateUserStatus() { log.info(开始自动更新用户状态); ListLong activeUserIds userStatusRepository.findActiveUserIds(); for (Long userId : activeUserIds) { try { UserStatus updatedStatus statusDetectionService.detectCurrentStatus(userId); log.debug(用户 {} 状态更新为: {}, userId, updatedStatus.getCurrentStatus()); } catch (Exception e) { log.error(更新用户 {} 状态失败: {}, userId, e.getMessage()); } } } }4.4 RESTful API 接口实现提供状态查询和管理的API接口// 文件路径src/main/java/com/example/status/controller/StatusController.java RestController RequestMapping(/api/status) Validated public class StatusController { Autowired private StatusDetectionService statusDetectionService; GetMapping(/{userId}) public ResponseEntityUserStatus getCurrentStatus(PathVariable Long userId) { UserStatus status statusDetectionService.detectCurrentStatus(userId); return ResponseEntity.ok(status); } PostMapping(/{userId}/sleep) public ResponseEntityString setSleepStatus(PathVariable Long userId) { UserStatus status statusDetectionService.detectCurrentStatus(userId); status.setCurrentStatus(UserStatus.StatusType.SLEEPING); status.setLastUpdateTime(LocalDateTime.now()); // 保存更新 statusDetectionService.updateStatus(status); return ResponseEntity.ok(睡眠状态设置成功); } PutMapping(/{userId}/schedule) public ResponseEntityString updateSleepSchedule( PathVariable Long userId, RequestBody SleepScheduleRequest request) { // 更新用户睡眠计划 statusDetectionService.updateSleepSchedule(userId, request); return ResponseEntity.ok(睡眠计划更新成功); } }4.5 前端状态展示组件简单的Vue.js组件示例展示如何显示用户状态!-- 文件路径src/main/resources/static/js/status-display.vue -- template div classstatus-container div classstatus-indicator :classstatusClass {{ statusText }} /div div classlast-update 最后更新: {{ lastUpdateTime }} /div /div /template script export default { props: { userId: { type: Number, required: true } }, data() { return { currentStatus: null, lastUpdateTime: null } }, computed: { statusClass() { return { status-online: this.currentStatus ONLINE, status-sleeping: this.currentStatus SLEEPING, status-busy: this.currentStatus BUSY } }, statusText() { const statusMap { ONLINE: 在线, SLEEPING: 睡眠中, BUSY: 忙碌, OFFLINE: 离线 } return statusMap[this.currentStatus] || 未知状态 } }, mounted() { this.fetchStatus() setInterval(this.fetchStatus, 300000) // 每5分钟更新一次 }, methods: { async fetchStatus() { try { const response await fetch(/api/status/${this.userId}) const data await response.json() this.currentStatus data.currentStatus this.lastUpdateTime this.formatTime(data.lastUpdateTime) } catch (error) { console.error(获取状态失败:, error) } }, formatTime(timestamp) { return new Date(timestamp).toLocaleString(zh-CN) } } } /script style .status-container { padding: 10px; border-radius: 5px; background: #f5f5f5; } .status-indicator { display: inline-block; padding: 4px 8px; border-radius: 3px; color: white; font-size: 12px; } .status-online { background: #52c41a; } .status-sleeping { background: #faad14; } .status-busy { background: #f5222d; } /style5. 常见问题与解决方案5.1 状态判断准确性问题问题现象系统错误地将活跃用户判断为睡眠状态可能原因时区配置错误导致时间判断偏差用户活动数据采集不完整睡眠阈值设置不合理解决方案// 增强时区处理逻辑 public class TimeZoneUtils { public static LocalDateTime convertToUserTimezone(LocalDateTime serverTime, String userTimezone) { ZoneId serverZone ZoneId.systemDefault(); ZoneId userZone ZoneId.of(userTimezone); return serverTime.atZone(serverZone) .withZoneSameInstant(userZone) .toLocalDateTime(); } } // 优化活动检测逻辑 public class EnhancedActivityDetector { public boolean hasRecentActivity(Long userId, Duration maxInactiveDuration) { // 检查多种活动类型登录、消息发送、页面浏览等 ListActivityType relevantActivities Arrays.asList( ActivityType.LOGIN, ActivityType.MESSAGE_SEND, ActivityType.PAGE_VIEW ); return activityRepository.existsRecentActivity( userId, relevantActivities, maxInactiveDuration); } }5.2 性能优化策略问题现象用户量增大后系统响应变慢优化方案使用Redis缓存热点用户状态实现状态变化的增量更新采用分库分表策略// Redis缓存实现 Component public class StatusCacheService { Autowired private RedisTemplateString, Object redisTemplate; private static final String STATUS_KEY_PREFIX user:status:; private static final Duration CACHE_TTL Duration.ofMinutes(10); public void cacheUserStatus(UserStatus status) { String key STATUS_KEY_PREFIX status.getUserId(); redisTemplate.opsForValue().set(key, status, CACHE_TTL); } public UserStatus getCachedStatus(Long userId) { String key STATUS_KEY_PREFIX userId; return (UserStatus) redisTemplate.opsForValue().get(key); } }6. 最佳实践与工程建议6.1 数据一致性与事务管理在状态更新过程中确保数据一致性Service Transactional public class StatusManagementService { public void updateStatusWithTransaction(Long userId, StatusType newStatus) { try { // 1. 更新数据库状态 UserStatus status statusRepository.findByUserId(userId); status.setCurrentStatus(newStatus); status.setLastUpdateTime(LocalDateTime.now()); statusRepository.save(status); // 2. 更新缓存 statusCacheService.cacheUserStatus(status); // 3. 发送状态变更事件 eventPublisher.publishEvent(new StatusChangeEvent(this, userId, newStatus)); } catch (Exception e) { // 事务回滚确保数据一致性 throw new RuntimeException(状态更新失败, e); } } }6.2 监控与日志记录建立完善的监控体系Aspect Component Slf4j public class StatusMonitoringAspect { Around(execution(* com.example.status.service.*.*(..))) public Object monitorServiceMethods(ProceedingJoinPoint joinPoint) throws Throwable { String methodName joinPoint.getSignature().getName(); long startTime System.currentTimeMillis(); try { Object result joinPoint.proceed(); long executionTime System.currentTimeMillis() - startTime; log.info(方法 {} 执行成功耗时: {}ms, methodName, executionTime); // 记录指标到监控系统 Metrics.counter(status_service_method, method, methodName) .increment(); Metrics.timer(status_service_duration, method, methodName) .record(executionTime, TimeUnit.MILLISECONDS); return result; } catch (Exception e) { log.error(方法 {} 执行失败: {}, methodName, e.getMessage()); Metrics.counter(status_service_error, method, methodName) .increment(); throw e; } } }6.3 安全与权限控制确保状态信息的安全访问Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(/api/status/**).authenticated() .antMatchers(/api/admin/**).hasRole(ADMIN) .anyRequest().permitAll() .and() .oauth2ResourceServer().jwt(); } } // 方法级权限控制 Service public class SecureStatusService { PreAuthorize(#userId authentication.principal.id or hasRole(ADMIN)) public UserStatus getStatusSecurely(Long userId) { return statusDetectionService.detectCurrentStatus(userId); } }7. 扩展功能与进阶优化7.1 机器学习增强的状态预测基于历史数据训练预测模型# 文件路径scripts/status_predictor.py import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split class StatusPredictor: def __init__(self): self.model RandomForestClassifier(n_estimators100) def train(self, historical_data): # 特征工程时间特征、行为模式、历史状态等 features self.extract_features(historical_data) labels historical_data[status] X_train, X_test, y_train, y_test train_test_split( features, labels, test_size0.2) self.model.fit(X_train, y_train) accuracy self.model.score(X_test, y_test) print(f模型准确率: {accuracy:.2f}) def predict_next_status(self, user_data): features self.extract_features([user_data]) prediction self.model.predict(features) return prediction[0]7.2 多维度状态融合分析结合多个数据源提高判断准确性public class MultiSourceStatusDetector { public StatusType detectWithMultipleSources(Long userId) { // 1. 基于时间规律的分析 TimeBasedAnalysis timeAnalysis analyzeTimePattern(userId); // 2. 基于行为模式的分析 BehaviorAnalysis behaviorAnalysis analyzeBehaviorPattern(userId); // 3. 基于设备传感器的分析如果可用 SensorDataAnalysis sensorAnalysis analyzeSensorData(userId); // 4. 加权融合决策 return fuseDecisions(timeAnalysis, behaviorAnalysis, sensorAnalysis); } private StatusType fuseDecisions(AnalysisResult... analyses) { MapStatusType, Double scores new HashMap(); for (AnalysisResult analysis : analyses) { for (Map.EntryStatusType, Double entry : analysis.getConfidenceScores().entrySet()) { scores.merge(entry.getKey(), entry.getValue(), Double::sum); } } return scores.entrySet().stream() .max(Map.Entry.comparingByValue()) .map(Map.Entry::getKey) .orElse(StatusType.OFFLINE); } }本文详细介绍了用户状态检测系统的完整实现方案从基础概念到实战代码涵盖了系统设计的各个环节。在实际项目中建议根据具体业务需求调整判断逻辑和参数设置特别是在处理用户隐私数据时要严格遵守相关法律法规。通过合理的架构设计和持续的优化迭代可以构建出既准确又高效的智能状态管理系统。

相关新闻

Java中文乱码全解析:从字符编码原理到实战解决方案

Java中文乱码全解析:从字符编码原理到实战解决方案

1. 从“锟斤拷”说起:为什么中文乱码是Java开发者的必修课如果你在Java开发中没见过“锟斤拷”或者“烫烫烫”,那你的职业生涯可能还不够完整。这当然是个玩笑,但背后反映的是一个严肃且普遍的问题:中文乱码。它就像一个幽灵&…

2026/8/4 15:07:56 阅读更多 →
Python数据分析实战:从数据清洗到可视化呈现的完整行业盈利分析流程

Python数据分析实战:从数据清洗到可视化呈现的完整行业盈利分析流程

1. 项目缘起:为什么我们需要一个“闯关式”的行业盈利分析实验?最近在带团队做数据分析培训,发现一个挺普遍的问题:很多朋友学了Python、Pandas、Matplotlib,看教程时感觉都懂了,一到自己动手分析真实的行业…

2026/8/17 22:57:12 阅读更多 →
verilog HDLBits刷题[Finite State Machines]“Lemmings2”---Lemmings2

verilog HDLBits刷题[Finite State Machines]“Lemmings2”---Lemmings2

1、题目 See also: Lemmings1. In addition to walking left and right, Lemmings will fall (and presumably go "aaah!") if the ground disappears underneath them. In addition to walking left and right and changing direction when bumped, when ground0…

2026/8/18 17:33:36 阅读更多 →

最新新闻

ESP32驱动GC9A01圆形屏实现模拟VU表:从音频采集到图形渲染全解析

ESP32驱动GC9A01圆形屏实现模拟VU表:从音频采集到图形渲染全解析

1. 项目概述:当复古指针遇上数字核心最近在捣鼓一个挺有意思的小玩意儿:用ESP32驱动一块圆形的GC9A01显示屏,来模拟一个经典的模拟VU表。VU表,就是那种在旧式录音设备、功放上常见的,随着音乐节奏左右摆动的指针表头&a…

2026/8/19 2:06:33 阅读更多 →
树莓派机器人开发:如何实现稳定与敏捷的运动控制

树莓派机器人开发:如何实现稳定与敏捷的运动控制

1. 项目概述:PuppyPi,一个“稳”与“灵”的平衡艺术在机器人开发的圈子里,我们总在追求一种理想状态:既要像磐石一样稳定可靠,又要像猎豹一样敏捷灵动。这听起来像是个矛盾命题,尤其是在资源受限的嵌入式平…

2026/8/19 2:06:33 阅读更多 →
AI编程助手实战:基德1-2如何实现任务规划与跨文件代码生成

AI编程助手实战:基德1-2如何实现任务规划与跨文件代码生成

如果你最近在关注AI编程助手领域,可能会注意到一个现象:很多工具都在强调“智能”,但实际用起来,要么是简单的代码补全,要么是复杂的Agent框架,需要大量配置才能工作。开发者真正需要的,往往是一…

2026/8/19 2:06:33 阅读更多 →
【单片机毕设案例分享】赛道模拟场景下单片机红外循迹智能小车设计 基于 STM32 或 51 单片机的便携式红外循迹小车系统设计(022203)

【单片机毕设案例分享】赛道模拟场景下单片机红外循迹智能小车设计 基于 STM32 或 51 单片机的便携式红外循迹小车系统设计(022203)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机,STM32单片机,51单片机,J…

2026/8/19 2:06:33 阅读更多 →
DeepSeek V4-Flash接入Codex平台:免部署大模型集成实战指南

DeepSeek V4-Flash接入Codex平台:免部署大模型集成实战指南

最近在尝试将最新的开源大模型集成到现有AI开发工具中时,发现了一个非常高效的组合:DeepSeek V4-Flash 模型直接接入 Codex 平台。这个方案不仅绕过了复杂的本地部署,还能直接利用 Codex 强大的 Agent 编排和 API 管理能力,对于想…

2026/8/19 2:06:32 阅读更多 →
基于Arduino与传感器复刻《捉鬼敢死队》PKE探测仪:从电磁场探测到多模态交互

基于Arduino与传感器复刻《捉鬼敢死队》PKE探测仪:从电磁场探测到多模态交互

1. 项目概述:当“捉鬼”走进现实 如果你和我一样,是看着《捉鬼敢死队》长大的,那么对那个标志性的“质子背包”和“幽灵陷阱”一定不陌生。但真正让每个“捉鬼队员”在电影里显得专业又酷炫的,其实是他们手里那个会“哔哔”作响、…

2026/8/19 2:05:32 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →