-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
prohorry-me
committed
Aug 7, 2018
1 parent
577b5b6
commit 6b58194
Showing
2 changed files
with
312 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,312 @@ | ||
# 部署开发环境 | ||
* 选择 homestaed,在 windows 系统下部署 homestead 可以参考[部署笔记](https://github.com/prohorry-me/notes/blob/master/laravel/Windows%E4%B8%8Bhomestead%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.md) | ||
* 创建项目 | ||
``` | ||
# 进入并开启 homestead | ||
cd ~/Homestead && vagrant up | ||
vagrant ssh | ||
# 此时已经进入虚拟机 | ||
cd ~/Code | ||
composer create-project laravel/laravel o2o --prefer-dist "5.5.*" | ||
# 创建 o2o 项目,用 5.5 的 laravel | ||
``` | ||
* 在本地的配置 | ||
``` | ||
# 用记事本打开 hosts ,增加站点 | ||
notepad C:/Windows/System32/Drivers/etc/hosts | ||
~~~ 192.168.10.10 o2o.test ~~~ | ||
# 编辑 ~/Homestead/Homestead.yaml ,增加映射关系 | ||
~~~ | ||
# 站点配置 | ||
sites: | ||
# o2o | ||
- map: o2o.test | ||
to: /home/vagrant/Code//public | ||
# 数据库 | ||
databases: | ||
# o2o | ||
- o2o | ||
~~~ | ||
``` | ||
> 配置完成后需要重载 `vagrant provision` (重读配置文件), `vagrant reload`(重启 Homestead ) | ||
* 项目配置文件 | ||
``` | ||
# .env | ||
APP_NAME=LaraBBS #项目名称 | ||
... | ||
APP_URL=http://larabbs.test #项目网址 | ||
... | ||
DB_DATABASE=larabbs #数据库 | ||
... | ||
# config/app.php | ||
'timezone' => 'Asia/Shanghai', //时区 | ||
'locale' => 'zh-CN', //语言 | ||
# app/Providers/AppServiceProvider.php | ||
use Carbon\Carbon; //引用 Carbon 类 | ||
... | ||
public function boot() | ||
{ | ||
Carbon::setLocale('zh'); // <= 将时间显示设置为中文 | ||
} | ||
``` | ||
* GitHub 托管 | ||
``` | ||
# 在项目路径下依次执行 | ||
git init | ||
git add . | ||
git commit -m "本地项目初始化" | ||
git remote add origin GitHub 仓库地址 ssh | ||
git push --set-upstream origin master | ||
``` | ||
> 确保本机有 github 的 ssh key,可以参考 [我的笔记](https://github.com/prohorry-me/notes/blob/master/%E7%B3%BB%E7%BB%9F%E5%92%8C%E8%BD%AF%E4%BB%B6%E4%BD%BF%E7%94%A8/a%E4%B8%80%E5%8F%B0%E6%96%B0%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%9A%84%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB.md) 中的第4点。 | ||
# 用户角色 | ||
> 统一都用 users 表存储用户信息。 | ||
> 有一个字段 `level` 标识用户级别:0普通用户,1门店店长,2管理员,3站长。 | ||
> 辅以 laravel_permission 完成权限认证。 | ||
* -1,游客:能访问主页、看所有门店、看所有商品、能登陆和注册。 | ||
* 0,普通用户:拥有上面所有权限,且能操作购物车,生成订单。(普通用户和游客用 laravel 自带的中间件隔离) | ||
* 1,门店店长:拥有上面所有权限,且能访问门店管理后台,管理自己的门店信息,为门店添加删除和编辑商品。 Shopowner | ||
* 2,管理员:拥有上面所有权限,且能访问后台,管理门店,商品,订单。 Maintainer | ||
* 3,站长,拥有所有权限。 Founder | ||
|
||
# 布局模板 | ||
* 思考:整个项目应该有3个大的模块 | ||
1. 游客和普通用户能访问的前台 => 展示所有门店、商品。购物车。完成购买操作等。 | ||
2. 门店店长能访问的门店管理后台 => 展示自己的商品、订单、能够对商品和订单完成一定的操作,可以在后台编辑个人资料等。 | ||
3. 管理员和站长能访问的后台=> 展示所有用户、所有门店、所有商品、所有订单。 | ||
* 结论如下: | ||
1. 前台用框架自带的用户认证脚手架自动生成的布局模板 | ||
2. 门店管理后台需要自己写并配置访问权限 | ||
3. 后台用 laravel_administrator 插件 | ||
* 开始完善前台: | ||
1. 编辑迁移文件 create_users_table.php | ||
``` | ||
// up() 方法中声名增加字段 level (用户等级), avatar(用户头像) | ||
$table->integer('level')->unsigned()->default(0); | ||
$table->string('avatar')->nullable(); | ||
``` | ||
2. 填充示例数据 | ||
* 编辑 UserFactory | ||
``` | ||
<?php | ||
use Faker\Generator as Faker; | ||
use Carbon\Carbon; | ||
$factory->define(App\User::class, function (Faker $faker) { | ||
$now = Carbon::now()->toDateTimeString(); | ||
return [ | ||
'name' => $faker->name, | ||
'email' => $faker->unique()->safeEmail, | ||
'password' => bcrypt('ceshi'), | ||
'created_at' => $now, | ||
'updated_at' => $now, | ||
'remember_token' => str_random(10), | ||
]; | ||
}); | ||
``` | ||
* 创建填充器 `php artisan make:seeder UsersTableSeeder` 并编辑 | ||
``` | ||
<?php | ||
use Illuminate\Database\Seeder; | ||
use App\User; | ||
class UsersTableSeeder extends Seeder | ||
{ | ||
public function run() | ||
{ | ||
$users = factory(User::class)->times(10)->make(); | ||
$users = $users->makeVisible(['password', 'remember_token'])->toArray(); // 这一步必须否则写不进数据库 | ||
User::insert($users); | ||
// 配置站长 | ||
$user = User::find(1); | ||
$user->name = "Founder"; | ||
$user->email = "[email protected]"; | ||
$user->password = bcrypt('woshiceshiyonghu'); | ||
$user->save(); | ||
} | ||
} | ||
``` | ||
* 编辑 DatabaseSeeder@run 添加 `$this->call(UsersTableSeeder::class);`,然后执行迁移并填充用户表 `php artisan migrate --seed` | ||
3. 生成用户认证脚手架 `php artisan make:auth` | ||
> 安装 node 包、汉化视图等省略。 | ||
> 生成的布局模板 ../layouts/app.blade.php 的内容中没有用 `<div class"container">` 将内容包起来,但是我们前台所有页面都要用 container 容器,就直接添加这个样式,再把其他视图最外面的容器给干掉。 | ||
* 编辑一下路由:(不要 '/home' 路由,用 '/' 路由代替) | ||
``` | ||
// 用户认证 | ||
Auth::routes(); | ||
// 根 | ||
Route::get('/', 'PagesController@index')->name('root'); | ||
``` | ||
* 编辑一下登陆注册等控制器的重定向地址,不要让他们跳 '/home',跳 '/'。(全局查找,逐一替换) | ||
* 创建控制器 `php artisan make:controller PagesController`,并编辑 PagesController@index | ||
``` | ||
/** | ||
* 首页 | ||
*/ | ||
public function index() | ||
{ | ||
return view('pages.index'); | ||
} | ||
``` | ||
* 编辑视图 ../pages/index.blade.php (暂时没什么需要编辑的内容,以后首页拿来展示推荐位,略) | ||
4. 重置密码功能 | ||
* .env 中配置 smtp 服务,略。 | ||
* 重置密码邮件是全英文的问题: | ||
* 新建通知类 `php artisan make:notification ResetPassword`,并编辑 | ||
``` | ||
<?php | ||
namespace App\Notifications; | ||
use Illuminate\Bus\Queueable; | ||
use Illuminate\Notifications\Notification; | ||
use Illuminate\Contracts\Queue\ShouldQueue; | ||
use Illuminate\Notifications\Messages\MailMessage; | ||
class ResetPassword extends Notification | ||
{ | ||
public $token; | ||
public function __construct($token) | ||
{ | ||
$this->token = $token; | ||
} | ||
public function via($notifiable) | ||
{ | ||
return ['mail']; | ||
} | ||
public function toMail($notifiable) | ||
{ | ||
return (new MailMessage) | ||
->subject('重置密码') | ||
->line('这是一封密码重置邮件,如果是您本人操作,请点击以下按钮继续:') | ||
->action('重置密码', url(route('password.reset', $this->token, false))) | ||
->line('如果您并没有执行此操作,您可以选择忽略此邮件。'); | ||
} | ||
} | ||
``` | ||
* 重写方法 User@endPasswordResetNotification | ||
``` | ||
use App\Notifications\ResetPassword; //引用通知类 | ||
... | ||
// 重写 trait 提供的方法 Notifiable@sendPasswordResetNotification | ||
public function sendPasswordResetNotification($token) | ||
{ | ||
$this->notify(new ResetPassword($token)); | ||
} | ||
``` | ||
* 生成邮件模板视图 `php artisan vendor:publish --tag=laravel-notifications` ,汉化底部、 | ||
5. 汉化错误提示,安装扩展包 overtrue/laravel : `omposer require "overtrue/laravel-lang:~3.0"` 即可。 | ||
6. 注册页面的验证码 | ||
* 安装扩展包 `composer require "mews/captcha:~2.0"` | ||
* 注册页视图添加表单项(样式也需要在 app.scss 中美化一下,略) | ||
``` | ||
<div class="form-group {{ $errors->has('captcha') ? ' has-error' : '' }}"> | ||
<label for="captcha" class="col-md-4 control-label">验证码</label> | ||
<div class="col-md-6"> | ||
<input id="captcha" class="form-control" name="captcha" > | ||
<img class="thumbnail captcha" src="{{ captcha_src('flat') }}" onclick="this.src='/captcha/flat?'+Math.random()" title="点击图片重新获取验证码"> | ||
@if ($errors->has('captcha')) | ||
<span class="help-block"> | ||
<strong>{{ $errors->first('captcha') }}</strong> | ||
</span> | ||
@endif | ||
</div> | ||
</div> | ||
``` | ||
* 在 RegisterController@validator 中配置验证码校验 | ||
``` | ||
return Validator::make($data, [ | ||
'name' => 'required|string|max:255', | ||
'email' => 'required|string|email|max:255|unique:users', | ||
'password' => 'required|string|min:6|confirmed', | ||
'captcha' => 'required|captcha', // <= 添加验证规则 | ||
], [ | ||
// 添加错误提示信息 | ||
'captcha.required' => '验证码不能为空', | ||
'captcha.captcha' => '请输入正确的验证码', | ||
]); | ||
``` | ||
7. 用户编辑个人信息 | ||
* routes/web.php 新增路由 `Route::resource('/users', 'UsersController', ['only' => ['show', 'edit', 'update']]);` | ||
* 新建视图 ../users/show.blade.php 以及 edit.blade.php | ||
* 在 app.blade.php 中增加入口(当用户的登陆之后有一个下拉菜单,增加 “个人信息” 和 “编辑资料” 按钮),略 | ||
* 创建控制器 UsersController `php artisan make:controller UsersController --model=User --resource` 并编辑 | ||
``` | ||
/** | ||
* 用户资料展示 | ||
*/ | ||
public function show(User $user) | ||
{ | ||
return view('users.show', compact('user')); | ||
} | ||
/** | ||
* 用户编辑个人资料 | ||
*/ | ||
public function edit(User $user) | ||
{ | ||
return view('users.edit', compact('user')); | ||
} | ||
/** | ||
* 更新用户资料 | ||
*/ | ||
public function update(Request $request, User $user) | ||
{ | ||
// 验证数据 | ||
$data = $this->validate($request, [ | ||
'name' => 'required|min:4|max:32', | ||
'avatar' => 'required', | ||
'password' => 'nullable|min:10|max:64|confirmed', | ||
],[ | ||
'avatar.required' => '必须上传头像', | ||
]); | ||
$user->name=$data['name']; | ||
$user->avatar=$data['avatar']; | ||
if(!empty($data['password'])) { | ||
$user->password = bcrypt($data['password']); | ||
} | ||
$user->save(); | ||
if(empty($data['password'])) { | ||
session()->flash('success', '更新个人信息成功'); | ||
return redirect()->route('users.show', $user->id); | ||
}else { | ||
Auth::logout(); | ||
session()->flash('info', '由于您修改了个人密码,请重新登陆'); | ||
return redirect()->route('login'); | ||
} | ||
} | ||
``` | ||
> 上面一些过程中用到了 “闪存消息” 以及 “错误提示信息” ,他们的视图作为组件存于 ../layouts/_errors.blade.php 和 _messages.blade.php | ||
* 集成头像上传功能参考 [DEMO](https://github.com/prohorry-me/laravel_image_uploader_demo) | ||
> 这个插件部署过程中需要生成软连接,无法生成的话,就用管理员模式登陆 homestead 再生成。 |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.