基于 Webman 的现代化、高性能后台管理系统脚手架
持续迭代优化的前后端分离中后台管理系统框架。重视每一处代码规范,重视每一种解决方案细节,持续提供舒适后端开发体验。
采用分层架构、模块化设计,提供完整的 RBAC 权限管理和 RESTful API
最近,我关注到一个名为 ContiNew Admin 的项目,它规范的设计和优雅的实现,让我对理想的开发实践有了更深的思考,但也遗憾它不是基于 PHP 开发的。
从业多年,我接触过形形色色的框架,却始终未能找到一款能完全契合我心中“艺术品”标准的。很多人认为“能用就行”,这固然有其道理,但我始终坚信,代码不仅是实现功能的工具,更应是值得雕琢的艺术品。
我看来,PHP 近年面临的挑战,并非语言本身问题,更多是市场环境与开发者生态的问题。如果每一位 PHP 开发者都能追求卓越,拥抱语言的新特性,编写出思想深邃、结构优雅的代码,我们完全有能力让 PHP 生态重焕生机,赢得市场的尊重。
现如今有Webman如此强大且易于上手的框架出世,这让我们有了更好的选择
正是基于这样的思考,我决定发起一个新项目。我们无需重复造轮子,但当缺少一个足够称心的轮子时,便可以亲手打造一个。
目前,项目尚处于基础脚手架阶段,但我计划持续投入,将其打磨完善。在此,我诚挚地邀请各位志同道合、时间充裕的伙伴加入,一同将它构建成我们理想中的模样。
如果你发现这个项目的架构设计有不合理、或不是你喜欢的、或者不是最佳实践方式,我希望你能提出宝贵的意见和建议。
- 基于 Webman: 高性能 HTTP 服务框架,支持高并发
- 异步非阻塞: 基于 Workerman 的事件驱动架构
- 内存常驻: 避免重复加载,大幅提升性能
- 分层架构: Controller → Service → Repository → Model 清晰分层
- 组合优于继承: 广泛使用 Trait 实现功能复用
- 约定大于配置: 统一的命名规范和开发约定
- JWT 认证: 基于 lcobucci/jwt 的无状态认证
- RBAC 权限: 用户-角色-菜单的完整权限体系
- 细粒度控制: 支持菜单级别的权限控制
- 快速开发: 通过 Trait 实现分钟级 CRUD 开发
- 代码复用: 公共组件高度抽象,易于扩展
- 规范统一: 完整的开发规范和代码注释
| 功能模块 | 描述 | 状态 |
|---|---|---|
| 🔐 用户认证 | JWT 登录/退出/刷新 | ✅ |
| 👥 用户管理 | 用户 CRUD、角色分配 | ✅ |
| 🎭 角色管理 | 角色 CRUD、权限分配 | ✅ |
| 📋 菜单管理 | 树形菜单、权限控制 | ✅ |
| 👤 个人中心 | 个人信息、密码修改 | ✅ |
| 🔒 权限控制 | 基于角色的访问控制 | ✅ |
| 📱 验证码 | 图片/短信验证码 | ✅ |
| 🌐 跨域支持 | CORS 中间件 | ✅ |
| 📝 API 文档 | 完整的接口文档 | ✅ |
- 框架: Webman 2.1+ (基于 Workerman)
- 语言: PHP 8.1+
- 数据库: MySQL 5.7+
- ORM: ThinkORM
- 认证: JWT (lcobucci/jwt)
- 验证码: webman/captcha
- 缓存: webman/cache
- 包管理: Composer
- 代码规范: PSR-4 自动加载
- 日志: Monolog
- 调试: 内置调试工具
- PHP >= 8.1
- MySQL >= 5.7
- Composer
- 扩展:
ext-json,ext-pdo,ext-pdo_mysql
- 克隆项目
git clone https://github.com/your-username/webman-starter.git
cd webman-starter- 安装依赖
composer install- 配置数据库
`config/think-orm.php`
- 导入数据库
`database.sql`
- 启动服务
# 开发模式
php start.php start
# 生产模式
php start.php start -d- 访问应用
- 服务地址: http://localhost:8787
- 默认账号: admin / 123456
完整的 API 文档请查看 API.md
# 登录获取 Token
curl -X POST http://localhost:8787/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}'
# 获取用户列表
curl -X GET http://localhost:8787/system/user \
-H "Authorization: Bearer YOUR_TOKEN_HERE"- 服务为核心: Service 层是业务逻辑的唯一入口
- 组合优于继承: 使用 Trait 实现功能混入
- 精简专注的分层: 每层职责明确,代码简洁
- 约定与效率: 统一命名规范,快速开发
┌─────────────────┐
│ Controller │ HTTP 请求处理
├─────────────────┤
│ Service │ 业务逻辑处理
├─────────────────┤
│ Repository │ 数据访问层
├─────────────────┤
│ Model │ 数据模型
└─────────────────┘
app/
├── common/ # 公共模块
│ ├── enums/ # 枚举类
│ ├── exception/ # 异常处理
│ ├── middleware/ # 中间件
│ ├── model/ # 基础模型
│ ├── repository/ # 基础仓储
│ └── traits/ # 公共 Trait
│
└── system/ # 系统模块
├── controller/ # 控制器
├── model/ # 模型
├── repository/ # 仓储
├── service/ # 服务
├── validate/ # 验证器
└── route.php # 路由定义
以创建用户为例,展示各层之间的交互:
sequenceDiagram
participant Client as 客户端
participant Controller as 控制器
participant Service as 服务层
participant Validate as 验证器
participant Repository as 仓储层
participant Model as 模型
Client->>Controller: POST /system/user
Controller->>Service: create(userData)
Service->>Validate: check(userData)
Validate-->>Service: 验证通过
Service->>Repository: create(processedData)
Repository->>Model: Model::create()
Model-->>Repository: 返回创建结果
Repository-->>Service: 返回数据
Service-->>Controller: 返回结果
Controller-->>Client: JSON 响应
- 创建模型
<?php
namespace app\custom\model;
use app\common\model\BaseModel;
class Product extends BaseModel
{
protected $table = 'products';
// 定义关联关系
}- 创建仓储
<?php
namespace app\custom\repository;
use app\common\repository\BaseRepository;
use app\system\model\Product;
class ProductRepository extends BaseRepository
{
public function __construct()
{
$this->model = new Product();
}
// 自定义查询方法
}- 创建服务
<?php
namespace app\custom\service;
use app\common\traits\Crud;
use app\system\repository\ProductRepository;
class ProductService
{
use Crud;
public function __construct()
{
$this->repository = new ProductRepository();
$this->validate = new ProductValidate();
}
}- 创建控制器
<?php
namespace app\custom\controller;
use app\common\traits\ApiResponse;
use app\system\service\ProductService;
class Product
{
use ApiResponse;
protected $service;
public function __construct()
{
$this->service = new ProductService();
}
public function list(Request $request)
{
$result = $this->service->list($request->all());
return $this->success($result);
}
}- 类名: 大驼峰命名 (PascalCase)
- 方法名: 小驼峰命名 (camelCase)
- 常量: 全大写下划线分隔 (UPPER_SNAKE_CASE)
- 数据库: 小写下划线分隔 (snake_case)
list(): 获取列表(支持分页)find($id): 获取详情create($data): 创建记录update($id, $data): 更新记录delete($id): 删除记录
// 成功响应
return $this->success($data, '操作成功');
// 失败响应
return $this->error('操作失败', ApiResponseEnum::ERROR);<?php
namespace app\common\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class CustomMiddleware implements MiddlewareInterface
{
public function process(Request $request, callable $handler): Response
{
// 前置处理
$response = $handler($request);
// 后置处理
return $response;
}
}<?php
namespace app\custom\validate;
use think\Validate;
class CustomValidate extends Validate
{
protected $rule = [
'name' => 'require|max:50',
'email' => 'require|email',
];
protected $message = [
'name.require' => '名称不能为空',
'email.email' => '邮箱格式不正确',
];
}// 在 app/system/route.php 中添加
Route::group('/custom', function () {
Route::get('', [app\system\controller\Custom::class, 'list']);
Route::post('', [app\system\controller\Custom::class, 'create']);
});- 配置优化
# 启用 OPcache
echo "opcache.enable=1" >> /etc/php/8.1/fpm/php.ini
# 配置进程数
# 编辑 start.php 设置合适的 worker 数量- Nginx 配置
server {
listen 80;
server_name your-domain.com;
root /path/to/webman-starter/public;
location / {
proxy_pass http://127.0.0.1:8787;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}- 进程管理
# 使用 systemd 管理进程
sudo systemctl enable webman-starter
sudo systemctl start webman-starter本项目基于 MIT 许可证开源。
- ✨ 初始版本发布
- ✅ 完整的 RBAC 权限系统
- ✅ JWT 认证机制
- ✅ RESTful API 设计
- ✅ 分层架构实现
- ✅ 完整的 CRUD 操作
- ✅ 验证码功能
- ✅ 个人中心模块
- ✅ 跨域支持
- ✅ 完整的 API 文档
- 🔄 扩展插件系统
- 🔄 文件上传功能
- 🔄 邮件服务集成
- 🔄 Redis 缓存支持
- 🔄 操作日志记录
- 🔄 数据权限控制
- 🔄 API 限流功能
- 🔄 Swagger 文档集成
- 🔄 单元测试覆盖
如果这个项目对你有帮助,请给个 ⭐️ Star 支持一下!