Initial commit of akmon project

This commit is contained in:
2026-01-20 08:04:15 +08:00
commit 77a2bab985
1309 changed files with 343305 additions and 0 deletions

View File

@@ -0,0 +1,111 @@
-- 学生健康数据展示用的简化传感器数据表
-- 为了简化演示,我们创建一个统一的传感器数据表
-- 创建简化的传感器数据表
CREATE TABLE IF NOT EXISTS public.ss_sensor_data (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
sensor_type TEXT NOT NULL, -- 'temperature', 'heart_rate', 'oxygen_level', 'steps'
value NUMERIC NOT NULL,
unit TEXT, -- '°C', 'bpm', '%', 'steps'
recorded_at TIMESTAMPTZ NOT NULL DEFAULT now(),
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- 创建索引以提高查询性能
CREATE INDEX IF NOT EXISTS idx_ss_sensor_data_user_type_time
ON public.ss_sensor_data(user_id, sensor_type, recorded_at DESC);
CREATE INDEX IF NOT EXISTS idx_ss_sensor_data_type_time
ON public.ss_sensor_data(sensor_type, recorded_at DESC);
-- 插入示例数据(为演示用)
-- 假设有一个学生用户ID
DO $$
DECLARE
demo_user_id UUID;
current_time TIMESTAMPTZ;
BEGIN
-- 查找第一个学生用户ID
SELECT id INTO demo_user_id
FROM public.ak_users
WHERE role = 'student'
LIMIT 1;
-- 如果找到学生用户,插入示例数据
IF demo_user_id IS NOT NULL THEN
current_time := NOW();
-- 插入体温数据最近7天每小时一条
INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at)
SELECT
demo_user_id,
'temperature',
36.0 + (random() * 1.5), -- 36.0-37.5°C
'°C',
current_time - (interval '1 hour' * generate_series(0, 167))
FROM generate_series(0, 167) AS gs;
-- 插入心率数据最近7天每30分钟一条
INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at)
SELECT
demo_user_id,
'heart_rate',
60 + (random() * 40), -- 60-100 bpm
'bpm',
current_time - (interval '30 minutes' * generate_series(0, 335))
FROM generate_series(0, 335) AS gs;
-- 插入血氧数据最近7天每2小时一条
INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at)
SELECT
demo_user_id,
'oxygen_level',
95 + (random() * 5), -- 95-100%
'%',
current_time - (interval '2 hours' * generate_series(0, 83))
FROM generate_series(0, 83) AS gs;
-- 插入步数数据最近7天每天一条
INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at)
SELECT
demo_user_id,
'steps',
5000 + (random() * 10000), -- 5000-15000 steps
'steps',
current_time - (interval '1 day' * generate_series(0, 6))
FROM generate_series(0, 6) AS gs;
RAISE NOTICE '成功为用户 % 插入示例传感器数据', demo_user_id;
ELSE
RAISE NOTICE '未找到学生用户,跳过示例数据插入';
END IF;
END $$;
-- 创建视图以便查询最新的传感器数据
CREATE OR REPLACE VIEW public.v_latest_sensor_data AS
WITH latest_readings AS (
SELECT
user_id,
sensor_type,
value,
unit,
recorded_at,
ROW_NUMBER() OVER (PARTITION BY user_id, sensor_type ORDER BY recorded_at DESC) as rn
FROM public.ss_sensor_data
)
SELECT
user_id,
sensor_type,
value,
unit,
recorded_at
FROM latest_readings
WHERE rn = 1;
-- 授予权限
GRANT SELECT ON public.ss_sensor_data TO authenticated;
GRANT SELECT ON public.v_latest_sensor_data TO authenticated;
COMMENT ON TABLE public.ss_sensor_data IS '简化的传感器数据表,用于存储学生的健康监测数据';
COMMENT ON VIEW public.v_latest_sensor_data IS '获取每个用户每种传感器类型的最新数据';