ThinkPHP Framework与Element UI:前后端分离开发实践

ThinkPHP Framework与Element UI:前后端分离开发实践

【免费下载链接】think ThinkPHP Framework ——十年匠心的高性能PHP框架 【免费下载链接】think 项目地址: https://gitcode.com/gh_mirrors/th/think

你是否在前后端分离开发中遇到过接口对接混乱、数据交互复杂的问题?本文将以ThinkPHP Framework(高性能PHP框架)与Element UI(Vue 2.x组件库)为例,通过实际案例展示如何快速搭建规范的前后端分离架构,解决跨域请求、数据验证、组件复用等核心痛点。读完本文你将掌握:环境配置三步骤、RESTful接口设计规范、Element UI表单与ThinkPHP验证联动方案、以及权限控制最佳实践。

环境准备:从框架搭建到跨域配置

ThinkPHP后端环境搭建

ThinkPHP 8.0要求PHP版本≥8.0.0,通过Composer快速创建项目:

composer create-project topthink/think=8.0.* myproject
cd myproject
php think run

项目核心目录结构如下:

修改config/cors.php开启跨域支持(若文件不存在需创建):

return [
    'origin'           => ['*'],
    'allow_credentials' => true,
    'allow_methods'    => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
    'allow_headers'    => ['Content-Type', 'Authorization'],
    'expose_headers'   => [],
    'max_age'          => 3600,
];

Element UI前端环境配置

使用Vue CLI创建前端项目并集成Element UI:

vue create frontend
cd frontend
npm i element-ui -S

在main.js中引入Element UI:

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'

Vue.use(ElementUI)
new Vue({
  el: '#app',
  render: h => h(App)
})

数据交互:RESTful接口设计与实现

ThinkPHP RESTful控制器开发

创建用户管理控制器app/controller/User.php:

<?php
namespace app\controller;

use app\BaseController;
use app\Request;
use think\facade\Db;

class User extends BaseController
{
    // 获取用户列表
    public function index()
    {
        $users = Db::name('user')->select();
        return json(['code' => 200, 'data' => $users]);
    }

    // 创建用户
    public function save(Request $request)
    {
        $data = $request->validate([
            'username' => 'require|length:3,20',
            'email'    => 'require|email'
        ]);
        if (true !== $data) {
            return json(['code' => 400, 'msg' => $data]);
        }
        $id = Db::name('user')->insertGetId($data);
        return json(['code' => 201, 'data' => ['id' => $id]]);
    }
}

配置路由route/app.php

use think\facade\Route;

Route::group('api', function () {
    Route::resource('user', 'User');
})->allowCrossDomain();

Element UI数据表格组件集成

创建UserList.vue组件,实现用户数据展示与分页:

<template>
  <el-table :data="userList" style="width: 100%">
    <el-table-column prop="id" label="ID" width="80"></el-table-column>
    <el-table-column prop="username" label="用户名"></el-table-column>
    <el-table-column prop="email" label="邮箱"></el-table-column>
    <el-table-column label="操作" width="180">
      <template slot-scope="scope">
        <el-button size="small" @click="handleEdit(scope.row)">编辑</el-button>
        <el-button size="small" type="danger" @click="handleDelete(scope.row.id)">删除</el-button>
      </template>
    </el-table-column>
  </el-table>
  <el-pagination 
    @current-change="handleCurrentChange" 
    :current-page="currentPage" 
    :page-size="pageSize" 
    :total="total">
  </el-pagination>
</template>

<script>
export default {
  data() {
    return {
      userList: [],
      currentPage: 1,
      pageSize: 10,
      total: 0
    };
  },
  mounted() {
    this.loadUserList();
  },
  methods: {
    loadUserList() {
      this.$http.get('/api/user?page='+this.currentPage+'&limit='+this.pageSize)
        .then(res => {
          this.userList = res.data.data;
          this.total = res.data.total;
        });
    },
    handleCurrentChange(page) {
      this.currentPage = page;
      this.loadUserList();
    }
  }
};
</script>

表单验证:前后端联动方案

ThinkPHP后端验证规则

在app/request/UserRequest.php中定义验证规则:

<?php
namespace app\request;

use think\Request;

class UserRequest extends Request
{
    protected $rule = [
        'username' => 'require|alphaDash|length:3,20|unique:user',
        'email'    => 'require|email|unique:user',
        'password' => 'require|password|length:6,20'
    ];
    
    protected $message = [
        'username.require' => '用户名不能为空',
        'email.email'      => '邮箱格式不正确'
    ];
}

Element UI表单验证集成

使用Element UI的el-form组件实现前端验证,与后端规则保持一致:

<el-form :model="userForm" :rules="rules" ref="userForm">
  <el-form-item label="用户名" prop="username">
    <el-input v-model="userForm.username"></el-input>
  </el-form-item>
  <el-form-item label="邮箱" prop="email">
    <el-input v-model="userForm.email" type="email"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm">提交</el-button>
  </el-form-item>
</el-form>

<script>
export default {
  data() {
    return {
      userForm: { username: '', email: '' },
      rules: {
        username: [
          { required: true, message: '用户名不能为空', trigger: 'blur' },
          { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }
        ],
        email: [
          { type: 'email', message: '请输入正确的邮箱格式', trigger: ['blur', 'change'] }
        ]
      }
    };
  },
  methods: {
    submitForm() {
      this.$refs.userForm.validate(valid => {
        if (valid) {
          this.$http.post('/api/user', this.userForm)
            .then(res => {
              this.$message.success('创建成功');
            });
        }
      });
    }
  }
};
</script>

权限控制:JWT认证与Element UI权限组件

ThinkPHP JWT集成

安装topthink/think-jwt扩展:

composer require topthink/think-jwt

创建认证控制器app/controller/Auth.php:

<?php
namespace app\controller;

use app\BaseController;
use think\facade\Jwt;
use app\model\User;

class Auth extends BaseController
{
    public function login()
    {
        $username = input('username');
        $password = input('password');
        $user = User::where('username', $username)->find();
        
        if (!$user || !password_verify($password, $user->password)) {
            return json(['code' => 401, 'msg' => '账号或密码错误']);
        }
        
        $token = Jwt::token(['id' => $user->id, 'username' => $user->username])
                    ->expires(time() + 3600)
                    ->sign('secret_key');
                    
        return json(['code' => 200, 'token' => $token]);
    }
}

Element UI权限控制实现

使用Element UI的el-menu和自定义指令实现基于角色的菜单权限控制:

<el-menu :default-active="activeIndex">
  <el-menu-item index="1" v-permission="['admin']">用户管理</el-menu-item>
  <el-menu-item index="2" v-permission="['admin','editor']">内容管理</el-menu-item>
</el-menu>

<script>
// 注册权限指令
Vue.directive('permission', {
  inserted: function(el, binding) {
    const roles = localStorage.getItem('roles')?.split(',') || [];
    if (!roles.some(role => binding.value.includes(role))) {
      el.parentNode.removeChild(el);
    }
  }
});
</script>

项目实战:用户管理系统完整案例

系统架构图

mermaid

核心功能实现要点

  1. 数据分页:使用ThinkPHP的paginate方法结合Element UI的el-pagination
  2. 文件上传:通过app/controller/Upload.php处理文件上传,配合Element UI的el-upload组件
  3. 实时搜索:利用Element UI的el-input远程搜索功能,对接ThinkPHP的模糊查询接口

总结与最佳实践

本文通过ThinkPHP 8.0与Element UI的实战案例,展示了前后端分离开发的完整流程。关键要点包括:

  • 跨域配置必须同时设置Access-Control-Allow-Origin和withCredentials
  • 前后端验证规则保持一致,减少重复开发
  • 使用JWT进行无状态认证时,注意token过期处理
  • 权限控制应同时在路由层和UI层实现双重校验

项目源码可通过以下方式获取:

git clone https://gitcode.com/gh_mirrors/th/think

后续进阶方向:集成WebSocket实现实时通知、使用Vuex管理复杂状态、引入ELK栈进行日志分析。掌握这些技能将让你的前后端分离项目更具扩展性和可维护性。

【免费下载链接】think ThinkPHP Framework ——十年匠心的高性能PHP框架 【免费下载链接】think 项目地址: https://gitcode.com/gh_mirrors/th/think

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值