Laravel 11与UniApp实战:构建高性能电商API与移动端交互系统
一、场景背景与市场分析
1.1 移动电商发展趋势
2025年,移动互联网已进入深度发展阶段,移动端购物已成为主流消费方式。根据市场调研数据,中国移动电商市场规模预计将达到XX万亿元 ,移动端交易占比超过85% 。在这样的市场环境下,企业需要快速搭建既能满足后端管理需求,又能提供优质移动端用户体验的电商系统。
1.2 技术选型优势
Laravel 11作为PHP生态中最受欢迎的现代化框架,在2025年持续保持领先地位。其最新版本基于PHP 8.2+重构,在性能、安全性、开发效率等方面都有显著提升。Laravel 11引入了极简应用结构、改进的HTTP客户端、优化查询生成器等新特性,特别适合构建高性能API服务。
UniApp作为跨平台开发框架,支持一套代码编译到iOS、Android、H5等多个平台,极大降低了移动端开发成本。结合Laravel 11构建的RESTful API,可以实现前后端完全分离,提升开发效率和系统可维护性。
二、系统架构设计
2.1 整体架构
基于Laravel 11和UniApp的电商系统采用前后端分离架构,将系统划分为以下层次:
-
• 后端API层:Laravel 11构建的RESTful API服务,提供用户认证、商品管理、订单处理等核心功能
-
• 前端应用层:UniApp构建的跨平台移动应用,负责用户界面展示和交互
-
• 数据存储层:MySQL数据库存储业务数据,Redis用于缓存和会话管理
-
• 第三方服务:支付网关、短信服务、物流查询等第三方API集成
2.2 技术栈选型
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | Laravel 11 | 现代化PHP框架,提供优雅的API开发体验 |
| 前端框架 | UniApp + Vue.js | 跨平台开发,一套代码多端运行 |
| 数据库 | MySQL 8.0+ | 关系型数据库,支持事务和复杂查询 |
| 缓存 | Redis | 内存数据库,用于缓存和会话管理 |
| 认证方式 | JWT Token | 无状态认证,适合API场景 |
| 部署环境 | Docker + Nginx | 容器化部署,便于扩展和维护 |
三、核心模块设计与实现
3.1 用户认证模块
Laravel 11提供了完善的认证系统,结合JWT Token实现无状态认证:
php
// 安装JWT认证包
composer require tymon/jwt-auth
// 配置JWT密钥
php artisan jwt:secret
// 用户模型配置
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
// 获取JWT标识
public function getJWTIdentifier()
{
return $this->getKey();
}
// 自定义JWT声明
public function getJWTCustomClaims()
{
return [];
}
}
登录接口实现:
php
namespace App\Http\Controllers\Api;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => config('jwt.ttl') * 60
]);
}
}
3.2 商品管理模块
商品模块是电商系统的核心,需要处理商品分类、SKU管理、库存控制等复杂业务:
php
namespace App\Http\Controllers\Api;
use App\Models\Product;
use App\Http\Resources\ProductResource;
use Illuminate\Http\Request;
class ProductController extends Controller
{
// 商品列表接口
public function index(Request $request)
{
$query = Product::with(['category', 'skus'])
->where('status', 1);
// 分类筛选
if ($request->has('category_id')) {
$query->where('category_id', $request->category_id);
}
// 关键词搜索
if ($request->has('keyword')) {
$query->where('name', 'like', "%{$request->keyword}%");
}
// 价格排序
if ($request->has('sort')) {
$query->orderBy('price', $request->sort);
}
$products = $query->paginate(20);
return ProductResource::collection($products);
}
// 商品详情接口
public function show($id)
{
$product = Product::with(['category', 'skus', 'attributes'])
->findOrFail($id);
return new ProductResource($product);
}
}
API资源格式化:
kotlin
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'price' => $this->price,
'stock' => $this->stock,
'images' => $this->images,
'description' => $this->description,
'category' => new CategoryResource($this->whenLoaded('category')),
'skus' => SkuResource::collection($this->whenLoaded('skus')),
'created_at' => $this->created_at->toDateTimeString(),
'updated_at' => $this->updated_at->toDateTimeString(),
];
}
}
3.3 购物车模块
购物车模块需要处理商品添加、数量修改、价格计算等业务:
php
namespace App\Http\Controllers\Api;
use App\Models\Cart;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class CartController extends Controller
{
// 获取购物车列表
public function index()
{
$carts = Cart::with('product')
->where('user_id', Auth::id())
->get();
return response()->json([
'data' => $carts,
'total_amount' => $this->calculateTotalAmount($carts)
]);
}
// 添加商品到购物车
public function store(Request $request)
{
$request->validate([
'product_id' => 'required|exists:products,id',
'quantity' => 'required|integer|min:1'
]);
$product = Product::find($request->product_id);
// 检查库存
if ($product->stock < $request->quantity) {
return response()->json(['error' => '库存不足'], 400);
}
// 检查购物车是否已存在该商品
$cart = Cart::where('user_id', Auth::id())
->where('product_id', $request->product_id)
->first();
if ($cart) {
$cart->quantity += $request->quantity;
$cart->save();
} else {
Cart::create([
'user_id' => Auth::id(),
'product_id' => $request->product_id,
'quantity' => $request->quantity,
'price' => $product->price
]);
}
return response()->json(['message' => '添加成功']);
}
// 计算购物车总金额
private function calculateTotalAmount($carts)
{
return $carts->sum(function ($cart) {
return $cart->quantity * $cart->price;
});
}
}
3.4 订单模块
订单模块是电商系统的核心,涉及订单创建、支付、状态流转等复杂流程:
php
namespace App\Http\Controllers\Api;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\Cart;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
class OrderController extends Controller
{
// 创建订单
public function store(Request $request)
{
DB::beginTransaction();
try {
$carts = Cart::with('product')
->where('user_id', Auth::id())
->get();
if ($carts->isEmpty()) {
return response()->json(['error' => '购物车为空'], 400);
}
// 计算订单总金额
$totalAmount = $this->calculateTotalAmount($carts);
// 创建订单
$order = Order::create([
'user_id' => Auth::id(),
'order_no' => $this->generateOrderNo(),
'total_amount' => $totalAmount,
'status' => Order::STATUS_PENDING,
'address' => $request->address,
'consignee' => $request->consignee,
'phone' => $request->phone
]);
// 创建订单商品
foreach ($carts as $cart) {
OrderItem::create([
'order_id' => $order->id,
'product_id' => $cart->product_id,
'product_name' => $cart->product->name,
'product_image' => $cart->product->image,
'price' => $cart->price,
'quantity' => $cart->quantity,
'total_amount' => $cart->price * $cart->quantity
]);
// 扣减库存
$product = Product::find($cart->product_id);
$product->decrement('stock', $cart->quantity);
}
// 清空购物车
Cart::where('user_id', Auth::id())->delete();
DB::commit();
return response()->json([
'message' => '订单创建成功',
'data' => $order
]);
} catch (\Exception $e) {
DB::rollBack();
return response()->json(['error' => '订单创建失败'], 500);
}
}
// 生成订单号
private function generateOrderNo()
{
return date('YmdHis') . rand(1000, 9999);
}
}
四、接口设计与调用
4.1 RESTful API设计规范
Laravel 11提供了优雅的API开发体验,遵循RESTful设计原则:
rust
// routes/api.php
Route::prefix('api')->group(function () {
// 用户认证
Route::post('login', [AuthController::class, 'login']);
Route::post('register', [AuthController::class, 'register']);
// 需要认证的路由
Route::middleware('auth:api')->group(function () {
Route::get('user', [UserController::class, 'info']);
Route::put('user', [UserController::class, 'update']);
// 商品相关
Route::get('products', [ProductController::class, 'index']);
Route::get('products/{id}', [ProductController::class, 'show']);
// 购物车
Route::get('cart', [CartController::class, 'index']);
Route::post('cart', [CartController::class, 'store']);
Route::put('cart/{id}', [CartController::class, 'update']);
Route::delete('cart/{id}', [CartController::class, 'destroy']);
// 订单
Route::get('orders', [OrderController::class, 'index']);
Route::get('orders/{id}', [OrderController::class, 'show']);
Route::post('orders', [OrderController::class, 'store']);
Route::post('orders/{id}/pay', [OrderController::class, 'pay']);
});
});
4.2 接口认证与授权
Laravel 11的JWT认证中间件配置:
php
// app/Http/Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.api' => \Tymon\JWTAuth\Http\Middleware\Authenticate::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\AuthorizeGate::class,
'guest' => \Illuminate\Auth\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
4.3 数据验证与错误处理
Laravel 11提供了强大的表单请求验证:
php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CreateOrderRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'address' => 'required|string|max:255',
'consignee' => 'required|string|max:50',
'phone' => 'required|string|regex:/^1[3-9]\d{9}$/',
'items' => 'required|array',
'items.*.product_id' => 'required|exists:products,id',
'items.*.quantity' => 'required|integer|min:1'
];
}
public function messages()
{
return [
'address.required' => '收货地址不能为空',
'consignee.required' => '收货人不能为空',
'phone.required' => '手机号不能为空',
'phone.regex' => '手机号格式不正确',
];
}
}
五、UniApp前端调用示例
5.1 环境配置与请求封装
在UniApp中配置API请求基础配置:
javascript
// utils/request.js
import { getToken } from './auth'
const BASE_URL = 'https://api.yourdomain.com/api'
const request = (options) => {
return new Promise((resolve, reject) => {
uni.request({
url: BASE_URL + options.url,
method: options.method || 'GET',
data: options.data || {},
header: {
'Content-Type': 'application/json',
'Authorization': getToken() ? `Bearer ${getToken()}` : ''
},
success: (res) => {
if (res.statusCode === 200) {
resolve(res.data)
} else {
reject(res)
}
},
fail: (err) => {
reject(err)
}
})
})
}
export default request
5.2 用户认证调用
javascript
// services/auth.js
import request from '../utils/request'
export const login = (data) => {
return request({
url: '/login',
method: 'POST',
data
})
}
export const getUserInfo = () => {
return request({
url: '/user',
method: 'GET'
})
}
5.3 商品列表调用
javascript
// services/product.js
import request from '../utils/request'
export const getProducts = (params = {}) => {
return request({
url: '/products',
method: 'GET',
data: params
})
}
export const getProductDetail = (id) => {
return request({
url: `/products/${id}`,
method: 'GET'
})
}
5.4 购物车操作
javascript
// services/cart.js
import request from '../utils/request'
export const getCartList = () => {
return request({
url: '/cart',
method: 'GET'
})
}
export const addToCart = (data) => {
return request({
url: '/cart',
method: 'POST',
data
})
}
export const updateCart = (id, data) => {
return request({
url: `/cart/${id}`,
method: 'PUT',
data
})
}
export const removeFromCart = (id) => {
return request({
url: `/cart/${id}`,
method: 'DELETE'
})
}
5.5 订单管理
javascript
// services/order.js
import request from '../utils/request'
export const createOrder = (data) => {
return request({
url: '/orders',
method: 'POST',
data
})
}
export const getOrderList = (params = {}) => {
return request({
url: '/orders',
method: 'GET',
data: params
})
}
export const getOrderDetail = (id) => {
return request({
url: `/orders/${id}`,
method: 'GET'
})
}
export const payOrder = (id) => {
return request({
url: `/orders/${id}/pay`,
method: 'POST'
})
}
六、性能优化策略
6.1 数据库优化
索引优化:为常用查询字段添加索引,提升查询性能:
go
-- 商品表索引
ALTER TABLE `products` ADD INDEX `idx_category_status` (`category_id`, `status`);
ALTER TABLE `products` ADD INDEX `idx_name` (`name`);
ALTER TABLE `products` ADD INDEX `idx_price` (`price`);
-- 订单表索引
ALTER TABLE `orders` ADD INDEX `idx_user_status` (`user_id`, `status`);
ALTER TABLE `orders` ADD INDEX `idx_created_at` (`created_at`);
-- 购物车表索引
ALTER TABLE `carts` ADD INDEX `idx_user_product` (`user_id`, `product_id`);
查询优化:避免N+1查询问题,使用with预加载关联数据:
php
// 优化前:N+1查询
$orders = Order::all();
foreach ($orders as $order) {
echo $order->user->name; // 每次循环都会查询数据库
}
// 优化后:预加载关联数据
$orders = Order::with('user', 'items.product')->get();
6.2 缓存策略
Laravel 11提供了强大的缓存机制,支持多种缓存驱动:
ini
// 配置缓存驱动为Redis
CACHE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
// 商品详情缓存
public function show($id)
{
$cacheKey = 'product:' . $id;
$product = Cache::remember($cacheKey, 3600, function () use ($id) {
return Product::with(['category', 'skus', 'attributes'])
->findOrFail($id);
});
return new ProductResource($product);
}
// 商品列表缓存
public function index(Request $request)
{
$cacheKey = 'products:' . md5(json_encode($request->all()));
$products = Cache::remember($cacheKey, 300, function () use ($request) {
$query = Product::with('category')
->where('status', 1);
// 查询条件...
return $query->paginate(20);
});
return ProductResource::collection($products);
}
6.3 队列处理
对于耗时操作,如发送邮件、生成报表等,使用队列异步处理:
php
// 配置队列驱动为Redis
QUEUE_CONNECTION=redis
// 创建队列任务
php artisan make:job SendOrderEmail
// 发送订单邮件任务
namespace App\Jobs;
use App\Models\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
class SendOrderEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $order;
public function __construct(Order $order)
{
$this->order = $order;
}
public function handle()
{
Mail::to($this->order->user->email)
->send(new OrderCreated($this->order));
}
}
// 在控制器中分发任务
public function store(Request $request)
{
// 创建订单...
SendOrderEmail::dispatch($order);
return response()->json(['message' => '订单创建成功']);
}
七、安全防护措施
7.1 输入验证与过滤
Laravel 11内置了强大的验证机制,防止SQL注入和XSS攻击:
php
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:8',
'phone' => 'required|string|regex:/^1[3-9]\d{9}$/',
'avatar' => 'nullable|image|max:2048'
]);
// 安全处理输入数据
$user = User::create([
'name' => htmlspecialchars($validated['name']),
'email' => $validated['email'],
'password' => Hash::make($validated['password']),
'phone' => $validated['phone']
]);
return response()->json($user);
}
7.2 速率限制
防止API滥用,配置速率限制:
php
// 在路由中配置速率限制
Route::middleware(['auth:api', 'throttle:60,1'])->group(function () {
Route::get('profile', [UserController::class, 'profile']);
Route::put('profile', [UserController::class, 'update']);
});
// 在控制器方法中自定义速率限制
public function login(Request $request)
{
$this->middleware('throttle:5,1')->only('login');
// 登录逻辑...
}
7.3 CSRF防护
虽然API通常不需要CSRF Token,但对于某些操作仍需保护:
php
// 在VerifyCsrfToken中间件中排除API路由
protected $except = [
'api/*'
];
// 对于需要CSRF保护的操作
public function update(Request $request)
{
$request->validate([
'_token' => 'required'
]);
// 更新逻辑...
}
八、部署与运维
8.1 生产环境配置
Laravel 11的生产环境配置:
ini
# 生成应用密钥
php artisan key:generate
# 配置环境变量
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:...
# 配置数据库连接
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password
# 配置缓存
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
8.2 性能优化命令
perl
# 生成配置缓存
php artisan config:cache
# 生成路由缓存
php artisan route:cache
# 生成视图缓存
php artisan view:cache
# 优化自动加载
composer dump-autoload --optimize
# 运行数据库迁移
php artisan migrate --force
8.3 监控与日志
配置日志记录和错误监控:
php
// 记录API请求日志
public function handle(Request $request, Closure $next)
{
$start = microtime(true);
$response = $next($request);
$duration = microtime(true) - $start;
Log::info('API Request', [
'method' => $request->method(),
'url' => $request->fullUrl(),
'ip' => $request->ip(),
'duration' => $duration,
'status' => $response->getStatusCode()
]);
return $response;
}
九、总结与展望
Laravel 11与UniApp的结合为电商系统开发提供了完整的解决方案。Laravel 11的现代化特性和强大生态,配合UniApp的跨平台能力,能够快速构建高性能、可扩展的电商应用。
在实际开发中,需要注意以下几点:
-
代码规范:遵循PSR标准,保持代码整洁可维护
-
测试驱动:编写单元测试和功能测试,确保代码质量
-
持续集成:使用CI/CD工具自动化部署流程
-
监控告警:监控系统性能,及时发现并解决问题
随着技术的不断发展,Laravel框架也在持续演进,未来可以关注以下方向:
-
• 微服务架构:将系统拆分为更小的服务单元,提升可扩展性
-
• Serverless部署:使用无服务器架构降低运维成本
-
• AI集成:集成推荐算法、智能客服等AI能力
-
• 区块链应用:探索去中心化电商模式
通过本文的学习,相信你已经掌握了使用Laravel 11和UniApp构建电商系统的核心技能。在实际项目中,还需要根据具体业务需求进行定制开发,不断优化系统性能和用户体验,打造出真正优秀的电商平台。