Skip to content

Commit

Permalink
毕业设计第四天
Browse files Browse the repository at this point in the history
  • Loading branch information
prohorry-me committed Aug 12, 2018
1 parent 2d629f0 commit 6016a2b
Showing 1 changed file with 123 additions and 0 deletions.
123 changes: 123 additions & 0 deletions laravel/毕业设计/开发日志4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# 处理之前的逻辑:
> 站长和管理员不应该有能申请开店和权限,因为他们能自己审核自己申请开的门店,用 Policy 禁止这两种身份的用户访问 StoresController@create 和 StoresController@store 方法。
* 这里因为只设计用户的身份,所以直接在 UserPolicy 中定义权限认证方法
```
/**
* 禁止已经登陆用户中的管理员以上级别的用户创建自己的门店
*/
public function createStore(User $currentUser, User $user)
{
return $currentUser->level < 2 && !$currentUser->can('manage_stroes');
}
```
> 这里已登陆的用户是用 `auth` 中间件确保的,并且这个 Policy 已经在 AuthServiceProvider 中注册,直接在控制器层调用即可: `$this->authorize('createStore', Auth::user());`
* 创建 ../layouts/footer.blade.php 给增加一个申请开店的入口链接(暂时没管样式)

# 完成商店后台部署
1. 配置路由 `Route::get('/stores/admin', 'StoresController@admin')->name('stores.admin');`
2. 完成 StoresController@admin 方法
```
public function admin()
{
// 获取当前用户旗下的门店
$store = Auth::user()->stores()->first();
// 跳转到后台
return view('stores.admin', compact('store'));
}
```
> 这里再回头修正一个逻辑:虽然绑定了1:n的关系,但是我们还是要求一个用户只能开一个门店。因此编辑 StoresController@create 和 StoresController@store,在验证权限后,都加上这一句:如果有门店,再点击申请看点,直接跳到自己的后台管理。
```
$check = Auth::user()->hasStore();
if($check) {
return redirect()->route('stores.admin');
}
```
* 关于 hasStore 方法:定义在 User 模型中
```
/**
* 判断用户是否有门店了
*/
public function hasStore()
{
$flag = $this->stores->first();
if($flag) {
return true;
}
return false;
}
```
* 后台模板略。(暂时就做一个首页展示门店信息的效果)
```
# 后台有以下模板
1. admin -> 后台整体框架
2. admin_index -> 后台首页,显示门店信息
3. admin_edit -> 后台编辑页
4. admin_goods -> 后台商品管理页
5. admin_orders -> 后台订单管理页
```

# 用 hieu-le/active 判断路由,激活按钮样式,挂在不同的页面
* 安装 `composer require "hieu-le/active:~3.5"`
* 扩展包提供一下全局函数
```
active_class(BOOLEAN, 样式名1='默认active', 样式名2='默认为空字符串');
// 最常用:判断第一个参数,第一个参数为真,用样式1,否则,用样式2。
// 这个方法位于 vendor/hieu-le/active/src/Facades/helpers.php 中
// 因为默认为 'active' 所以如果用 bootstrap337 作为前端 ui 框架,那么就不用给这个函数后面的参数了。
/* 一下这些方法常常作为上面函数的第一参数,返回值都是布尔 */
if_route('路由名称') // 判断当前路由的路由名称
if_route_param('参数名', 值) // 判断当前路由的隐性参数是否等于给的值
if_query('参数名', 值) // 判断当前路由的参数(这里的参数是说:网站?参数名=值,就是判断问号后面的那个)
```

# 权限控制
* 新建权限策略类 `php artisan make:policy StorePolicy --model=Store`, 编辑
```
/**
* 后台访问权限
*/
public function view(User $user, Store $store)
{
return $user->level === 1 && $user->can('manage_goods');
}
/**
* 更新资料权限
*/
public function update(User $user, Store $store)
{
return $user->id === $store->user_id;
}
/**
* 删除权限
*/
public function delete(User $user, Store $store)
{
return $user->id === $store->user_id || ($user->level > 1 && $user->can('manage_stores'));
}
```
> 这里需要注意 Policy 中的每个方法都需要2个参数:第一个 $user 是当前用户,不用我们传,第二个是当前模型的实例,即使你不用它,也需要在形参中声明,在实参中赋值:因为这样它才能确定你调用的是针对哪个模型的 Policy 中的哪个方法。(UserPolicy 也有 update, 我们在控制器中用 `$this->authorize('update', 参数2)` 这样的形式调用,那么参数2除了提供一些必要的数据以外,还可以用于确定我们调用的具体是哪个 Policy 的 update 方法),所以即使 view 我们没用 $store,也需要定义和传递。
* 在 StoresController 控制器层完成权限认证逻辑:
```
# edit & update
$this->authorize('update', $store);
# admin => 需要先通过用户找当前用户的门店
public function admin()
{
// 获取当前用户的门店
$store = Auth::user()->stores()->first();
// 授权
$this->authorize('view', $store);
// 跳转到后台
return view('stores.admin', compact('store'));
}
```

0 comments on commit 6016a2b

Please sign in to comment.