连接数据库并修改页面
This commit is contained in:
@@ -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 $$;
|
||||
@@ -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` 模块是一个完整的配送员工作系统,涵盖了:
|
||||
|
||||
- **个人管理**(资料、设置)
|
||||
- **任务处理**(接单、配送、完成)
|
||||
- **数据统计**(收入、评价、历史)
|
||||
- **车辆管理**
|
||||
|
||||
结构清晰、功能完整,适合用于实际配送平台开发。
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user