Laravel配置nginx伪静态
location / {
try_files $uri $uri/ /index.php?$query_string;
}
使用faker生成测试数据
前提是创建好数据迁移文件
php artisan make:model Models/User -m
使用
make:model XXX -m
来创建模型和迁移文件比较方便
-m
参数代表migration
,顺带创建迁移文件
- 修改faker本地化,
config/app.php
文件中faker_locate=zh_CN
- 创建数据工厂
php artisan make:factory UserFactory(举例)
,定义填充的数据格式 - 创建填充文件:
php artisan make:seeder UserSeeder(举例)
,factory(模型::class, 数量)->create();
- 在
DatabaseSeeder
文件中添加一个调度$this->call(XXXXSeeder::class)
- 执行填充:
php artisan db:seed
实现登录功能
使用
laravel
提供的验证auth()
方法进行用户登录验证
attempt()
验证账号和密码是否正确,返回值:true/false
字段为username、password
check()
验证用户是否已经登录user()
登录成功返回登录用户的模型对象
修改用户模型,让继承的类更改
namespace App\Models; // 继承可以使用auth登录的模型类 use Illuminate\Foundation\Auth\User as AuthUser; class User extends AuthUser{}
修改
config/auth.php
提供模型类,App\Models\User::class
实现登录:
attempt()
csrf
- 表单验证
- 登录
- 成功跳转,失败重新登录
中间件
- 全局中间件
- 路由中间件
创建中间件:
php artisan make:middleware 中间件名称
中间件存储地址:
App\Http\Middleware\你的中间件名称
创建完了,不会立即生效,需要注册中间件
找到
Kernel.php
文件进行注册中间件
在全局中间件数组里进行注册,整个网站会立即生效,不适合一些用于特定验证身份的中间件注册。
所以一般验证身份的中间件一般选择路由中间件进行注册
路由中间件数组名称为:$routeMiddleware
方式为:别名
=> 类路径
注册完了之后,这个时候还是未生效的,需要到路由中去进行绑定
方式1:直接在一条路由后面添加,这样只对这一条路由进行验证
Route::get('welcome', 'IndexController@welcome')->name('admin.welcome')->middleware(['ckadmin']); // ckadmin 我取的别名
方式2:使用路由分组里进行绑定
// 后台需要验证才能通过 Route::group(['middleware' => ['ckadmin']], function () { // 退出 Route::get('logout', 'IndexController@logout')->name('admin.logout'); // 后台首页显示 Route::get('index', 'IndexController@index')->name('admin.index'); // 欢迎页面显示 绑定路由中间件 Route::get('welcome', 'IndexController@welcome')->name('admin.welcome'); });
方式3:在控制器中绑定
class LoginController extends Controller { /** * 构造方法 * LoginController constructor. */ public function __construct() { $this->middleware(['ckadmin']); } }
中间件传参
class LoginController extends Controller
{
/**
* 构造方法
* LoginController constructor.
*/
public function __construct()
{
$this->middleware(['ckadmin:login']);
}
}
namespace App\Http\Middleware;
use Closure;
class CheckAdminLogin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param $param 自己加的或自定义的参数来接收中间件传值,默认不存在,自己写的
* @return mixed
*/
public function handle($request, Closure $next, $param)
{
dd($param);
return $next($request);
}
}
使用中间件进行登录验证
namespace App\Http\Middleware;
use Closure;
class CheckAdminLogin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// 用户是否登录检查
if (!auth()->check()) {
return redirect(route('admin.login'))->withErrors(['errors' => '请登录']);
}
// 如果没有停止则向后执行
return $next($request);
}
}
自定义验证规则
自定义手机号码验证规则
在AppServiceProvider.php
中进行定义,在加载控制器之前进行定义
public function boot()
{
// 自定义验证规则
Validator::extend(
'phone',
function ($attribute, $value, $parameters, $validator) {
// 返回true/false
$reg1 = '/^\+86-1[3-9]\d{9}$/';
$reg2 = '/^1[3-9]\d{9}$/';
return preg_match($reg1, $value) || preg_match($reg2, $value);
}
);
}
控制器使用
/**
* 添加用户处理
* @param Request $request
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$this->validate(
$request,
[
'username' => 'required',
'password' => 'required|confirmed',
'truename' => 'required',
'phone' => 'nullable|phone',
]
);
dd($request->all());
}
Laravel软删除操作
restful方式的请求方式:
delete
路由配置
Route::delete('user/del/{id}', 'UserController@del')->name('admin.user.del');
前端写法
注意:
这里进行了判断,如果当前用户id不等于这个循环之后的id,才进行显示删除操作
防止自己删自己这种误区出现
@if (auth()->id() != $item->id)
<a title="删除" href="{{ route('admin.user.del', ['id' => $item->id]) }}" class="ml-5 delbtn">删除</a>
@endif
// 生成一个token csrf
const _token = "{{ csrf_token() }}";
// 给删除按钮绑定事件
$('.delbtn').click(function () {
// 得到请求的url地址
let url = $(this).attr('href');
// 发起delete请求
$.ajax({
url: url,
type: 'DELETE',
data: {_token},
dataType: 'json'
}).then(({status, msg}) => {
if (status == 0) {
// 设置先提示在删除
layer.msg(msg, {time: 1000, icon: 1}, () => {
// 删除当前行
$(this).parents('tr').remove();
});
}
});
// jquery取消默认事件
return false;
});
实现方法
使用软删除注意:
- 表中必须有一个软删除标识字段,默认为
deleted_at
- 模型中引入对应的操作(trait)实现
- 模型中指定软删除的标识字段
数据库迁移文件内设置标识字段
// 软删除 生成字段 deleted_at
$table->softDeletes();
模型内引入软删除类
use Illuminate\Database\Eloquent\SoftDeletes;
调用
namespace App\Models;
// 软删除类
use Illuminate\Database\Eloquent\SoftDeletes;
// 继承可以使用auth登录的模型类
use Illuminate\Foundation\Auth\User as AuthUser;
class User extends AuthUser
{
// 软删除
use SoftDeletes;
// 软删除标识字段
protected $dates = ['deleted_at'];
// 设置添加的字段
// 拒绝不添加的字段
protected $guarded = [];
// 隐藏字段
protected $hidden = ['password'];
}
控制器实现方法
public function del(int $id)
{
// 删除
User::find($id)->delete();
// 强制删除 在配置了软删除的时候,真实的删除操作
// User::find($id)->forceDelete();
return ['status' => 0, 'msg' => '删除成功'];
}
Larave恢复软删除
查询的时候,默认将所有数据都显示出来
/** * 用户列表 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function index() { // 获取用户分页数据 withTrashed 显示所有的包括已经软删除的 $data = User::orderBy('id', 'asc')->withTrashed()->paginate($this->page_size); return view('admin.user.index', compact('data')); }
定义路由
Route::get('user/restore/{id}', 'UserController@restore')->name('admin.user.restore');
前端添加链接
@if (auth()->id() != $item->id) @if ($item->deleted_at != null) <a title="删除" href="{{ route('admin.user.restore', ['id' => $item->id]) }}" class="ml-5 btn btn-success btn-sm">还原</a> @else <a title="删除" href="{{ route('admin.user.del', ['id' => $item->id]) }}" class="ml-5 delbtn btn btn-danger btn-sm">删除</a> @endif @endif
控制器实现方法
public function restore(int $id) { // 还原 User::onlyTrashed()->where('id', $id)->restore(); return redirect(route('admin.user.index'))->with('success', '已还原用户'); }