多动症人群在日常行为管理中需要高频记录注意力状态、任务完成情况、情绪波动等信息,同时需要系统根据实时数据给出即时干预提醒,传统的前端本地存储方案难以满足多端同步和复杂逻辑处理需求。Node.js作为基于Chrome V8引擎的JavaScript运行环境,天生适合处理高并发的I/O密集型任务,刚好匹配DeADHD工具的数据处理场景。

DeADHD工具的核心功能与技术选型
DeADHD多动症管理工具的核心目标是帮助用户建立规律的行为模式,降低注意力分散带来的影响,因此核心功能需要覆盖三个层面。第一是行为数据采集层,需要支持用户手动记录任务开始结束时间、注意力评分、干扰事件等信息,同时支持可穿戴设备的数据接入,这部分需要高频的数据接收接口和稳定的数据解析逻辑。第二是干预逻辑层,需要根据用户的历史行为数据生成个性化的提醒规则,比如当用户连续专注超过40分钟时推送休息提醒,当任务完成率低于阈值时调整任务难度,这部分需要灵活的定时任务调度和规则引擎支持。第三是数据展示层,需要生成每日、每周的行为趋势报表,帮助用户直观看到自己的进步,这部分需要高效的数据聚合查询能力。
技术选型上,Node.js的Express框架可以作为基础接口层,处理HTTP请求和路由分发;Socket.IO可以实现实时提醒推送,当系统检测到用户需要干预时,第一时间将提醒推送到用户的手机、电脑等多端设备;数据库层面选择MongoDB存储非结构化的行为记录数据,因为多动症用户的行为记录字段灵活,不需要固定的表结构,MongoDB的文档模型更适配这种场景;定时任务使用node-schedule库,支持按照自定义的cron表达式执行干预逻辑,比如每天固定时间生成当日的行为总结报告。
还需要考虑系统的可扩展性,后续如果需要接入更多类型的可穿戴设备或者新增干预规则,Node.js的生态库可以快速支持新功能的开发,不需要重构整个后端架构。比如后续要加入基于机器学习的注意力预测功能,只需要新增一个Python服务,通过Node.js的HTTP请求调用即可,两者之间的通信成本低,不会成为系统瓶颈。
核心接口与实时通信功能实现
首先实现行为数据上报接口,这是DeADHD工具最基础的功能,用户每次记录行为数据都需要调用这个接口。接口需要接收用户ID、行为类型、时间戳、附加描述等参数,同时做参数校验,避免无效数据存入数据库。参数校验可以使用Joi库,定义每个字段的类型和必填规则,比如用户ID必须是字符串且不能为空,行为类型只能是指定的几个枚举值,时间戳必须是合法的数字格式。
以下是行为数据上报接口的实现代码:
const express = require('express');
const Joi = require('joi');
const mongoose = require('mongoose');
const router = express.Router();
// 定义行为记录的数据模型
const BehaviorSchema = new mongoose.Schema({
userId: { type: String, required: true },
behaviorType: { type: String, required: true, enum: ['focus', 'rest', 'distract', 'task_start', 'task_end'] },
timestamp: { type: Number, required: true },
description: { type: String, default: '' },
score: { type: Number, min: 0, max: 10, default: null }
});
const BehaviorModel = mongoose.model('Behavior', BehaviorSchema);
// 定义参数校验规则
const reportBehaviorSchema = Joi.object({
userId: Joi.string().required(),
behaviorType: Joi.string().valid('focus', 'rest', 'distract', 'task_start', 'task_end').required(),
timestamp: Joi.number().required(),
description: Joi.string().max(200).default(''),
score: Joi.number().min(0).max(10).default(null)
});
// 行为数据上报接口
router.post('/api/behavior/report', async (req, res) => {
try {
// 参数校验
const { error, value } = reportBehaviorSchema.validate(req.body);
if (error) {
return res.status(400).json({ code: 400, msg: error.details[0].message });
}
// 存入数据库
const behaviorRecord = new BehaviorModel(value);
await behaviorRecord.save();
// 触发实时干预逻辑检查
checkIntervention(value.userId, value);
return res.status(200).json({ code: 200, msg: '行为记录成功', data: behaviorRecord });
} catch (err) {
console.error('行为上报失败:', err);
return res.status(500).json({ code: 500, msg: '服务器内部错误' });
}
});
module.exports = router;
实时提醒功能需要结合Socket.IO实现,当用户的行为触发干预规则时,后端主动将提醒推送到用户的在线设备。首先需要初始化Socket.IO服务,和Express服务绑定,当客户端连接时记录用户的socket ID和对应的用户ID,方便后续定向推送。比如当用户连续专注时间超过预设的阈值时,系统调用推送接口,向该用户的所有在线设备发送休息提醒。
以下是实时提醒功能的实现代码:
const socketIo = require('socket.io');
const schedule = require('node-schedule');
// 存储用户ID和socket实例的映射关系
const userSocketMap = new Map();
// 初始化Socket.IO服务
function initSocketIO(server) {
const io = socketIo(server, {
cors: {
origin: '*',
methods: ['GET', 'POST']
}
});
io.on('connection', (socket) => {
console.log('新客户端连接:', socket.id);
// 客户端连接后上报用户ID,建立映射
socket.on('bind_user', (userId) => {
userSocketMap.set(userId, socket);
console.log(`用户${userId}绑定socket:${socket.id}`);
});
socket.on('disconnect', () => {
// 断开连接时删除映射
for (let [userId, s] of userSocketMap) {
if (s.id === socket.id) {
userSocketMap.delete(userId);
break;
}
}
console.log('客户端断开连接:', socket.id);
});
});
return io;
}
// 推送提醒给用户
function pushReminder(userId, reminderContent) {
const socket = userSocketMap.get(userId);
if (socket) {
socket.emit('reminder', {
content: reminderContent,
timestamp: Date.now()
});
console.log(`向用户${userId}推送提醒:${reminderContent}`);
}
}
// 检查是否需要干预,比如连续专注超过40分钟
function checkIntervention(userId, currentBehavior) {
if (currentBehavior.behaviorType === 'focus') {
// 查询用户最近40分钟内的专注记录
const fortyMinutesAgo = Date.now() - 40 * 60 * 1000;
BehaviorModel.countDocuments({
userId: userId,
behaviorType: 'focus',
timestamp: { $gte: fortyMinutesAgo }
}).then(count => {
if (count >= 8) { // 假设每5分钟记录一次专注状态,40分钟就是8次
pushReminder(userId, '你已经连续专注40分钟,建议休息5-10分钟,放松一下眼睛和大脑');
}
});
}
}
module.exports = { initSocketIO, pushReminder };
数据统计与个性化规则配置实现
DeADHD工具需要为用户生成行为趋势报表,帮助用户了解自己的注意力变化规律,这部分需要高效的数据聚合能力。MongoDB的聚合管道可以很好地支持这类需求,比如统计用户每周的专注总时长、分心次数、任务完成率等指标。聚合管道可以按照时间范围筛选数据,按照行为类型分组统计,最后计算需要的指标,整个过程在数据库层面完成,比先查询所有数据再在Node.js中计算效率高很多。
以下是每周行为数据统计的实现代码:
// 统计用户每周的行为数据
router.get('/api/statistics/weekly', async (req, res) => {
try {
const { userId, startTime, endTime } = req.query;
if (!userId || !startTime || !endTime) {
return res.status(400).json({ code: 400, msg: '缺少必要参数' });
}
const start = Number(startTime);
const end = Number(endTime);
// 聚合管道查询
const statistics = await BehaviorModel.aggregate([
{
$match: {
userId: userId,
timestamp: { $gte: start, $lte: end }
}
},
{
$group: {
_id: '$behaviorType',
count: { $sum: 1 },
totalScore: { $sum: { $ifNull: ['$score', 0] } },
avgScore: { $avg: { $ifNull: ['$score', 0] } }
}
}
]);
// 整理返回数据
const result = {
focusCount: 0,
restCount: 0,
distractCount: 0,
taskStartCount: 0,
taskEndCount: 0,
avgFocusScore: 0
};
statistics.forEach(item => {
switch (item._id) {
case 'focus':
result.focusCount = item.count;
result.avgFocusScore = item.avgScore;
break;
case 'rest':
result.restCount = item.count;
break;
case 'distract':
result.distractCount = item.count;
break;
case 'task_start':
result.taskStartCount = item.count;
break;
case 'task_end':
result.taskEndCount = item.count;
break;
}
});
// 计算任务完成率
result.taskCompletionRate = result.taskStartCount > 0 ? (result.taskEndCount / result.taskStartCount * 100).toFixed(2) : 0;
return res.status(200).json({ code: 200, msg: '统计成功', data: result });
} catch (err) {
console.error('周统计失败:', err);
return res.status(500).json({ code: 500, msg: '服务器内部错误' });
}
});
个性化规则配置允许用户根据自己的情况调整干预阈值,比如有的用户适合专注30分钟就休息,有的用户适合专注60分钟再休息,这部分需要把规则存储到数据库,每次检查干预逻辑时读取用户的自定义规则。可以新增一个规则模型,存储用户ID、规则类型、阈值、是否启用等字段,用户可以通过接口修改自己的规则配置,系统执行干预检查时优先使用用户的自定义规则,没有自定义规则则使用默认规则。
以下是规则配置相关的实现代码:
// 规则数据模型
const RuleSchema = new mongoose.Schema({
userId: { type: String, required: true },
ruleType: { type: String, required: true, enum: ['focus_duration', 'task_difficulty', 'reminder_frequency'] },
threshold: { type: Number, required: true },
isEnabled: { type: Boolean, default: true },
updateTime: { type: Number, default: Date.now }
});
const RuleModel = mongoose.model('Rule', RuleSchema);
// 更新用户规则接口
router.post('/api/rule/update', async (req, res) => {
try {
const { userId, ruleType, threshold, isEnabled } = req.body;
if (!userId || !ruleType || threshold === undefined) {
return res.status(400).json({ code: 400, msg: '缺少必要参数' });
}
// 查找用户是否已有该规则,有则更新,无则新增
const existRule = await RuleModel.findOne({ userId, ruleType });
if (existRule) {
existRule.threshold = threshold;
existRule.isEnabled = isEnabled !== undefined ? isEnabled : true;
existRule.updateTime = Date.now();
await existRule.save();
} else {
const newRule = new RuleModel({
userId,
ruleType,
threshold,
isEnabled: isEnabled !== undefined ? isEnabled : true
});
await newRule.save();
}
return res.status(200).json({ code: 200, msg: '规则更新成功' });
} catch (err) {
console.error('规则更新失败:', err);
return res.status(500).json({ code: 500, msg: '服务器内部错误' });
}
});
// 修改之前的干预检查逻辑,读取用户自定义规则
async function checkIntervention(userId, currentBehavior) {
if (currentBehavior.behaviorType === 'focus') {
// 读取用户的专注时长规则
const userRule = await RuleModel.findOne({ userId, ruleType: 'focus_duration', isEnabled: true });
const focusThreshold = userRule ? userRule.threshold : 40; // 默认40分钟
const thresholdMs = focusThreshold * 60 * 1000;
const startTime = Date.now() - thresholdMs;
BehaviorModel.countDocuments({
userId: userId,
behaviorType: 'focus',
timestamp: { $gte: startTime }
}).then(count => {
// 假设每5分钟记录一次专注状态,计算需要的记录次数
const needCount = Math.ceil(focusThreshold / 5);
if (count >= needCount) {
pushReminder(userId, `你已经连续专注${focusThreshold}分钟,建议休息5-10分钟,放松一下眼睛和大脑`);
}
});
}
}
整个DeADHD多动症管理工具的Node.js实现方案,既满足了高频行为数据的处理需求,也支持了灵活的个性化配置和实时提醒能力,后续还可以扩展更多功能,比如接入可穿戴设备的注意力监测数据、增加社交激励功能让用户可以和同伴互相监督,Node.js的生态可以很好地支持这些功能的迭代开发。