一、前言

  1. 前段时间,有读者建议我出一个 Lumen 项目示例。除了本文之外,整个系列还包含 Lumen实例讲解:第二部分 以及 Lumen实例讲解:第三部分
  2. 同样也要借此机会,介绍一下 Module(模块化) 的代码结构,针对本文,具体的目录层次如下:

    1. /app
    2. ....../Base # 定义基础类
    3. ....../Common # 定义常量、全局函数
    4. ....../Middlewares
    5. ....../Modules
    6. ....../....../Job # Job模块
    7. ....../....../Signature # Signature模块
    8. ....../....../Token # Token模块
    9. ....../....../Task # Task模块
    10. ....../....../User # User模块
    11. ....../Providers
    12. ............others............
    13. /bootstrap
    14. /config # 配置文件目录
    15. /database
    16. /routes
    17. ......others.......
  3. 文件树高清图:

Lumen实例讲解:第一部分 - 图1

二、说明

  1. 还没有书写注释和完整的业务逻辑,所以新手可能理解难度较高,后面在下会慢慢花时间讲解:如何基于 Lumen 开箱即用的队列,优雅地实现 定时任务系统
  2. 项目开发环境使用最新的 Lumen 5.8.x 以及 PHP 7.2.16 版本
  3. 想要快速上手,可以使用本人至今 ‘Windows’ 下正常开发使用的 整合压缩包

    三、开始

  4. 确定本地已经安装了 Composer 环境。并从 代码仓库 克隆了最新的代码

  5. 注意:git clone 完成后要执行 composer install 安装依赖
  6. 熟悉 Laravel 的读者应该会习惯使用 php artisan serve 指令快速启动服务,鉴于 Lumen 开箱地精简掉了许多 Artisan 指令,因此本人特意从 Laravel 中提取了 ServeCommand.php 作为 Lumen 项目的扩展,感兴趣的读者可以查看这个 packagist,当然,本文的项目已经默认包含了本扩展
  7. 具体实现的接口功能如下:

    • 添加定时任务接口

      1. HTTP/1.1 200 OK. POST {{base_url}}/api/task/add
      2. @请求头部
      3. Authorization = "de70b9e96776b15" # (普通管理员)客户端申请的短期Token
      4. Random-Seed = "fabcdefgsffhhklpoiu" # (普通管理员)客户端生成数据签名的随机字符串
      5. Signature = "a54ddf0ccc3f3bffab1f8e" # (普通管理员)客户端生成的数据签名
      6. @请求模板:
      7. {
      8. "callback_url": "http://127.0.0.1:8001",
      9. "callback_header": {
      10. "Content-Type": "application/json"
      11. },
      12. "callback_time": "2019-4-22 16:21:51",
      13. "task_title": "test task",
      14. "callback_body": {
      15. "course_id": 1,
      16. "lesson_id": 25
      17. }
      18. }
      19. @成功响应:
      20. {
      21. "status_code": 200,
      22. "data": {
      23. "task_uuid": "54ddf0cceecac4b3349c3f3bffab1f8e",
      24. "status": "待执行",
      25. "task_title": "test task",
      26. "created_at": "2019-04-30 11:18:20",
      27. "first_execute": "",
      28. "success_execute": "",
      29. "failure_execute": ""
      30. }
      31. }
    • 查询定时任务接口

      1. HTTP/1.1 200 OK. GET {{base_url}}/api/task/seed/{task_uuid}
      2. task_uuid = "54ddf0cceecac4b3349c3f3bffab1f8e"
      3. @请求头部
      4. Authorization = "de70b9b9bf5776b15" # 客户端申请的短期Token
      5. @成功响应:
      6. {
      7. "status_code": 200,
      8. "data": {
      9. "task_uuid": "54ddf0cceecac4b3349c3f3bffab1f8e",
      10. "status": "待执行",
      11. "task_title": "test task",
      12. "created_at": "2019-04-30 11:18:20",
      13. "first_execute": "",
      14. "success_execute": "",
      15. "failure_execute": ""
      16. }
      17. }
    • 定时任务列表接口

      1. HTTP/1.1 200 OK. GET {{base_url}}/api/task/all
      2. @请求头部
      3. Authorization = "de70b996776b15" # 客户端申请的短期Token
      4. @成功响应:
      5. {
      6. "status_code": 200,
      7. "data": {
      8. "pagination": {
      9. "total": 1,
      10. "count": 1,
      11. "per_page": 10,
      12. "current_page": 1,
      13. "last_page": 1
      14. },
      15. "data": [
      16. {
      17. "task_uuid": "de70b9b9bf5fb13ff6e96776839ceb15",
      18. "status": "待执行",
      19. "task_title": "test task",
      20. "created_at": "2019-04-30 10:54:27",
      21. "first_execute": "",
      22. "success_execute": "",
      23. "failure_execute": ""
      24. }
      25. ]
      26. }
      27. }
    • 删除定时任务接口

      1. HTTP/1.1 200 OK. GET {{base_url}}/api/task/del/{task_uuid}
      2. task_uuid = de70b9b9bf5fb13ff6e96776839ceb15
      3. @请求头部
      4. Authorization = "de70b96776b15" # (超级管理员)客户端申请的短期Token
      5. @成功响应:
      6. {
      7. "status_code": 200,
      8. "data": true
      9. }
    • 添加普通管理员接口

      1. HTTP/1.1 200 OK. POST {{base_url}}/api/user/add
      2. @请求头部
      3. Authorization = "de70b976b15" # (超级管理员)客户端申请的短期Token
      4. @请求模板:
      5. {
      6. "username": "test",
      7. "password": "123456",
      8. "email": "tynadam@qq.com"
      9. }
      10. @成功响应:
      11. {
      12. "status_code": 200,
      13. "data": {
      14. "user_id": 2,
      15. "username": "test",
      16. "email": "tynadam@qq.com",
      17. "role": "普通管理员",
      18. "permission": [
      19. "1.添加Task",
      20. "2.查看Task列表",
      21. "3.查询Task",
      22. "4.申请短期Token"
      23. ]
      24. }
      25. }
    • 查询管理员接口

      1. HTTP/1.1 200 OK. GET {{base_url}}/api/task/seek/{user_id}
      2. user_id = 2
      3. @请求头部
      4. Authorization = "de70b776b15" # (超级管理员)客户端申请的短期Token
      5. @成功响应:
      6. {
      7. "status_code": 200,
      8. "data": {
      9. "user_id": 2,
      10. "username": "test",
      11. "email": "tynadam@qq.com",
      12. "role": "普通管理员",
      13. "permission": [
      14. "1.添加Task",
      15. "2.查看Task列表",
      16. "3.查询Task",
      17. "4.申请短期Token"
      18. ]
      19. }
      20. }
    • 所有管理员列表接口

      1. HTTP/1.1 200 OK. GET {{base_url}}/api/user/all
      2. @请求头部
      3. Authorization = "de70b9b9bf6b15" # (超级管理员)客户端申请的短期Token
      4. @成功响应:
      5. {
      6. "status_code": 200,
      7. "data": {
      8. "pagination": {
      9. "total": 2,
      10. "count": 2,
      11. "per_page": 10,
      12. "current_page": 1,
      13. "last_page": 1
      14. },
      15. "data": [
      16. {
      17. "user_id": 1,
      18. "username": "AdamTyn",
      19. "email": "tynadam@foxmail.com",
      20. "role": "超级管理员",
      21. "permission": [
      22. "1.删除Task",
      23. "2.查看Task列表",
      24. "3.查询Task",
      25. "4.申请短期Token",
      26. "4.添加User",
      27. "6.查看User列表",
      28. "7.查询User",
      29. "8.删除User"
      30. ]
      31. },
      32. {
      33. "user_id": 2,
      34. "username": "test",
      35. "email": "tynadam@qq.com",
      36. "role": "普通管理员",
      37. "permission": [
      38. "1.添加Task",
      39. "2.查看Task列表",
      40. "3.查询Task",
      41. "4.申请短期Token"
      42. ]
      43. }
      44. ]
      45. }
      46. }
    • 删除普通管理员接口

      1. HTTP/1.1 200 OK. GET {{base_url}}/api/user/del/{user_id}
      2. user_id = 2
      3. @请求头部
      4. Authorization = "de70b9b76b15" # (超级管理员)客户端申请的短期Token
      5. @成功响应:
      6. {
      7. "status_code": 200,
      8. "data": true
      9. }
    • 获取短期Token接口

      1. HTTP/1.1 200 OK. GET {{base_url}}/api/auth/token
      2. @请求模板:
      3. {
      4. "username": "test",
      5. "password": "123456"
      6. }
      7. @成功响应:
      8. {
      9. "status_code": 200,
      10. "data": {
      11. "user_id": 1,
      12. "expired_at": "2019-05-04 18:27:17",
      13. "token": "1af50bd86c790755bc0a7f9f81f841fe"
      14. }
      15. }
  8. 完整功能的所有API列表:
    Lumen实例讲解:第一部分 - 图2

    四、结语

  9. 本教程面向新手,还有剩下的 Lumen实例讲解:第二部分 以及 Lumen实例讲解:第三部分 教程会在近期推出。

  10. 随着系统升级,软件更新,以后的配置可能有所变化,在下会第一时间测试并且更新教程;
  11. 欢迎联系在下,讨论建议都可以,之后会发布其它的教程。
  12. 后面紧锣密鼓地将会推出 Laravel业务篇 系列的教程,敬请期待。