测试连接数据库

This commit is contained in:
not-like-juvenile
2026-01-30 08:32:12 +08:00
parent 76eb96ec0c
commit fde3cb0322
2 changed files with 271 additions and 2 deletions

View File

@@ -0,0 +1,271 @@
- 创建正确的触发器和函数
CREATE OR REPLACE FUNCTION ensure_ak_user()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO public.ak_users (user_id, email, nickname)
VALUES (NEW.id, NEW.email, COALESCE(NEW.email, '新用户'))
ON CONFLICT (user_id) DO UPDATE SET
email = EXCLUDED.email,
nickname = EXCLUDED.nickname;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_ensure_ak_user
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION ensure_ak_user();
-- =============================================
-- 0. 创建 ak_users 表(你的核心用户表)
-- =============================================
CREATE TABLE IF NOT EXISTS public.ak_users (
id BIGSERIAL PRIMARY KEY,
user_id UUID UNIQUE NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
email VARCHAR(255) UNIQUE,
phone VARCHAR(20),
nickname VARCHAR(100),
avatar_url TEXT,
gender CHAR(1) DEFAULT 'U',
birthday DATE,
address TEXT,
user_type INTEGER DEFAULT 1, -- 1:普通用户, 2:配送员
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- =============================================
-- 1. 配送员资料表 (delivery_drivers)
-- =============================================
CREATE TABLE IF NOT EXISTS public.delivery_drivers (
id BIGSERIAL PRIMARY KEY,
user_id UUID UNIQUE NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
real_name VARCHAR(100) NOT NULL,
id_card VARCHAR(18),
driver_license VARCHAR(50),
vehicle_type INTEGER DEFAULT 1, -- 1:电动车, 2:摩托车, 3:汽车
vehicle_number VARCHAR(20),
work_status INTEGER DEFAULT 1, -- 1:空闲, 2:忙碌, 3:休息
current_location JSONB, -- {lat: 22.5431, lng: 114.0579, address: "深圳市南山区"}
service_areas TEXT[], -- 服务区域数组 ["南山", "福田", "罗湖"]
rating DECIMAL(3,2) DEFAULT 5.00, -- 平均评分
total_orders INTEGER DEFAULT 0, -- 总完成订单数
auth_status INTEGER DEFAULT 1, -- 1:未认证, 2:审核中, 3:已认证
online_status BOOLEAN DEFAULT FALSE, -- 是否在线
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- =============================================
-- 2. 订单表 (orders)
-- =============================================
CREATE TABLE IF NOT EXISTS public.orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(50) UNIQUE NOT NULL, -- 订单号,如 D202501081234
user_id UUID NOT NULL REFERENCES auth.users(id), -- 下单用户
status INTEGER DEFAULT 1, -- 1:待支付, 2:待接单, 3:配送中, 4:已完成, 5:已取消
total_amount DECIMAL(10,2) NOT NULL, -- 订单总金额
delivery_fee DECIMAL(10,2) NOT NULL, -- 配送费
payable_amount DECIMAL(10,2) NOT NULL, -- 实付金额
pickup_address JSONB NOT NULL, -- 取货地址
delivery_address JSONB NOT NULL, -- 配送地址
pickup_contact JSONB NOT NULL, -- 取货联系人
delivery_contact JSONB NOT NULL, -- 配送联系人
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- =============================================
-- 3. 配送任务表 (delivery_tasks)
-- =============================================
CREATE TABLE IF NOT EXISTS public.delivery_tasks (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES orders(id),
driver_id BIGINT NOT NULL REFERENCES delivery_drivers(id),
task_status INTEGER DEFAULT 1, -- 1:待接取, 2:已接取, 3:取货中, 4:已取货, 5:配送中, 6:已完成
pickup_address JSONB NOT NULL, -- 取货地址 {detail: "", area: "", lat: 0, lng: 0}
delivery_address JSONB NOT NULL, -- 配送地址 {detail: "", area: "", lat: 0, lng: 0}
pickup_contact JSONB NOT NULL, -- 取货联系人 {name: "", phone: ""}
delivery_contact JSONB NOT NULL, -- 配送联系人 {name: "", phone: ""}
delivery_fee DECIMAL(10,2) NOT NULL, -- 配送费
distance DECIMAL(8,2) DEFAULT 0, -- 配送距离(km)
estimated_time INTEGER DEFAULT 0, -- 预计配送时间(分钟)
pickup_time TIMESTAMP WITH TIME ZONE, -- 实际取货时间
delivery_time TIMESTAMP WITH TIME ZONE, -- 实际配送时间
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- =============================================
-- 4. 今日统计表 (daily_stats)
-- =============================================
CREATE TABLE IF NOT EXISTS public.daily_stats (
id BIGSERIAL PRIMARY KEY,
driver_id BIGINT NOT NULL REFERENCES delivery_drivers(id),
stat_date DATE NOT NULL,
completed_orders INTEGER DEFAULT 0,
total_earning DECIMAL(10,2) DEFAULT 0.00,
total_distance DECIMAL(8,2) DEFAULT 0.00,
avg_rating DECIMAL(3,2) DEFAULT 5.00,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(driver_id, stat_date) -- 每个司机每天只有一条统计记录
);
-- =============================================
-- 5. 启用 RLS
-- =============================================
ALTER TABLE public.ak_users ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.delivery_drivers ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.orders ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.delivery_tasks ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.daily_stats ENABLE ROW LEVEL SECURITY;
-- =============================================
-- 6. 创建 RLS 策略
-- =============================================
CREATE POLICY "Users can view own profile" ON public.ak_users
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Drivers can view own profile" ON public.delivery_drivers
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Users can view own orders" ON public.orders
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Drivers can view own tasks" ON public.delivery_tasks
FOR SELECT USING (EXISTS (
SELECT 1 FROM delivery_drivers dd
WHERE dd.id = delivery_tasks.driver_id AND dd.user_id = auth.uid()
));
CREATE POLICY "Drivers can view own stats" ON public.daily_stats
FOR SELECT USING (EXISTS (
SELECT 1 FROM delivery_drivers dd
WHERE dd.id = daily_stats.driver_id AND dd.user_id = auth.uid()
));
-- =============================================
-- 7. 创建索引
-- =============================================
CREATE INDEX IF NOT EXISTS idx_ak_users_user_id ON public.ak_users(user_id);
CREATE INDEX IF NOT EXISTS idx_ak_users_email ON public.ak_users(email);
CREATE INDEX IF NOT EXISTS idx_delivery_drivers_user_id ON public.delivery_drivers(user_id);
CREATE INDEX IF NOT EXISTS idx_orders_user_id ON public.orders(user_id);
CREATE INDEX IF NOT EXISTS idx_delivery_tasks_driver_id ON public.delivery_tasks(driver_id);
CREATE INDEX IF NOT EXISTS idx_daily_stats_driver_date ON public.daily_stats(driver_id, stat_date);
-- =============================================
-- 8. 创建触发器:当新用户注册时自动创建 ak_users 记录
-- =============================================
-- 先删除已存在的(防止重复创建错误)
DROP TRIGGER IF EXISTS trigger_ensure_ak_user ON auth.users;
DROP FUNCTION IF EXISTS ensure_ak_user();
-- 创建新的触发器和函数
CREATE OR REPLACE FUNCTION ensure_ak_user()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO public.ak_users (user_id, email, nickname, user_type)
VALUES (NEW.id, NEW.email, COALESCE(NEW.email, '新用户'), 1)
ON CONFLICT (user_id) DO UPDATE SET
email = EXCLUDED.email,
nickname = EXCLUDED.nickname;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_ensure_ak_user
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION ensure_ak_user();
-- =============================================
-- 9. 创建测试数据
-- =============================================
DO $$
DECLARE
test_user_id UUID;
test_driver_id UUID;
test_driver_record_id BIGINT;
test_order_id BIGINT;
BEGIN
-- 创建配送员用户
INSERT INTO auth.users (
instance_id, id, aud, role, email, encrypted_password,
email_confirmed_at, created_at, updated_at
) VALUES (
'00000000-0000-0000-0000-000000000000',
gen_random_uuid(),
'authenticated',
'authenticated',
'123@example.com',
crypt('Test123456', gen_salt('bf')),
NOW(),
NOW(),
NOW()
) RETURNING id INTO test_driver_id;
-- 创建配送员资料
INSERT INTO public.delivery_drivers (
user_id, real_name, vehicle_number, online_status, rating, total_orders
) VALUES (
test_driver_id,
'张师傅',
'粤B12345',
TRUE,
4.8,
1250
) RETURNING id INTO test_driver_record_id;
-- 创建今日统计数据
INSERT INTO public.daily_stats (
driver_id, stat_date, completed_orders, total_earning, total_distance, avg_rating
) VALUES (
test_driver_record_id,
CURRENT_DATE,
8,
245.60,
45.0,
4.9
);
-- 创建测试订单
INSERT INTO public.orders (
order_no, user_id, status, total_amount, delivery_fee, payable_amount,
pickup_address, delivery_address, pickup_contact, delivery_contact
) VALUES (
'D202501081234',
test_driver_id, -- 为了测试,暂时让司机自己下单
2, -- 已接单
125.50,
8.50,
134.00,
'{"detail": "华强北商业区华强电子世界2楼A205", "area": "华强北", "lat": 22.5431, "lng": 114.0579}',
'{"detail": "南山区科技园深南大道9999号", "area": "科技园", "lat": 22.5350, "lng": 113.9490}',
'{"name": "商家联系人", "phone": "138****5678"}',
'{"name": "张先生", "phone": "139****1234"}'
) RETURNING id INTO test_order_id;
-- 创建配送任务
INSERT INTO public.delivery_tasks (
order_id, driver_id, task_status, pickup_address, delivery_address,
pickup_contact, delivery_contact, delivery_fee, distance, estimated_time
) VALUES (
test_order_id,
test_driver_record_id,
2, -- 已接取
'{"detail": "华强北商业区华强电子世界2楼A205", "area": "华强北", "lat": 22.5431, "lng": 114.0579}',
'{"detail": "南山区科技园深南大道9999号", "area": "科技园", "lat": 22.5350, "lng": 113.9490}',
'{"name": "商家联系人", "phone": "138****5678"}',
'{"name": "张先生", "phone": "139****1234"}',
8.50,
12.5,
35
);
RAISE NOTICE '✅ 配送系统数据库创建完成!';
END $$;

View File

@@ -23,8 +23,6 @@ delivery/
├── vehicle-edit.uvue # 编辑车辆信息
```
> 💡 注:`index.uvue` 出现两次,建议保留一个作为首页入口,另一个可重命名为 `dashboard.uvue``home.uvue`
---
## 🧭 各页面功能说明