以下是一个基于 ThinkPHP(TP)后端 + uni-app 跨平台前端 的预约咨询小程序完整源码实现思路和框架分享。由于完整源码较长,这里提供核心功能模块的实现思路和代码示例,供开发者参考和扩展。
一、项目功能概述
- 用户端:
- 用户注册/登录(手机号+验证码登录)。
- 查看咨询师列表。
- 预约咨询(选择时间、填写问题描述)。
- 查看预约记录。
- 取消预约。
- 咨询师端:
- 查看预约订单。
- 确认/拒绝预约。
- 管理自己的空闲时间。
- 管理员端:
- 管理用户、咨询师信息。
- 查看预约统计数据。
二、技术栈
- 后端:ThinkPHP 6.0(RESTful API)。
- 前端:uni-app(支持小程序、H5、App多端)。
- 数据库:MySQL。
- 其他:JWT 用于用户认证,Redis 用于缓存。
三、核心模块实现
1. 数据库设计
用户表(users):
字段名 | 类型 | 描述 |
---|---|---|
id | int | 用户ID |
phone | varchar(20) | 手机号 |
password | varchar(64) | 密码(加密) |
role | tinyint | 角色(1-用户,2-咨询师,3-管理员) |
咨询师表(counselors):
字段名 | 类型 | 描述 |
---|---|---|
id | int | 咨询师ID |
user_id | int | 关联用户ID |
name | varchar(50) | 咨询师姓名 |
description | text | 简介 |
预约表(appointments):
字段名 | 类型 | 描述 |
---|---|---|
id | int | 预约ID |
user_id | int | 用户ID |
counselor_id | int | 咨询师ID |
time | datetime | 预约时间 |
status | tinyint | 状态(0-待确认,1-已确认,2-已取消) |
2. 后端实现(ThinkPHP)
(1)用户登录接口
php
<?php | |
namespace app\api\controller; | |
use think\facade\Db; | |
use think\facade\Request; | |
use think\facade\Jwt; | |
class Auth | |
{ | |
public function login() | |
{ | |
$phone = Request::post('phone'); | |
$code = Request::post('code'); // 假设验证码已验证 | |
// 查询用户 | |
$user = Db::name('users')->where('phone', $phone)->find(); | |
if (!$user) { | |
// 注册新用户 | |
$userId = Db::name('users')->insertGetId([ | |
'phone' => $phone, | |
'password' => '', // 小程序端通常不存储密码 | |
'role' => 1, // 默认用户角色 | |
'create_time' => date('Y-m-d H:i:s') | |
]); | |
$user = Db::name('users')->find($userId); | |
} | |
// 生成JWT Token | |
$token = Jwt::build(['user_id' => $user['id'], 'role' => $user['role']]); | |
return json(['token' => $token]); | |
} | |
} |
(2)预约接口
php
public function createAppointment() | |
{ | |
$data = Request::post(); | |
$userId = Request::header('Authorization'); // 从JWT中解析用户ID | |
// 插入预约记录 | |
Db::name('appointments')->insert([ | |
'user_id' => $userId, | |
'counselor_id' => $data['counselor_id'], | |
'time' => $data['time'], | |
'status' => 0, // 待确认 | |
'create_time' => date('Y-m-d H:i:s') | |
]); | |
return json(['message' => '预约成功']); | |
} |
3. 前端实现(uni-app)
(1)登录页面
html
<template> | |
<view> | |
<input v-model="phone" placeholder="请输入手机号" /> | |
<input v-model="code" placeholder="请输入验证码" /> | |
<button @click="login">登录</button> | |
</view> | |
</template> | |
<script> | |
export default { | |
data() { | |
return { | |
phone: '', | |
code: '' | |
}; | |
}, | |
methods: { | |
async login() { | |
const res = await uni.request({ | |
url: 'https://your-api.com/api/auth/login', | |
method: 'POST', | |
data: { phone: this.phone, code: this.code } | |
}); | |
if (res.statusCode === 200) { | |
uni.setStorageSync('token', res.data.token); | |
uni.showToast({ title: '登录成功' }); | |
} | |
} | |
} | |
}; | |
</script> |
(2)预约页面
html
<template> | |
<view> | |
<picker mode="date" @change="onDateChange"> | |
<view>选择日期:{{ selectedDate }}</view> | |
</picker> | |
<button @click="createAppointment">提交预约</button> | |
</view> | |
</template> | |
<script> | |
export default { | |
data() { | |
return { | |
selectedDate: '', | |
counselorId: 1 // 假设当前咨询师ID为1 | |
}; | |
}, | |
methods: { | |
onDateChange(e) { | |
this.selectedDate = e.detail.value; | |
}, | |
async createAppointment() { | |
const token = uni.getStorageSync('token'); | |
const res = await uni.request({ | |
url: 'https://your-api.com/api/appointments', | |
method: 'POST', | |
header: { Authorization: token }, | |
data: { counselor_id: this.counselorId, time: this.selectedDate } | |
}); | |
if (res.statusCode === 200) { | |
uni.showToast({ title: '预约成功' }); | |
} | |
} | |
} | |
}; | |
</script> |
四、部署与优化
- 后端部署:
- 使用 Nginx + PHP-FPM 部署 ThinkPHP 项目。
- 配置 JWT 密钥和 Redis 缓存。
- 前端优化:
- 使用 uni-app 的分包加载功能,减少首屏加载时间。
- 图片资源使用 CDN 加速。
- 安全性:
- 使用 HTTPS 加密传输。
- 对用户输入进行严格验证,防止 SQL 注入和 XSS 攻击。
五、总结
以上是一个完整的预约咨询小程序的技术实现思路,涵盖了后端接口设计、数据库设计、前端页面开发等核心内容。实际开发中,可以根据业务需求进一步扩展功能,例如:
- 添加支付功能(支持在线支付预约费用)。
- 添加消息通知(预约成功/取消提醒)。
- 添加评价系统(用户对咨询师进行评价)。
如果需要完整的源码,可以参考开源项目或联系开发团队进行定制开发。