laravel8 封装一个常用的前后端分离的框架
简单的 封装,继承, 复用,cv真好 码字不易,希望对你有所帮助
git 地址出了点问题:
链接: https://pan.baidu.com/s/1k-mDIc0GX8DIKVfdWA8-Uw?pwd=1111 提取码: 1111
文章目录
前言
由于工作需要,要开发一个前后端分离的laravel框架
技术栈:
1.后端:lavavel 8 ;
2.前端:Element ;
3.代码管理 git ;
4.数据库 5.7;
5.线上Linux8+nginx2.0+php7.3+sql5.7
6.线下win11+nginx1.8+php7.3+sql5.7
后端包含功能点
1.登录验证 jwt;
2.接口用dingo管理接口 ;
3.多语言;
4.跨域处理;
5.低代码 设想:
封装一个公共模型(增删改查);
一个公共控制器(所有列表,列表分页,聚合,修改,增加,删除 )
模型都继承公共模型
控制器都继承公共控制器 如base
通过在控制器配置 几分钟完成简单的增删改查
也可以引入其他模型,去操作增删改查操作
6.封装
后期会做一个composer 扩展 放一些常用的业务处理大致如下
6.1 时间处理 比如 时间戳和时间转换,某天零点
6.2 字符串处理 比如 获取指定位数,
6.3 数组处理 比如 无限级排序 ,
6.4 curl 请求 get post
其他会陆续补充
composer 安装 lavavel ,安装 jwt 和 dingo配置
composer create-project --prefer-dist laravel/laravel 文件名 "8.0.*"
安装完
cd 文件名
1.下载安装扩展 jwt扩展和dingo扩展
composer require tymon/jwt-auth
composer require dingo/api
#jwt生成密钥
php artisan jwt:secret
2.配置config/app.php
'providers' => [
Dingo\Api\Provider\LaravelServiceProvider::class,
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
]
'aliases' => [
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth',
'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory',
3.生成 Dingo 和 JWT 的配置文件
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider" //生成 Dingo 的 api.php 文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" //生成 JWT 的 jwt.php 文件
4.配置config/api.php 和 config/jwt.php
//在 api.php 的 auth 数组中添加 api 权限验证类
'auth' => [
'jwt' => Dingo\Api\Auth\Provider\JWT::class, // api 权限验证类
],
//把 jwt.php providers 数组中的 token 生成类(Lcobucci)修改为 Namshi 如下:
'providers' => [
//'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class, // 使用 attempt() 方法生成 token (本人不推荐使用这方法)
'jwt' => Tymon\JWTAuth\Providers\JWT\Namshi::class, //使用 formUser() 方法生成 token
]
5.配置config/auth.php 配置文件
这个文件需要注意一下,我需要做api和admin 两个模块根据自己情况可以自由添加多个模块
//把 defaults 数组中的默认守卫(网关)改为 api 或 admin 如下:
'defaults' => [
'guard' => 'api',//'web',
'passwords' => 'users',
],
//把 guards 数组中的 api 守卫的驱动改为 jwt 如下:
'guards' => [
...
'api' => [
'driver' => 'jwt', //'token',//改成我们需要的验证jwt这个就会去加载config/jwt.php 里'providers' => []里配置
'provider' => 'users',//这个会去找providers 下的配置
'hash' => false,
],
'admin' => [
'driver' => 'jwt', //'token',
'provider' => 'admin_user',//这个会去找providers 下的配置
'hash' => false,
],
],
//验证方式,一种是 'driver' => 'eloquent', 'model' =>'模型类'
//一种是 'driver' => 'database', 'table' =>'表名'
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,//引入自己创建的模型后面有介绍
],
'admin_users' => [
'driver' => 'eloquent',
// 'table' => 'remember_token',
'model' => App\Models\AdminUser::class,//引入自己创建的模型后面有介绍
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
6.配置 App\Http\Kernel.php
//这里就是路由里拿的对应的值
protected $middlewareGroups = [
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'admin' => [
'throttle:admin',
'bindings'
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
//这里中间件我没有新建直接把处理逻辑放到对应的这个里
]
7.配置 .env
#以下是我的配置:
API_STANDARDS_TREE=vnd #模式
API_SUBTYPE=laravel #项目名
API_PREFIX=/ #这个如果你想要 域名/api/方法这种就填对应的 api 我想做的效果是
#域名/方法 这样就可以 域名/admin 做后台接口 域名/auth 做前台接口 填的是 /
#子域名 (前缀和子域名只能存在一个)可选
#API_DOMAIN=api.myapp.com
API_VERSION=v1 #这个是默认版本,可以快速切换接口
API_NAME=api-demo
API_DEFAULT_FORMAT=json
API_DEBUG=true //这个参数默认是有的
记得修改数据库配置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=the #数据库名
DB_USERNAME=root #数据库账号
DB_PASSWORD=root #数据库名密码
修改相关文件及封装 跨域处理
1.创建对应数据库
//
CREATE TABLE `admin_users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名',
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件',
`mobile` varchar(11) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号码',
`sex` smallint(6) NOT NULL DEFAULT '1' COMMENT '性别',
`password` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码',
`remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'TOKEN',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '头像',
`roles_id` int(10) DEFAULT '0' COMMENT '角色id',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `users_username_unique` (`username`) USING BTREE,
UNIQUE KEY `users_email_unique` (`email`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`email_verified_at` timestamp NULL DEFAULT NULL,
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`u_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`mobile` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2.创建模型和控制器
文件篇幅较长,这里为了不影响文章的阅读性
放了一个附件直接下载复制即可 附件里有自己封装的简单的公共模型和公共方法不用改一下继承就可以了后期基础功能完成后会放一个完整的dome
附件地址 https://gitee.com/jiaruzheyichengmeng/lavavel8-attachment
模型: 四个 两个后台相关,两个前台相关
2.1 创建 App/Models/AdminAuthorization.php 这个是后台来获取token生成token的
2.2 创建 App/Models/Authorization.php 这个是前台台来获取token生成token的
2.3 创建 App/Models/AdminUser.php 这个就是 config/auth.php providers 数组下引入模型 App/Models/AdminUser::class
2.4 创建 App/Models/AdminUser.php 这个就是 config/auth.php providers 数组下引入模型 App/Models/Users::class
控制器:
结构如下
2.5 App\Http\Controllers\Admin\V1\Auth\AuthController.php 这里有几个基础接口登录,注册,刷token ,退出
2.6 App\Http\Controllers\Api\V1\Auth\AuthController.php 这里有几个基础接口登录,注册,刷token ,退出
建议1. 层级:这里放amdin 和 api 分层 前台和后台 v1做分层 迭代可以保证v1 和v2可以区分并保证新老接口都可以维护起来,Auth准备把基础的权限控制器都放到这个里面好区分
建议2. 继承关系:
laravel 会有一个最基础的 App\Http\Controller
最好是将多语言做到这个里面 如:这样就实现说有的接口都可以使用多语言设置但要注意这样会造成你 新增和修改时的时候会多一个 lang字段,记得要处理他
public function __construct(Request $request){
#多语言处理
if(!empty($request->lang)) \App::setLocale($request->lang);
}
最好将后端的admin 和 api分别 继承他
如: App\Http\Controllers\Admin\V1\BaseController.php
如: App\Http\Controllers\Api\V1\BaseController.php
这样就可以去定义一些前后台不一样的处理方法和 总的处理方法如果你想实现自动引入配置好的方法
建议3. 1.良好的分层 条例会很清晰 无脑就可以找到对应文件(大型项目文件很多也很难全部一个人完成),
2.合理的继承 继承这词真好,相当于你的财富平均的分成了你的每一个孩子,
3.公共的封装, 多文件之间相互引用 ,像极了你有一个武器库,库里有的你都可以拿来用
封装 继承 多态 程序设计的灵魂,很多框架以及设计模型都时重里边延申去出的
当然还有 routes/api.php
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
//接管理路由
$api = app('Dingo\Api\Routing\Router');
$api->version('v1',[
'namespace' => 'App\Http\Controllers',//定到对应文件夹
'cors'//跨域
], function ($api) {
//规划前台接口 prefix 域名/auth/方法
$api->group(['namespace' => 'Api\V1\Auth', "prefix" => 'auth'], function ($api) {
$api->post('/register', 'AuthController@register');
$api->post('/login', 'AuthController@login');
//需要权限接口 auth:api 这里时指 kernel.php 里$middlewareGroups =['api'=> ,'admin'=>]
$api->group(['middleware' => 'auth:api'], function ($api) {
$api->post('/refresh', 'AuthController@update');
$api->post('/logout', 'AuthController@destroy');
});
});
//规划后端接口 prefix 域名/auth/方法
$api->group(['namespace' => 'Admin\V1\Auth', "prefix" => 'admin'], function ($api) {
//登录
$api->post('/login', 'AuthController@login');
//需要权限接口
$api->group(['middleware' => 'auth:admin'], function ($api) {
//退出接口
$api->post('/logout', 'AuthController@destroy');
//登录用户拥有菜单
$api->get('/getMenus', 'AuthController@getMenus');
//菜单模块
$api->get('/menus/getMenus', 'MenuController@getMenus');//列表
$api->get('/menus/info', 'MenuController@BaseOne');//详情
$api->post('/menus/add', 'MenuController@BaseCreate');//新增
$api->post('/menus/edit', 'MenuController@BaseUpdate');//修改
$api->get('/menus/del', 'MenuController@BaseDelete');//删除
//角色模块
$api->get('/role/list', 'RolesController@BaseLimit');//列表
$api->get('/role/info', 'RolesController@BaseOne');//详情
$api->post('/role/add', 'RolesController@BaseCreate');//新增
$api->post('/role/edit', 'RolesController@BaseUpdate');//修改
$api->get('/role/del', 'RolesController@BaseDelete');//删除
//用户模块
$api->get('/user/list', 'UserController@BaseLimit');//列表
$api->get('/user/info', 'UserController@BaseOne');//详情
$api->post('/user/add', 'UserController@BaseCreate');//新增
$api->post('/user/edit', 'UserController@BaseUpdate');//修改
$api->get('/user/del', 'UserController@BaseDelete');//删除
//日志模块
$api->get('/log/list', 'Logs@BaseLimit');//列表
$api->get('/log/info', 'Logs@BaseOne');//详情
// $api->post('/log/add', 'Logs@BaseCreate');//新增
// $api->post('/log/edit', 'Logs@BaseUpdate');//修改
// $api->get('/log/del', 'Logs@BaseDelete');//删除
});
});
});
// 其中 : 刷新token 和 注销接口 请求的时候需要以下请求头:
// Authorization : Bearer + "your token"
3.跨域处理
composer require fruitcake/laravel-cors
1.修改文件 App\Http\Kernel.php
$middleware = [
\Fruitcake\Cors\HandleCors::class,
]
$middlewareGroups = [
'cors' => \Fruitcake\Cors\HandleCors::class,
]
2.修改 config/cors.php
//'paths' => ['/api', 'sanctum/csrf-cookie'],
'paths' => ['/*', 'sanctum/csrf-cookie'],//这里我要解决全部开头的跨域修改了一下 /api
2.修改 routes/api.php
$api->version('v1',[
'namespace' => 'App\Http\Controllers',
'cors'//添加这个搞定
], function ($api) {
篇幅较长有问题及时联系作者 3104976548qq.@com
总结
我是一个懒人,像极了贪心算法,就是想写最少的代码,完成最多的功能,避免重复性的工作,多留给一些时间提升自己,或者多讨好一下自己(奖励哥)