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,185 @@
-- 从 member_user 迁移数据到 ak_users 的SQL脚本
-- 创建日期: 2025-06-23
-- 用途: 将智跑系统的用户数据迁移到新的ak_users表结构
-- =============================================================================
-- 1. 数据迁移前的准备工作
-- =============================================================================
-- 检查源表数据
SELECT
COUNT(*) as total_member_users,
COUNT(DISTINCT user_id) as unique_user_ids,
COUNT(CASE WHEN deleted = true THEN 1 END) as deleted_users
FROM public.member_user;
-- 检查目标表当前数据
SELECT COUNT(*) as current_ak_users FROM public.ak_users;
-- =============================================================================
-- 2. 数据迁移主脚本
-- =============================================================================
-- 插入数据到 ak_users 表
INSERT INTO public.ak_users (
id, -- 使用 member_user.user_id
username, -- 使用 nickname 或 name
email, -- 需要生成或使用手机号@domain
password_hash, -- 使用 member_user.password
gender, -- 转换 sex 字段
birthday, -- 转换 birthday 字段
height_cm, -- 默认为 NULL
weight_kg, -- 默认为 NULL
avatar_url, -- 使用 avatar 字段
region_id, -- 默认为 NULL需要后续映射
school_id, -- 默认为 NULL需要后续映射
grade_id, -- 默认为 NULL需要后续映射
class_id, -- 默认为 NULL需要后续映射
role, -- 默认为 'student'
created_at, -- 使用 create_time
updated_at, -- 使用 update_time
auth_id, -- 使用 user_id关联 users 表)
preferred_language, -- 默认为 NULL
bio, -- 使用 mark 字段
phone -- 使用 mobile 字段
)
SELECT
mu.user_id, -- id
COALESCE( -- username
NULLIF(TRIM(mu.nickname), ''),
NULLIF(TRIM(mu.name), ''),
'user_' || EXTRACT(EPOCH FROM mu.create_time)::bigint
),
CASE -- email
WHEN mu.mobile IS NOT NULL AND mu.mobile != '' AND mu.mobile != ''''''
THEN mu.mobile || '@akmon.local'
ELSE 'user_' || mu.id || '@akmon.local'
END,
CASE -- password_hash
WHEN mu.password IS NOT NULL AND mu.password != ''
THEN mu.password
ELSE gen_random_uuid()::text
END,
CASE -- gender
WHEN mu.sex = 1 THEN 'male'
WHEN mu.sex = 2 THEN 'female'
ELSE 'other'
END,
mu.birthday::date, -- birthday
NULL, -- height_cm
NULL, -- weight_kg
CASE -- avatar_url
WHEN mu.avatar IS NOT NULL AND mu.avatar != ''
THEN mu.avatar
ELSE NULL
END,
NULL, -- region_id
NULL, -- school_id
NULL, -- grade_id
NULL, -- class_id
'student', -- role (默认为学生)
mu.create_time AT TIME ZONE 'UTC', -- created_at
mu.update_time AT TIME ZONE 'UTC', -- updated_at
mu.user_id, -- auth_id
NULL, -- preferred_language
CASE -- bio
WHEN mu.mark IS NOT NULL AND TRIM(mu.mark) != ''
THEN mu.mark
ELSE NULL
END,
CASE -- phone
WHEN mu.mobile IS NOT NULL AND mu.mobile != '' AND mu.mobile != ''''''
THEN mu.mobile
ELSE NULL
END
FROM public.member_user mu
WHERE mu.deleted = false -- 只迁移未删除的用户
AND mu.user_id IS NOT NULL -- 确保有有效的user_id
AND NOT EXISTS ( -- 避免重复插入
SELECT 1 FROM public.ak_users au WHERE au.id = mu.user_id
);
-- =============================================================================
-- 3. 数据迁移后的验证
-- =============================================================================
-- 验证迁移结果
SELECT
'Migration Summary' as check_type,
COUNT(*) as migrated_users
FROM public.ak_users au
WHERE au.auth_id IS NOT NULL;
-- 检查是否有重复的用户名
SELECT
'Username Duplicates' as check_type,
username,
COUNT(*) as duplicate_count
FROM public.ak_users
GROUP BY username
HAVING COUNT(*) > 1;
-- 检查是否有重复的邮箱
SELECT
'Email Duplicates' as check_type,
email,
COUNT(*) as duplicate_count
FROM public.ak_users
GROUP BY email
HAVING COUNT(*) > 1;
-- 检查迁移的完整性
SELECT
'Data Integrity Check' as check_type,
COUNT(DISTINCT mu.user_id) as source_users,
COUNT(DISTINCT au.id) as migrated_users,
COUNT(DISTINCT mu.user_id) - COUNT(DISTINCT au.id) as missing_users
FROM public.member_user mu
LEFT JOIN public.ak_users au ON mu.user_id = au.id
WHERE mu.deleted = false;
-- =============================================================================
-- 4. 可选的清理和优化操作
-- =============================================================================
-- 更新序列(如果需要)
-- SELECT setval('ak_users_id_seq', (SELECT MAX(id) FROM ak_users));
-- 分析表以优化查询性能
ANALYZE public.ak_users;
-- =============================================================================
-- 5. 回滚脚本(如果需要)
-- =============================================================================
-- 如果需要回滚迁移,可以使用以下脚本:
/*
-- 删除从 member_user 迁移过来的数据
DELETE FROM public.ak_users
WHERE auth_id IN (
SELECT user_id FROM public.member_user WHERE deleted = false
);
*/
-- =============================================================================
-- 6. 后续处理建议
-- =============================================================================
/*
迁移完成后,建议进行以下操作:
1. 更新 region_id, school_id, grade_id, class_id 字段
- 根据业务逻辑映射到对应的新表
2. 设置用户角色
- 根据 member_user 的 group_id 或其他字段设置正确的角色
3. 处理用户偏好设置
- 如果有其他偏好数据需要迁移
4. 验证登录功能
- 确保用户可以使用新的认证系统登录
5. 数据备份
- 在生产环境执行前务必备份原始数据
*/