连接数据库并修改页面

This commit is contained in:
not-like-juvenile
2026-02-02 18:20:22 +08:00
parent 5f856a96c9
commit 8efe6d5e89
22 changed files with 1630 additions and 992 deletions

View File

@@ -1,271 +0,0 @@
- 创建正确的触发器和函数
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

@@ -1,183 +0,0 @@
# 🚚 配送端模块项目结构说明(`/pages/mall/delivery/`
> 本模块为配送员使用的移动端应用核心功能区,涵盖个人中心、任务管理、收入统计、车辆管理等核心功能。
---
## 📁 目录结构概览
```
delivery/
├── index.uvue # 配送端首页(工作台)
├── profile.uvue # 个人中心
├── profile-edit.uvue # 编辑个人信息
├── settings.uvue # 设置页面
├── tasks.uvue # 配送任务列表(按状态筛选)
├── task-detail.uvue # 单个任务详情页
├── order-history.uvue # 历史订单列表
├── order-detail.uvue # 订单详情页(从历史或当前跳转)
├── earnings.uvue # 收入明细
├── ratings.uvue # 评价记录
├── vehicle.uvue # 车辆管理主页
├── vehicle-add.uvue # 添加车辆
├── vehicle-edit.uvue # 编辑车辆信息
```
---
## 🧭 各页面功能说明
### 1. `index.uvue` —— **配送端首页 / 工作台**
- ✅ 核心入口页面
- 📍 展示当前任务、今日数据、快捷操作入口
- 🔄 可跳转到“个人中心”、“任务列表”、“收入明细”等
---
### 2. `profile.uvue` —— **个人中心**
- 👤 显示配送员基本信息(头像、姓名、评分、总单数)
- 📊 展示今日配送数据(完成单数、收入、里程、准时率)
- 📈 收入统计图表最近7天
- 🚗 功能菜单:收入明细、车辆管理、评价记录、帮助中心、意见反馈
---
### 3. `profile-edit.uvue` —— **编辑个人信息**
- 🖋️ 修改头像、姓名、身份证号、驾驶证、车辆信息、服务区域等
- 📱 界面包含表单输入 + 保存按钮
- ⬅️ 左上角返回按钮(箭头+文字垂直排列)
- 💾 数据本地模拟或调用API更新
---
### 4. `settings.uvue` —— **设置页面**
- ⚙️ 通用设置项(如通知、隐私、退出登录等)
- 🔐 安全相关设置(修改密码、绑定手机等)
- 📲 通常由 `profile.uvue` 中的“⚙️”图标进入
---
### 5. `tasks.uvue` —— **配送任务列表**
- 📋 按状态分类展示任务:
- 全部任务
- 待接单
- 配送中
- 已完成
- 🚀 点击任一任务 → 跳转至 `task-detail.uvue`
- 📈 页面顶部有“工作状态”切换开关(工作中/休息中)
---
### 6. `task-detail.uvue` —— **任务详情页**
- 📍 显示取货地址、送达地址、距离、预计时间
- 📞 “联系客户”按钮
- 📝 查看任务详情(可选)
- ✅ 适用于“当前任务”或“待接单”的操作场景
---
### 7. `order-history.uvue` —— **历史订单列表**
- 📜 展示已完成、已接受、配送中的历史订单
- 📌 包含订单号、状态、取送货地址、配送费、距离、时间
- 🔍 点击“查看详情” → 跳转至 `order-detail.uvue`,并携带参数 `?from=history`
- 📅 支持查看“已完成”的订单(仅显示“联系客服”按钮)
---
### 8. `order-detail.uvue` —— **订单详情页(多来源)**
- 🔄 从 `tasks.uvue``order-history.uvue` 进入
- 🎯 **关键逻辑**
- 若来自历史订单(`from=history`)且状态为“已完成” → 只显示“联系客服”
- 若来自历史订单且状态为“进行中” → 显示“接受/拒绝/导航/完成”等操作按钮
- 若非历史来源 → 显示完整操作按钮
- 📞 包含联系顾客、联系商家、联系客服三个联系方式
---
### 9. `earnings.uvue` —— **收入明细**
- 💰 展示总收入、用户打赏、商家打赏、总订单数
- 📊 按订单聚合的收入数据列表
- 📈 图表展示最近7天收入趋势
- 加载更多按钮
---
### 10. `ratings.uvue` —— **评价记录**
- ⭐ 展示用户对配送员的评价
- 📝 包含评分、评价内容、订单号、时间
- 📊 统计平均分、好评率等
---
### 11. `vehicle.uvue` —— **车辆管理主页**
- 🚗 列出当前绑定的所有车辆
- “添加车辆”按钮
- 🖋️ 点击车辆 → 跳转至 `vehicle-edit.uvue`
- 🗑️ 支持删除、设为主用车等操作
---
### 12. `vehicle-add.uvue` —— **添加车辆**
- 📝 表单填写:车牌号、车型、行驶证照片、车辆类型等
- ✅ 提交后绑定到当前账户
- ⬅️ 返回车辆管理页
---
### 13. `vehicle-edit.uvue` —— **编辑车辆信息**
- 🖋️ 修改已有车辆信息(车牌、车型、照片等)
- 📸 支持重新上传行驶证照片
- ✅ 保存后更新车辆信息
---
## 🔄 页面跳转关系图(简化版)
```
index.uvue
├──→ profile.uvue → profile-edit.uvue
├──→ tasks.uvue → task-detail.uvue
├──→ order-history.uvue → order-detail.uvue (from=history)
├──→ earnings.uvue
├──→ ratings.uvue
└──→ vehicle.uvue → vehicle-add.uvue / vehicle-edit.uvue
```
---
## 🎯 设计原则
-**一致性**:所有页面使用相同导航栏样式(左上角返回按钮 + 居中标题)
-**响应式**:适配 H5、APP、小程序等平台
-**状态驱动**:根据订单状态动态显示不同操作按钮
-**用户体验优先**:历史订单跳转后只显示必要操作,避免冗余按钮
---
## 📌 建议优化点
| 问题 | 建议 |
|------|------|
| 页面间参数传递 | 使用 `uni.navigateTo({ url: '?param=value' })` 并在 `onLoad` 中接收 |
| UTS 语法兼容性 | 如遇问题,可临时改用标准 TS 语法调试 |
---
## ✅ 总结
这个 `delivery` 模块是一个完整的配送员工作系统,涵盖了:
- **个人管理**(资料、设置)
- **任务处理**(接单、配送、完成)
- **数据统计**(收入、评价、历史)
- **车辆管理**
结构清晰、功能完整,适合用于实际配送平台开发。
---