推进活动系统最小成品闭环与游客体验
This commit is contained in:
33
backend/migrations/0012_managed_assets.sql
Normal file
33
backend/migrations/0012_managed_assets.sql
Normal file
@@ -0,0 +1,33 @@
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE managed_assets (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
asset_public_id TEXT NOT NULL UNIQUE,
|
||||
asset_type TEXT NOT NULL,
|
||||
asset_code TEXT NOT NULL,
|
||||
version TEXT NOT NULL,
|
||||
title TEXT,
|
||||
source_mode TEXT NOT NULL CHECK (source_mode IN ('uploaded', 'external_link')),
|
||||
storage_provider TEXT NOT NULL CHECK (storage_provider IN ('oss', 'external')),
|
||||
object_key TEXT,
|
||||
public_url TEXT NOT NULL,
|
||||
file_name TEXT,
|
||||
content_type TEXT,
|
||||
file_size_bytes BIGINT,
|
||||
checksum_sha256 TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('draft', 'active', 'disabled', 'archived')),
|
||||
metadata_jsonb JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE (asset_type, asset_code, version)
|
||||
);
|
||||
|
||||
CREATE INDEX managed_assets_asset_type_idx ON managed_assets(asset_type);
|
||||
CREATE INDEX managed_assets_asset_code_idx ON managed_assets(asset_code);
|
||||
CREATE INDEX managed_assets_status_idx ON managed_assets(status);
|
||||
|
||||
CREATE TRIGGER managed_assets_set_updated_at
|
||||
BEFORE UPDATE ON managed_assets
|
||||
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
||||
|
||||
COMMIT;
|
||||
79
backend/migrations/0013_ops_console.sql
Normal file
79
backend/migrations/0013_ops_console.sql
Normal file
@@ -0,0 +1,79 @@
|
||||
BEGIN;
|
||||
|
||||
ALTER TABLE auth_sms_codes
|
||||
DROP CONSTRAINT IF EXISTS auth_sms_codes_client_type_check;
|
||||
|
||||
ALTER TABLE auth_sms_codes
|
||||
ADD CONSTRAINT auth_sms_codes_client_type_check
|
||||
CHECK (client_type IN ('app', 'wechat', 'ops'));
|
||||
|
||||
CREATE TABLE ops_roles (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
role_code TEXT NOT NULL UNIQUE,
|
||||
display_name TEXT NOT NULL,
|
||||
role_rank INT NOT NULL,
|
||||
permissions_jsonb JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'disabled', 'archived')),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TRIGGER ops_roles_set_updated_at
|
||||
BEFORE UPDATE ON ops_roles
|
||||
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
||||
|
||||
CREATE TABLE ops_users (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
ops_user_public_id TEXT NOT NULL UNIQUE,
|
||||
country_code TEXT NOT NULL,
|
||||
mobile TEXT NOT NULL,
|
||||
display_name TEXT NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'disabled', 'deleted')),
|
||||
last_login_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE (country_code, mobile)
|
||||
);
|
||||
|
||||
CREATE INDEX ops_users_mobile_idx ON ops_users(country_code, mobile);
|
||||
|
||||
CREATE TRIGGER ops_users_set_updated_at
|
||||
BEFORE UPDATE ON ops_users
|
||||
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
||||
|
||||
CREATE TABLE ops_user_roles (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
ops_user_id UUID NOT NULL REFERENCES ops_users(id) ON DELETE CASCADE,
|
||||
ops_role_id UUID NOT NULL REFERENCES ops_roles(id) ON DELETE CASCADE,
|
||||
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'disabled')),
|
||||
assigned_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
assigned_by_ops_user_id UUID REFERENCES ops_users(id) ON DELETE SET NULL,
|
||||
UNIQUE (ops_user_id, ops_role_id)
|
||||
);
|
||||
|
||||
CREATE INDEX ops_user_roles_user_idx ON ops_user_roles(ops_user_id);
|
||||
CREATE INDEX ops_user_roles_role_idx ON ops_user_roles(ops_role_id);
|
||||
|
||||
CREATE TABLE ops_refresh_tokens (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
ops_user_id UUID NOT NULL REFERENCES ops_users(id) ON DELETE CASCADE,
|
||||
device_key TEXT,
|
||||
token_hash TEXT NOT NULL UNIQUE,
|
||||
issued_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
expires_at TIMESTAMPTZ NOT NULL,
|
||||
revoked_at TIMESTAMPTZ,
|
||||
replaced_by_token_id UUID REFERENCES ops_refresh_tokens(id) ON DELETE SET NULL
|
||||
);
|
||||
|
||||
CREATE INDEX ops_refresh_tokens_user_idx ON ops_refresh_tokens(ops_user_id);
|
||||
CREATE INDEX ops_refresh_tokens_expires_idx ON ops_refresh_tokens(expires_at);
|
||||
|
||||
INSERT INTO ops_roles (role_code, display_name, role_rank, permissions_jsonb)
|
||||
VALUES
|
||||
('owner', '所有者', 100, '{"scope":"all"}'::jsonb),
|
||||
('admin', '管理员', 80, '{"scope":"ops_admin"}'::jsonb),
|
||||
('operator', '运维专员', 50, '{"scope":"ops_operator"}'::jsonb),
|
||||
('viewer', '只读观察员', 10, '{"scope":"ops_viewer"}'::jsonb)
|
||||
ON CONFLICT (role_code) DO NOTHING;
|
||||
|
||||
COMMIT;
|
||||
30
backend/migrations/0014_map_experience.sql
Normal file
30
backend/migrations/0014_map_experience.sql
Normal file
@@ -0,0 +1,30 @@
|
||||
BEGIN;
|
||||
|
||||
ALTER TABLE events
|
||||
ADD COLUMN IF NOT EXISTS is_default_experience BOOLEAN NOT NULL DEFAULT false;
|
||||
|
||||
ALTER TABLE events
|
||||
ADD COLUMN IF NOT EXISTS show_in_event_list BOOLEAN NOT NULL DEFAULT true;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS events_is_default_experience_idx
|
||||
ON events(is_default_experience);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS events_show_in_event_list_idx
|
||||
ON events(show_in_event_list);
|
||||
|
||||
UPDATE events
|
||||
SET
|
||||
is_default_experience = true,
|
||||
show_in_event_list = true
|
||||
WHERE event_public_id = 'evt_demo_001';
|
||||
|
||||
UPDATE events
|
||||
SET
|
||||
is_default_experience = false,
|
||||
show_in_event_list = true
|
||||
WHERE event_public_id IN (
|
||||
'evt_demo_score_o_001',
|
||||
'evt_demo_variant_manual_001'
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
14
backend/migrations/0015_guest_identity.sql
Normal file
14
backend/migrations/0015_guest_identity.sql
Normal file
@@ -0,0 +1,14 @@
|
||||
ALTER TABLE login_identities
|
||||
DROP CONSTRAINT IF EXISTS login_identities_identity_type_check;
|
||||
|
||||
ALTER TABLE login_identities
|
||||
ADD CONSTRAINT login_identities_identity_type_check
|
||||
CHECK (
|
||||
identity_type IN (
|
||||
'mobile',
|
||||
'wechat_mini_openid',
|
||||
'wechat_oa_openid',
|
||||
'wechat_unionid',
|
||||
'guest'
|
||||
)
|
||||
);
|
||||
Reference in New Issue
Block a user