- 前端: 所有界面显示、i18n 文本、组件中的品牌名称 - 后端: 服务层、设置默认值、邮件模板、安装向导 - 数据库: 迁移脚本注释 - 保持功能完全一致,仅更改品牌名称 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
84 lines
2.9 KiB
SQL
84 lines
2.9 KiB
SQL
-- Migration: Move wechat field from users table to user_attribute_values
|
|
-- This migration:
|
|
-- 1. Creates a "wechat" attribute definition
|
|
-- 2. Migrates existing wechat data to user_attribute_values
|
|
-- 3. Does NOT drop the wechat column (for rollback safety, can be done in a later migration)
|
|
|
|
-- +goose Up
|
|
-- +goose StatementBegin
|
|
|
|
-- Step 1: Insert wechat attribute definition if not exists
|
|
INSERT INTO user_attribute_definitions (key, name, description, type, options, required, validation, placeholder, display_order, enabled, created_at, updated_at)
|
|
SELECT 'wechat', '微信', '用户微信号', 'text', '[]'::jsonb, false, '{}'::jsonb, '请输入微信号', 0, true, NOW(), NOW()
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM user_attribute_definitions WHERE key = 'wechat' AND deleted_at IS NULL
|
|
);
|
|
|
|
-- Step 2: Migrate existing wechat values to user_attribute_values
|
|
-- Only migrate non-empty values
|
|
INSERT INTO user_attribute_values (user_id, attribute_id, value, created_at, updated_at)
|
|
SELECT
|
|
u.id,
|
|
(SELECT id FROM user_attribute_definitions WHERE key = 'wechat' AND deleted_at IS NULL LIMIT 1),
|
|
u.wechat,
|
|
NOW(),
|
|
NOW()
|
|
FROM users u
|
|
WHERE u.wechat IS NOT NULL
|
|
AND u.wechat != ''
|
|
AND u.deleted_at IS NULL
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM user_attribute_values uav
|
|
WHERE uav.user_id = u.id
|
|
AND uav.attribute_id = (SELECT id FROM user_attribute_definitions WHERE key = 'wechat' AND deleted_at IS NULL LIMIT 1)
|
|
);
|
|
|
|
-- Step 3: Update display_order to ensure wechat appears first
|
|
UPDATE user_attribute_definitions
|
|
SET display_order = -1
|
|
WHERE key = 'wechat' AND deleted_at IS NULL;
|
|
|
|
-- Reorder all attributes starting from 0
|
|
WITH ordered AS (
|
|
SELECT id, ROW_NUMBER() OVER (ORDER BY display_order, id) - 1 as new_order
|
|
FROM user_attribute_definitions
|
|
WHERE deleted_at IS NULL
|
|
)
|
|
UPDATE user_attribute_definitions
|
|
SET display_order = ordered.new_order
|
|
FROM ordered
|
|
WHERE user_attribute_definitions.id = ordered.id;
|
|
|
|
-- Step 4: Drop the redundant wechat column from users table
|
|
ALTER TABLE users DROP COLUMN IF EXISTS wechat;
|
|
|
|
-- +goose StatementEnd
|
|
|
|
-- +goose Down
|
|
-- +goose StatementBegin
|
|
|
|
-- Restore wechat column
|
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS wechat VARCHAR(100) DEFAULT '';
|
|
|
|
-- Copy attribute values back to users.wechat column
|
|
UPDATE users u
|
|
SET wechat = uav.value
|
|
FROM user_attribute_values uav
|
|
JOIN user_attribute_definitions uad ON uav.attribute_id = uad.id
|
|
WHERE uav.user_id = u.id
|
|
AND uad.key = 'wechat'
|
|
AND uad.deleted_at IS NULL;
|
|
|
|
-- Delete migrated attribute values
|
|
DELETE FROM user_attribute_values
|
|
WHERE attribute_id IN (
|
|
SELECT id FROM user_attribute_definitions WHERE key = 'wechat' AND deleted_at IS NULL
|
|
);
|
|
|
|
-- Soft-delete the wechat attribute definition
|
|
UPDATE user_attribute_definitions
|
|
SET deleted_at = NOW()
|
|
WHERE key = 'wechat' AND deleted_at IS NULL;
|
|
|
|
-- +goose StatementEnd
|