本项目基于 Laravel 11 和 PHP 8.2 构建,包含多种中间件、功能模块和 API 接口,支持 Swoole 和 WebSocket 功能。
- 加密解密中间件:用于对请求和响应的数据进行加密解密处理。
- Null 转空字符串中间件:将请求中的 Null 值转为空字符串。
- 日志中间件:记录请求和响应的日志。
- 请求频率中间件:限制请求频率,防止滥用。
- CORS 中间件:处理跨域请求。
- 请求重复检查中间件:防止重复提交请求。
- 动态路由中间件:支持动态路由配置。
- 权限中间件:基于角色和权限的访问控制。
- Laravel Swoole 启动项目:通过 Swoole 启动项目,提高性能。
- WebSocket 异地登录监控:实时监控用户异地登录情况。
- 观察者和事件:记录操作日志。
- Sanctum Token:用于 API 认证。
- 用户接口
- 菜单接口
- 角色接口
- 日志接口
- 回收站接口
- 文件接口
- 邮件接口
-
克隆仓库
git clone https://https://github.com/zhangqingxi/Laravel11-Admin.git cd Laravel11-Admin -
安装依赖
composer install注意: 需要php开启安全函数 putenv、proc_open
-
复制并修改环境配置文件
cp .env.example .env php artisan key:generate -
配置数据库
php artisan migrate:fresh --path=/database/migrations/admin php artisan db:seed --class=AdminSeeder php artisan db:seed --class=RoleSeeder php artisan db:seed --class=MenuSeeder php artisan db:seed --class=RoleAdminSeeder php artisan db:seed --class=RoleMenuSeeder -
启动服务
php bin/laravels start -
补充
- 在storage目录下补充laravels、logs、keys目录
- 在storage/keys目录下 补充公钥、私钥文件 如:admin_private.pem admin_public.pem
- 如果运行失败,检查目录权限、日志
通过Supervisord监管主进程,前提是命令不可以设置在后台运行
-
启动项目
[program:laravel-swoole] directory=[项目目录] command=/usr/local/bin/php bin/laravels start -i numprocs=1 autostart=true autorestart=true redirect_stderr=true startretries=3 startsecs=3 user=www redirect_stderr=true stdout_logfile=/path/to/your/laravel-project/storage/logs/swoole.log -
队列
[program:laravel-queue] directory=[项目目录] command=/usr/local/bin/php [项目目录]/artisan queue:work --tries=3 --queue=admin numprocs=1 autostart=true autorestart=true redirect_stderr=true startretries=3 startsecs=3 user=www redirect_stderr=true stdout_logfile=/path/to/your/laravel-project/storage/logs/queue.log -
定时任务
[program:laravel-schedule] directory=[项目目录] command=/usr/bin/php [项目目录]/artisan schedule:work numprocs=1 autostart=true autorestart=true redirect_stderr=true startretries=3 startsecs=3 user=www redirect_stderr=true stdout_logfile=/path/to/your/laravel/application/storage/logs/schedule.log
- 反向代理
map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream swoole { # 通过 IP:Port 连接 server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s; # 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能 #server unix:/yourpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s; #server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s; #server 192.168.1.2:5200 backup; keepalive 16; } server { listen 80; # 别忘了绑Host server_name laravels.com; root /yourpath/laravel-s-test/public; access_log /yourpath/log/nginx/$server_name.access.log main; autoindex off; index index.html index.htm; # Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。 location / { try_files $uri @laravels; } # 当请求PHP文件时直接响应404,防止暴露public/*.php #location ~* \.php$ { # return 404; #} # Http和WebSocket共存,Nginx通过location区分 # !!! WebSocket连接时路径为/ws # Javascript: var ws = new WebSocket("ws://laravels.com/ws"); location =/ws { # proxy_connect_timeout 60s; # proxy_send_timeout 60s; # proxy_read_timeout:如果60秒内被代理的服务器没有响应数据给Nginx,那么Nginx会关闭当前连接;同时,Swoole的心跳设置也会影响连接的关闭 # proxy_read_timeout 60s; proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header Server-Protocol $server_protocol; proxy_set_header Server-Name $server_name; proxy_set_header Server-Addr $server_addr; proxy_set_header Server-Port $server_port; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_pass http://swoole; } location @laravels { # proxy_connect_timeout 60s; # proxy_send_timeout 60s; # proxy_read_timeout 60s; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header Server-Protocol $server_protocol; proxy_set_header Server-Name $server_name; proxy_set_header Server-Addr $server_addr; proxy_set_header Server-Port $server_port; proxy_pass http://swoole; } }