Laravel 11与UniApp实战:构建高性能电商API与移动端交互系统

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的跨平台能力,能够快速构建高性能、可扩展的电商应用。

在实际开发中,需要注意以下几点:

  1. 代码规范:遵循PSR标准,保持代码整洁可维护

  2. 测试驱动:编写单元测试和功能测试,确保代码质量

  3. 持续集成:使用CI/CD工具自动化部署流程

  4. 监控告警:监控系统性能,及时发现并解决问题

随着技术的不断发展,Laravel框架也在持续演进,未来可以关注以下方向:

  • 微服务架构:将系统拆分为更小的服务单元,提升可扩展性

  • Serverless部署:使用无服务器架构降低运维成本

  • AI集成:集成推荐算法、智能客服等AI能力

  • 区块链应用:探索去中心化电商模式

通过本文的学习,相信你已经掌握了使用Laravel 11和UniApp构建电商系统的核心技能。在实际项目中,还需要根据具体业务需求进行定制开发,不断优化系统性能和用户体验,打造出真正优秀的电商平台。

相关推荐
catchadmin3 天前
用 LaraDumps 高效调试 PHP 和 Laravel
php·laravel
JaguarJack4 天前
Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展
后端·laravel
BingoGo5 天前
深入理解 Laravel Middleware:完整指南
后端·laravel
JaguarJack6 天前
深入理解 Laravel Middleware:完整指南
后端·php·laravel
JaguarJack7 天前
15 个 Eloquent 高级技巧,瞬间提升你的 Laravel 应用性能
后端·php·laravel
JaguarJack7 天前
从零开始打造 Laravel 扩展包:开发、测试到发布完整指南
后端·php·laravel
wendyNo15 天前
Laravel 结合影刀 RPA 实现企业微信自动询单报价流程
企业微信·laravel·rpa
2501_9387912215 天前
PHP Laravel 10 框架:使用队列处理异步任务(邮件发送 / 数据导出)
android·php·laravel
JaguarJack17 天前
Laravel 新项目避坑指南10 大基础设置让代码半年不崩
后端·php·laravel