Skip to content

Commit 78a5494

Browse files
committed
Finish user edit, update, index, and destroy actions
1 parent 79ea98a commit 78a5494

File tree

16 files changed

+284
-9
lines changed

16 files changed

+284
-9
lines changed

app/Http/Controllers/SessionsController.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111

1212
class SessionsController extends Controller
1313
{
14+
public function __construct()
15+
{
16+
$this->middleware('guest', [
17+
'only' => ['create']
18+
]);
19+
}
20+
1421
public function create()
1522
{
1623
return view('sessions.create');
@@ -24,13 +31,13 @@ public function store(Request $request)
2431
]);
2532

2633
$credentials = [
27-
'email' => $request->email,
28-
'password' => $request->password,
34+
'email' => $request->input('email'),
35+
'password' => $request->input('password'),
2936
];
3037

3138
if (Auth::attempt($credentials, $request->has('remember'))) {
3239
session()->flash('success', '欢迎回来!');
33-
return redirect()->route('users.show', [Auth::user()]);
40+
return redirect()->intended(route('users.show', [Auth::user()]));
3441
} else {
3542
session()->flash('danger', '很抱歉,您的邮箱和密码不匹配');
3643
return redirect()->back();

app/Http/Controllers/UsersController.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,23 @@
1313

1414
class UsersController extends Controller
1515
{
16+
public function __construct()
17+
{
18+
$this->middleware('auth', [
19+
'only' => ['edit', 'update', 'destroy']
20+
]);
21+
22+
$this->middleware('guest', [
23+
'only' => ['create']
24+
]);
25+
}
26+
27+
public function index()
28+
{
29+
$users = User::paginate(30);
30+
return view('users.index', compact('users'));
31+
}
32+
1633
public function create()
1734
{
1835
return view('users.create');
@@ -42,4 +59,41 @@ public function store(Request $request)
4259
session()->flash('success', '欢迎,您将在这里开启一段新的旅程~');
4360
return redirect()->route('users.show', [$user]);
4461
}
62+
63+
public function edit($id)
64+
{
65+
$user = User::findOrFail($id);
66+
$this->authorize('update', $user);
67+
return view('users.edit', compact('user'));
68+
}
69+
70+
public function update($id, Request $request)
71+
{
72+
$this->validate($request, [
73+
'name' => 'required|max:50',
74+
'password' => 'confirmed|min:6'
75+
]);
76+
77+
$user = User::findOrFail($id);
78+
$this->authorize('update', $user);
79+
80+
$data = array_filter([
81+
'name' => $request->name,
82+
'password' => $request->password,
83+
]);
84+
$user->update($data);
85+
86+
session()->flash('success', '个人资料更新成功!');
87+
88+
return redirect()->route('users.show', $id);
89+
}
90+
91+
public function destroy($id)
92+
{
93+
$user = User::findOrFail($id);
94+
$this->authorize('destroy', $user);
95+
$user->delete();
96+
session()->flash('success', '成功删除用户!');
97+
return back();
98+
}
4599
}

app/Http/Middleware/Authenticate.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function handle($request, Closure $next)
3838
if ($request->ajax()) {
3939
return response('Unauthorized.', 401);
4040
} else {
41-
return redirect()->guest('auth/login');
41+
return redirect()->guest('login');
4242
}
4343
}
4444

app/Policies/UserPolicy.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Policies;
4+
5+
use Illuminate\Auth\Access\HandlesAuthorization;
6+
use App\Models\User;
7+
8+
class UserPolicy
9+
{
10+
use HandlesAuthorization;
11+
12+
public function update(User $currentUser, User $user)
13+
{
14+
return $currentUser->id === $user->id;
15+
}
16+
17+
public function destroy(User $currentUser, User $user)
18+
{
19+
return $currentUser->is_admin && $currentUser->id !== $user->id;
20+
}
21+
}

app/Providers/AuthServiceProvider.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
66
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
77

8+
use App\Models\User;
9+
use App\Policies\UserPolicy;
10+
811
class AuthServiceProvider extends ServiceProvider
912
{
1013
/**
@@ -14,6 +17,7 @@ class AuthServiceProvider extends ServiceProvider
1417
*/
1518
protected $policies = [
1619
'App\Model' => 'App\Policies\ModelPolicy',
20+
User::class => UserPolicy::class,
1721
];
1822

1923
/**

database/factories/ModelFactory.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@
1212
*/
1313

1414
$factory->define(App\Models\User::class, function (Faker\Generator $faker) {
15+
$date_time = $faker->date . ' ' . $faker->time;
1516
return [
1617
'name' => $faker->name,
1718
'email' => $faker->safeEmail,
18-
'password' => bcrypt(str_random(10)),
19+
'is_admin' => false,
20+
'password' => str_random(10),
1921
'remember_token' => str_random(10),
22+
'created_at' => $date_time,
23+
'updated_at' => $date_time,
2024
];
2125
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
use Illuminate\Database\Schema\Blueprint;
4+
use Illuminate\Database\Migrations\Migration;
5+
6+
class AddIsAdminToUsersTable extends Migration
7+
{
8+
/**
9+
* Run the migrations.
10+
*
11+
* @return void
12+
*/
13+
public function up()
14+
{
15+
Schema::table('users', function (Blueprint $table) {
16+
$table->boolean('is_admin')->default(false);
17+
});
18+
}
19+
20+
/**
21+
* Reverse the migrations.
22+
*
23+
* @return void
24+
*/
25+
public function down()
26+
{
27+
Schema::table('users', function (Blueprint $table) {
28+
$table->dropColumn('is_admin');
29+
});
30+
}
31+
}

database/seeds/DatabaseSeeder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public function run()
1414
{
1515
Model::unguard();
1616

17-
// $this->call(UserTableSeeder::class);
17+
$this->call('UsersTableSeeder');
1818

1919
Model::reguard();
2020
}

database/seeds/UsersTableSeeder.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
use Illuminate\Database\Seeder;
4+
use App\Models\User;
5+
6+
class UsersTableSeeder extends Seeder
7+
{
8+
/**
9+
* Run the database seeds.
10+
*
11+
* @return void
12+
*/
13+
public function run()
14+
{
15+
$users = factory(User::class)->times(50)->make();
16+
User::insert($users->toArray());
17+
18+
$user = User::find(1);
19+
$user->name = 'Aufree';
20+
$user->email = '[email protected]';
21+
$user->password = 'password';
22+
$user->is_admin = true;
23+
$user->save();
24+
}
25+
}

public/css/app.css

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/css/app.css.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/assets/sass/app.scss

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,33 @@ input {
161161
.panel {
162162
margin-top: 50px;
163163
}
164+
165+
/* Users edit */
166+
167+
.gravatar_edit {
168+
margin: 15px auto;
169+
text-align: center;
170+
.gravatar {
171+
float: none;
172+
max-width: 100px;
173+
}
174+
}
175+
176+
/* Users index */
177+
178+
.users {
179+
list-style: none;
180+
margin: 0;
181+
padding-left: 0;
182+
li {
183+
overflow: auto;
184+
padding: 10px 0;
185+
border-bottom: 1px solid $gray-lighter;
186+
}
187+
}
188+
189+
.delete-btn {
190+
float: right;
191+
position: relative;
192+
right: 0;
193+
}

resources/views/layouts/_header.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
<nav>
66
<ul class="nav navbar-nav navbar-right">
77
@if (Auth::check())
8-
<li><a href="#">用户列表</a></li>
8+
<li><a href="{{ route('users.index') }}">用户列表</a></li>
99
<li class="dropdown">
1010
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
1111
{{ Auth::user()->name }} <b class="caret"></b>
1212
</a>
1313
<ul class="dropdown-menu">
1414
<li><a href="{{ route('users.show', Auth::user()->id) }}">个人中心</a></li>
15-
<li><a href="#">编辑资料</a></li>
15+
<li><a href="{{ route('users.edit', Auth::user()->id) }}">编辑资料</a></li>
1616
<li class="divider"></li>
1717
<li>
1818
<a id="logout" href="#">

resources/views/users/_user.blade.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<li>
2+
<img src="{{ $user->gravatar() }}" alt="{{ $user->name }}" class="gravatar"/>
3+
<a href="{{ route('users.show', $user->id )}}" class="username">{{ $user->name }}</a>
4+
5+
@can('destroy', $user)
6+
<form action="{{ route('users.destroy', $user->id) }}" method="post">
7+
{{ csrf_field() }}
8+
{{ method_field('DELETE') }}
9+
<button type="submit" class="btn btn-sm btn-danger delete-btn">删除</button>
10+
</form>
11+
@endcan
12+
</li>

resources/views/users/edit.blade.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
@extends('layouts.default')
2+
@section('title', '更新个人资料')
3+
4+
@section('content')
5+
<div class="col-md-offset-2 col-md-8">
6+
<div class="panel panel-default">
7+
<div class="panel-heading">
8+
<h5>更新个人资料</h5>
9+
</div>
10+
<div class="panel-body">
11+
12+
@include('shared.errors')
13+
14+
<div class="gravatar_edit">
15+
<a href="http://gravatar.com/emails" target="_blank">
16+
<img src="{{ $user->gravatar('200') }}" alt="{{ $user->name }}" class="gravatar"/>
17+
</a>
18+
</div>
19+
20+
<form method="POST" action="{{ route('users.update', $user->id )}}">
21+
{{ method_field('PATCH') }}
22+
{{ csrf_field() }}
23+
24+
<div class="form-group">
25+
<label for="name">名称:</label>
26+
<input type="text" name="name" class="form-control" value="{{ $user->name }}">
27+
</div>
28+
29+
<div class="form-group">
30+
<label for="email">邮箱:</label>
31+
<input type="text" name="email" class="form-control" value="{{ $user->email }}" disabled>
32+
</div>
33+
34+
<div class="form-group">
35+
<label for="password">密码:</label>
36+
<input type="password" name="password" class="form-control" value="{{ old('password') }}">
37+
</div>
38+
39+
<div class="form-group">
40+
<label for="password_confirmation">确认密码:</label>
41+
<input type="password" name="password_confirmation" class="form-control" value="{{ old('password_confirmation') }}">
42+
</div>
43+
44+
<button type="submit" class="btn btn-primary">更新</button>
45+
</form>
46+
</div>
47+
</div>
48+
</div>
49+
@stop

resources/views/users/index.blade.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@extends('layouts.default')
2+
@section('title', '所有用户')
3+
4+
@section('content')
5+
<div class="col-md-offset-2 col-md-8">
6+
<h1>所有用户</h1>
7+
<ul class="users">
8+
@foreach ($users as $user)
9+
@include('users._user')
10+
@endforeach
11+
</ul>
12+
13+
{!! $users->render() !!}
14+
</div>
15+
@stop

0 commit comments

Comments
 (0)