本文档描述了 CRMEB 项目中 API 接口的完整开发流程,包括需求分析、设计、开发、测试、文档编写、上线发布和监控维护等阶段。本流程旨在规范 API 开发过程,提高 API 的质量和可维护性。
URL 设计: 设计符合 RESTful 规范的 URL
/api/v1/users 而不是 /api/v1/user/api/v1/orders 而不是 /api/v1/getOrders请求方法设计: 选择合适的 HTTP 请求方法
GET: 获取资源POST: 创建资源PUT: 更新资源DELETE: 删除资源PATCH: 部分更新资源参数设计: 设计请求参数
/api/v1/users/:id?page=1&limit=10响应设计: 设计统一的响应格式
app('json')->success() 返回成功响应app('json')->fail() 返回错误响应status、msg、data,错误响应额外包含 code 字段total、page、limit、list 字段认证方式: 选择合适的认证方式
授权设计: 设计 API 的访问权限
访问控制: 实现 API 的访问控制
error_code.md 文档中选择或申请合适的错误码示例代码:
// api/v1/route.php
use think\facade\Route;
// API 版本分组
Route::group('v1', function () {
// 用户相关路由
Route::group('users', function () {
Route::get('', 'User/index'); // 获取用户列表
Route::post('', 'User/save'); // 创建用户
Route::get(':id', 'User/read'); // 获取用户详情
Route::put(':id', 'User/update'); // 更新用户
Route::delete(':id', 'User/delete'); // 删除用户
})->middleware(['auth', 'permission']);
})->middleware(['cors', 'jwt']);
示例代码:
// app/api/controller/v1/User.php
namespace app\api\controller\v1;
use app\BaseController;
use app\validate\User as UserValidate;
use app\services\UserServices;
class User extends BaseController
{
protected $userServices;
public function __construct(UserServices $userServices)
{
$this->userServices = $userServices;
}
/**
* 获取用户列表
*/
public function index()
{
$params = $this->request->param();
$list = $this->userServices->getUserList($params);
return app('json')->success('获取用户列表成功', $list);
}
/**
* 创建用户
*/
public function save()
{
$data = $this->request->post();
// 参数验证
$this->validate($data, UserValidate::class);
// 业务逻辑
$result = $this->userServices->createUser($data);
// 返回响应
return app('json')->success('创建用户成功', $result);
}
/**
* 获取用户详情
*/
public function read($id)
{
$user = $this->userServices->getUserById($id);
if (!$user) {
return app('json')->fail(400005); // 用户不存在
}
return app('json')->success('获取用户详情成功', $user);
}
}
示例代码:
// app/validate/User.php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'username' => 'require|length:3,20|unique:user',
'password' => 'require|length:6,20',
'email' => 'email|unique:user',
'mobile' => 'mobile|unique:user',
'status' => 'in:0,1',
];
protected $message = [
'username.require' => 400033, // 请填写管理员账号
'username.length' => 400762, // 账号密码必须是在6到32位之间
'username.unique' => 400001, // 用户名已存在
'password.require' => 400020, // 密码必须填写
'password.length' => 400762, // 账号密码必须是在6到32位之间
'email.email' => 400003, // 邮箱已被注册
'email.unique' => 400003, // 邮箱已被注册
'mobile.mobile' => 400319, // 请输入正确的身份证
'mobile.unique' => 400002, // 手机号已被注册
'status.in' => 400751, // 状态必须是0-1之间的整数
];
}
示例代码:
// app/services/UserServices.php
namespace app\services;
use app\model\User;
use crmeb\basic\BaseServices;
class UserServices extends BaseServices
{
protected $userModel;
public function __construct(User $userModel)
{
$this->userModel = $userModel;
}
/**
* 获取用户列表
*/
public function getUserList(array $params)
{
$page = $params['page'] ?? 1;
$limit = $params['limit'] ?? 10;
$keyword = $params['keyword'] ?? '';
$query = $this->userModel->where('is_deleted', 0);
if ($keyword) {
$query->where('username|nickname|email|mobile', 'like', "%$keyword%");
}
$list = $query->page($page, $limit)->select();
$total = $query->count();
return [
'total' => $total,
'page' => $page,
'limit' => $limit,
'list' => $list
];
}
/**
* 创建用户
*/
public function createUser(array $data)
{
// 密码加密
$data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
$data['create_time'] = time();
$data['update_time'] = time();
return $this->userModel->save($data);
}
}
error_code.md 中定义的错误码app('json')->fail() 返回错误示例代码:
// 正确使用方式
return app('json')->fail(410025); // 账号或密码错误
// 不推荐的使用方式
return app('json')->fail('账号或密码错误');
// 使用错误码并传递额外数据
return app('json')->fail(400086, [], ['field' => 'username']);
// 异常处理
try {
// 业务逻辑
} catch (\Exception $e) {
// 记录日志
app('log')->error($e->getMessage());
// 返回错误
return app('json')->fail(500); // 系统错误
}
示例代码:
// tests/api/UserTest.php
namespace tests\api;
use think\testing\TestCase;
class UserTest extends TestCase
{
public function testIndex()
{
$response = $this->get('/api/v1/users');
$response->assertStatus(200);
$response->assertJsonStructure([
'status',
'msg',
'data' => [
'total',
'page',
'limit',
'list' => [
'*' => [
'id',
'username',
'nickname',
'email',
'mobile',
'status'
]
]
]
]);
}
public function testSave()
{
$data = [
'username' => 'testuser',
'password' => '123456',
'email' => 'test@example.com',
'mobile' => '13800138000',
'status' => 1
];
$response = $this->post('/api/v1/users', $data);
$response->assertStatus(200);
$response->assertJson(['status' => 200, 'msg' => '创建用户成功']);
}
}
error_code.md 文档中记录 API 使用的错误码