This commit is contained in:
molong committed 2026-02-09 09:29:21 +08:00
1 parent 616314eef2
commit 9939680942
6 files changed
+199 -82

No files matched your search

+1
View File
@@ -23,3 +23,4 @@ Homestead.json
Homestead.yaml
Thumbs.db
*lock*
/storage/*laravels*
+151 -40
View File
@@ -1,6 +1,6 @@
<div align="center">
# Laravel Swoole 管理系统
# LarAdmin
基于 Laravel + Swoole + Vue3 的高性能后台管理系统
@@ -14,7 +14,7 @@
## 📖 项目简介
本项目是一个基于 Laravel 12 + Swoole + Vue3 的高性能后台管理系统,采用模块化架构设计,提供完整的认证授权、系统管理、业务扩展等功能。项目集成了 `hhxsv5/laravel-s` 实现 Swoole 长生命周期服务,大幅提升系统并发性能和响应速度。
LarAdmin 是一个基于 Laravel 12 + Swoole + Vue3 的高性能后台管理系统,采用模块化架构设计,提供完整的认证授权、系统管理、业务扩展等功能。项目集成了 `hhxsv5/laravel-s` 实现 Swoole 长生命周期服务,大幅提升系统并发性能和响应速度。
### ✨ 核心特性
@@ -49,11 +49,13 @@
- **Pinia**: 3.0+ (状态管理)
- **Axios**: HTTP 客户端
- **Vue I18n**: 国际化支持
- **CKEditor 5**: 富文本编辑器
- **ECharts**: 数据可视化
## 📁 项目结构
```
laravel_swoole/
laradmin/
├── app/ # 基础模块目录
│ ├── Http/Controllers/ # 控制器
│ │ ├── Auth/ # 认证模块控制器
@@ -71,7 +73,8 @@ laravel_swoole/
│ │ │ ├── Task.php
│ │ │ ├── City.php
│ │ │ └── Upload.php
│ │ └── Api/
│ │ ├── Api/
│ │ └── WebSocket.php
│ ├── Models/ # 模型
│ │ ├── Auth/
│ │ │ ├── User.php
@@ -81,9 +84,11 @@ laravel_swoole/
│ │ └── System/
│ ├── Services/ # 服务层
│ │ ├── Auth/
│ │ └── System/
│ └── Exports/ # 导出类
│ └── Imports/ # 导入类
│ │ ├── System/
│ │ └── WebSocket/
│ ├── Exports/ # 导出类
│ ├── Imports/ # 导入类
│ └── Middleware/ # 中间件
├── Modules/ # 业务模块目录
│ └── ModuleName/ # 业务模块示例
│ ├── App/
@@ -105,11 +110,18 @@ laravel_swoole/
│ │ ├── src/
│ │ │ ├── api/ # API 接口
│ │ │ ├── components/ # 公共组件
│ │ │ │ ├── scForm/ # 表单组件
│ │ │ │ ├── scTable/ # 表格组件
│ │ │ │ ├── scUpload/ # 上传组件
│ │ │ │ ├── scEditor/ # 富文本编辑器
│ │ │ │ ├── scImport/ # 导入组件
│ │ │ │ └── scExport/ # 导出组件
│ │ │ ├── layouts/ # 布局组件
│ │ │ ├── pages/ # 页面组件
│ │ │ ├── router/ # 路由配置
│ │ │ ├── stores/ # 状态管理
│ │ │ ├── utils/ # 工具函数
│ │ │ ├── hooks/ # 组合式 API
│ │ │ └── i18n/ # 国际化
│ │ └── package.json
│ └── views/
@@ -148,25 +160,31 @@ laravel_swoole/
#### 1. 克隆项目
```bash
git clone http://git.tensent.cn/molong/laravel_swoole.git
cd laravel_swoole
git clone http://git.tensent.cn/molong/laravel_swoole.git laradmin
cd laradmin
```
#### 2. 安装依赖
#### 2. 自动安装(推荐)
```bash
# 一键安装所有依赖并初始化
composer run setup
```
此命令会自动执行:
- 安装后端依赖
- 配置环境文件
- 生成应用密钥
- 执行数据库迁移
- 安装前端依赖
- 构建前端资源
#### 3. 手动安装
```bash
# 安装后端依赖
composer install
# 安装前端依赖
cd resources/admin
npm install
cd ../..
```
#### 3. 环境配置
```bash
# 复制环境配置文件
cp .env.example .env
@@ -175,31 +193,22 @@ php artisan key:generate
# 配置数据库、Redis等参数
# 编辑 .env 文件
```
#### 4. 执行数据库迁移
```bash
# 执行迁移
# 执行数据库迁移
php artisan migrate
# 填充初始数据
php artisan db:seed
```
#### 5. 配置 JWT
```bash
# 生成 JWT 密钥
php artisan jwt:secret
```
#### 6. 构建前端
```bash
# 安装前端依赖
cd resources/admin
npm install
# 构建前端
npm run build
cd ../..
```
### 运行项目
@@ -207,15 +216,31 @@ cd ../..
#### 开发模式
```bash
# 启动 Laravel 开发服务器
php artisan serve
# 启动前端开发服务器(另开终端)
cd resources/admin
npm run dev
# 一键启动所有服务
composer run dev
```
#### Swoole 模式(推荐)
此命令会启动:
- Laravel 开发服务器 (http://localhost:8000)
- 队列监听器
- 日志监控
- Vite 前端开发服务器
#### 分步启动
```bash
# 终端1: 启动 Laravel 开发服务器
php artisan serve
# 终端2: 启动前端开发服务器
cd resources/admin
npm run dev
# 终端3: 启动队列监听器(可选)
php artisan queue:listen
```
#### Swoole 模式(推荐生产环境)
```bash
# 启动 Laravel-S 服务
@@ -229,6 +254,9 @@ php bin/laravels restart
# 重载服务(平滑重启)
php bin/laravels reload
# 查看状态
php bin/laravels status
```
访问地址:http://localhost:5200 (默认)
@@ -530,6 +558,74 @@ npm run format
bin/inotify # Linux
```
## 🌟 特色功能
### 1. 动态菜单路由
前端支持动态路由加载,登录后自动根据权限生成菜单树:
```javascript
// 登录后获取菜单
const menus = await authApi.permissions.menu.get()
userStore.setMenu(menus)
```
### 2. 权限指令
前端提供权限指令,方便控制元素显示:
```vue
<!-- 只有拥有 user.create 权限时显示 -->
<a-button v-permission="'user.create'">新增</a-button>
<!-- 拥有多个权限之一时显示 -->
<a-button v-permission="['user.create', 'user.update']">编辑</a-button>
```
### 3. 数据导入导出
支持 Excel 数据导入导出:
```javascript
// 导出用户数据
await userApi.export.post(params)
// 导入用户数据
await userApi.import.post(formData)
```
### 4. 富文本编辑器
集成 CKEditor 5 富文本编辑器:
```vue
<sc-editor
v-model="content"
:height="400"
/>
```
### 5. 文件上传
支持多种上传方式:
```vue
<!-- 图片上传 -->
<sc-upload
v-model="imageUrl"
:limit="1"
accept="image/*"
list-type="picture-card"
/>
<!-- 文件上传 -->
<sc-upload
v-model="fileList"
:limit="5"
:max-size="10"
/>
```
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
@@ -585,11 +681,26 @@ Closes #123
- [Vue.js](https://vuejs.org)
- [Ant Design Vue](https://antdv.com)
- [Laravel Modules](https://nwidart.com/laravel-modules)
- [CKEditor 5](https://ckeditor.com)
- [ECharts](https://echarts.apache.org)
## 📝 更新日志
### v1.0.0 (2024-01-01)
- 🎉 初始版本发布
- ✅ 完成 Auth 模块(用户、角色、权限、部门)
- ✅ 完成 System 模块(配置、日志、字典、任务、城市、上传)
- ✅ 集成 Swoole 高性能服务
- ✅ 完成前端 Vue3 管理界面
- ✅ 实现 WebSocket 实时通信
---
<div align="center">
**LarAdmin** - 高性能后台管理系统
Made with ❤️ by [Tensent](http://git.tensent.cn)
</div>
+2 -2
View File
@@ -39,9 +39,9 @@
"composer install",
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
"@php artisan key:generate",
"@php artisan jwt:secret",
"@php artisan migrate --force",
"npm install",
"npm run build"
"@php artisan db:seed"
],
"dev": [
"Composer\\Config::disableProcessTimeout",
+45 -38
View File
@@ -3,8 +3,8 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="基于 Laravel + Laravel-S + Swoole 的高性能后端 API 系统">
<title>Laravel-S - 高性能后端 API 系统</title>
<meta name="description" content="LarAdmin - 基于 Laravel + Laravel-S + Swoole + Vue3 的高性能后台管理系统">
<title>LarAdmin - 高性能后台管理系统</title>
<style>
* {
margin: 0;
@@ -278,7 +278,7 @@
<header>
<div class="container">
<nav>
<a href="#" class="logo">🚀 Laravel-S</a>
<a href="#" class="logo">🚀 LarAdmin</a>
<ul class="nav-links">
<li><a href="#features">特性</a></li>
<li><a href="#tech">技术栈</a></li>
@@ -291,8 +291,8 @@
<section class="hero">
<div class="container animate-fadeInUp">
<h1>高性能后端 API 系统</h1>
<p>基于 Laravel + Laravel-S + Swoole 构建的现代化后端 API 系统,提供卓越的性能和开发效率</p>
<h1>高性能后台管理系统</h1>
<p>基于 Laravel 12 + Swoole + Vue3 构建的现代化后台管理系统,提供卓越的性能和开发效率</p>
<div>
<a href="/admin" class="btn btn-primary">进入后台管理</a>
<a href="https://github.com/hhxsv5/laravel-s" target="_blank" class="btn btn-secondary">查看文档</a>
@@ -315,24 +315,24 @@
<p>采用 Laravel Modules 实现模块化架构,业务模块独立管理,易于扩展和维护</p>
</div>
<div class="feature-card">
<div class="feature-icon">🔒</div>
<h3>安全可靠</h3>
<p>JWT 认证、RBAC 权限控制、数据验证等多重安全防护机制</p>
<div class="feature-icon">🔐</div>
<h3>完整权限</h3>
<p>基于 RBAC 的权限控制系统,支持用户、角色、权限、部门管理</p>
</div>
<div class="feature-card">
<div class="feature-icon">🎨</div>
<h3>现代前端</h3>
<p>基于 Vue 3 + Ant Design Vue + Vite 构建的现代化管理界面</p>
</div>
<div class="feature-card">
<div class="feature-icon">📊</div>
<h3>完整后台</h3>
<p>基于 Vue3 + Ant Design Vue 构建的现代化后台管理系统</p>
<h3>数据管理</h3>
<p>支持数据导入导出、在线编辑、批量操作等功能</p>
</div>
<div class="feature-card">
<div class="feature-icon">🔄</div>
<h3>热重载</h3>
<p>开发环境支持文件监控热重载,提升开发体验</p>
</div>
<div class="feature-card">
<div class="feature-icon">📝</div>
<h3>RESTful API</h3>
<p>遵循 RESTful 规范的 API 设计,统一的响应格式</p>
<div class="feature-icon">🌐</div>
<h3>实时通信</h3>
<p>内置 WebSocket 支持,实现实时消息推送和在线状态同步</p>
</div>
</div>
</div>
@@ -344,11 +344,11 @@
<div class="tech-grid">
<div class="tech-item">
<div style="font-size: 36px;">🐘</div>
<h4>PHP</h4>
<h4>PHP 8.2+</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">🔷</div>
<h4>Laravel</h4>
<h4>Laravel 12</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">🚀</div>
@@ -358,21 +358,21 @@
<div style="font-size: 36px;">⚡</div>
<h4>Laravel-S</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">🔑</div>
<h4>JWT-Auth</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">📦</div>
<h4>Laravel Modules</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">💚</div>
<h4>MySQL</h4>
<h4>Vue 3</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">🎨</div>
<h4>Ant Design</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">💾</div>
<h4>MySQL 8.0+</h4>
</div>
<div class="tech-item">
<div style="font-size: 36px;">🔴</div>
<h4>Redis</h4>
<h4>Redis 6.0+</h4>
</div>
</div>
</div>
@@ -386,27 +386,34 @@
<h3>模块化设计</h3>
<p>项目采用清晰的分层架构,将业务逻辑合理划分:</p>
<ul class="architecture-list">
<li>基础模块(Auth、System):不使用 Laravel Modules 扩展</li>
<li>基础模块(Auth、System):核心功能模块</li>
<li>业务模块:使用 Laravel Modules 独立管理</li>
<li>Controller 层:处理 HTTP 请求</li>
<li>Service 层:业务逻辑处理</li>
<li>Model 层:数据模型定义</li>
<li>统一的 API 响应格式</li>
<li>完整的权限控制系统</li>
<li>WebSocket 实时通信支持</li>
</ul>
</div>
<div class="architecture-diagram">
<div style="background: #f8f9fa; padding: 30px; border-radius: 10px;">
<h4 style="text-align: center; margin-bottom: 20px; color: #667eea;">快速开始</h4>
<pre style="background: #333; color: #fff; padding: 20px; border-radius: 5px; overflow-x: auto;"><code># 安装依赖
<pre style="background: #333; color: #fff; padding: 20px; border-radius: 5px; overflow-x: auto;"><code># 一键安装
composer run setup
# 或手动安装
composer install
# 配置环境
cp .env.example .env
# 执行迁移
php artisan key:generate
php artisan migrate
php artisan db:seed
php artisan jwt:secret
# 启动 Laravel-S
# 启动开发服务
composer run dev
# 或启动 Swoole(生产环境)
php bin/laravels start
# 访问后台
@@ -419,7 +426,7 @@ php bin/laravels start
<footer>
<div class="container">
<p>&copy; 2024 Laravel-S. Built with ❤️ using Laravel & Swoole</p>
<p>&copy; 2024 LarAdmin. Built with ❤️ using Laravel & Swoole & Vue3</p>
</div>
</footer>
</body>
-1
View File
@@ -1 +0,0 @@
a:2:{s:6:"server";a:20:{s:9:"listen_ip";s:9:"127.0.0.1";s:11:"listen_port";i:8000;s:11:"socket_type";i:1;s:6:"server";s:0:"";s:13:"handle_static";b:0;s:17:"laravel_base_path";s:34:"/mnt/e/code/tensent/laravel_swoole";s:14:"inotify_reload";a:5:{s:6:"enable";b:0;s:10:"watch_path";s:34:"/mnt/e/code/tensent/laravel_swoole";s:10:"file_types";a:1:{i:0;s:4:".php";}s:13:"excluded_dirs";a:0:{}s:3:"log";b:1;}s:14:"event_handlers";a:0:{}s:9:"websocket";a:2:{s:6:"enable";b:1;s:7:"handler";s:39:"App\Services\WebSocket\WebSocketHandler";}s:7:"sockets";a:0:{}s:9:"processes";a:0:{}s:5:"timer";a:5:{s:6:"enable";b:0;s:4:"jobs";a:0:{}s:13:"max_wait_time";i:5;s:11:"global_lock";b:0;s:15:"global_lock_key";s:7:"Laravel";}s:13:"swoole_tables";a:1:{s:7:"wsTable";a:2:{s:4:"size";i:102400;s:6:"column";a:2:{i:0;a:3:{s:4:"name";s:5:"value";s:4:"type";i:3;s:4:"size";i:1024;}i:1;a:3:{s:4:"name";s:6:"expiry";s:4:"type";i:1;s:4:"size";i:4;}}}}s:18:"register_providers";a:0:{}s:8:"cleaners";a:0:{}s:19:"destroy_controllers";a:2:{s:6:"enable";b:0;s:13:"excluded_list";a:0:{}}s:6:"swoole";a:21:{s:9:"daemonize";b:1;s:13:"dispatch_mode";i:3;s:10:"worker_num";i:30;s:13:"task_ipc_mode";i:1;s:16:"task_max_request";i:100000;s:11:"task_tmpdir";s:8:"/dev/shm";s:11:"max_request";i:100000;s:16:"open_tcp_nodelay";b:1;s:8:"pid_file";s:55:"/mnt/e/code/tensent/laravel_swoole/storage/laravels.pid";s:9:"log_level";i:4;s:8:"log_file";s:66:"/mnt/e/code/tensent/laravel_swoole/storage/logs/swoole-2026-02.log";s:13:"document_root";s:41:"/mnt/e/code/tensent/laravel_swoole/public";s:18:"buffer_output_size";i:2097152;s:18:"socket_buffer_size";i:8388608;s:18:"package_max_length";i:4194304;s:12:"reload_async";b:1;s:13:"max_wait_time";i:60;s:17:"enable_reuse_port";b:1;s:16:"enable_coroutine";b:0;s:14:"upload_tmp_dir";s:8:"/dev/shm";s:16:"http_compression";b:0;}s:11:"enable_gzip";b:0;s:14:"process_prefix";s:42:"Laravel /mnt/e/code/tensent/laravel_swoole";s:16:"ignore_check_pid";b:0;}s:7:"laravel";a:8:{s:9:"root_path";s:34:"/mnt/e/code/tensent/laravel_swoole";s:11:"static_path";s:41:"/mnt/e/code/tensent/laravel_swoole/public";s:8:"cleaners";a:0:{}s:18:"register_providers";a:0:{}s:19:"destroy_controllers";a:2:{s:6:"enable";b:0;s:13:"excluded_list";a:0:{}}s:8:"is_lumen";b:0;s:7:"_SERVER";a:82:{s:5:"SHELL";s:9:"/bin/bash";s:21:"WSL2_GUI_APPS_ENABLED";s:1:"1";s:15:"WSL_DISTRO_NAME";s:6:"Ubuntu";s:10:"WT_SESSION";s:36:"06685478-cd0b-4356-812b-9e7754fb5ded";s:4:"NAME";s:9:"molong-pc";s:3:"PWD";s:34:"/mnt/e/code/tensent/laravel_swoole";s:7:"LOGNAME";s:6:"molong";s:1:"_";s:26:"/www/server/php/84/bin/php";s:4:"HOME";s:12:"/home/molong";s:4:"LANG";s:7:"C.UTF-8";s:11:"WSL_INTEROP";s:21:"/run/WSL/1157_interop";s:9:"LS_COLORS";s:1806:"rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:";s:15:"WAYLAND_DISPLAY";s:9:"wayland-0";s:9:"LESSCLOSE";s:23:"/usr/bin/lesspipe %s %s";s:4:"TERM";s:14:"xterm-256color";s:8:"LESSOPEN";s:22:"| /usr/bin/lesspipe %s";s:4:"USER";s:6:"molong";s:7:"DISPLAY";s:2:":0";s:5:"SHLVL";s:1:"1";s:15:"XDG_RUNTIME_DIR";s:15:"/run/user/1000/";s:6:"WSLENV";s:25:"WT_SESSION:WT_PROFILE_ID:";s:13:"XDG_DATA_DIRS";s:50:"/usr/local/share:/usr/share:/var/lib/snapd/desktop";s:4:"PATH";s:416:"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/Line truncated
-1
View File
@@ -1 +0,0 @@
5302