环境准备以及laravel安装
composer create-project laravel/laravel snsTest
problem:下载下来的laravel无法启动服务器,会报错。
之前看的教程似乎还要改些什么,嫌麻烦用的在LaraBase上介绍过的一键安装包: http://www.golaravel.com/download/
php artisan serve启用的是8000端口,这里换个8888启动服务器,设置:
php -s localhost:8888 -t public
登录界面准备以及数据库建表
新建了一个Sites controller
php artisan make:controller Sitescontroller
在新建的controller里注册login方法:
public function login(){ return view('sites.login'); }
在Views视图文件夹下新建sites/login.blade.php。
problem:div水平垂直居中,更改submit样式[backgroud:rgba()],a:hover{text-decoration:none;}
数据库建表:users.sql
差点不准要用户邮箱,但是同事说让用户记id也不可能,我一想也是。所以字段内容就比较多了。
数据库连接,修改env.文件:
DB_HOST=localhost
DB_DATABASE=snsTest
DB_USERNAME=root
DB_PASSWORD=""
建表的时候又了解到一些SQL的数据结构:比如int(4 byte)和tinyint(1 byte),time(3 byte)和datetime(8 byte)等区别
然后我想再加个功能,就是用户可以看到自己的留言,需要用到关联表:
http://database.51cto.com/art/201010/230077.htm
上面的做法有误
laravel有自己一套登录注册体系……http://laravelacademy.org/post/1258.html
在auth文件夹下有相应的authController,在database\migration中也有拟建好的user表……
在想要确认登录使用postLogin方法时,报错:
problem:TokenMismatchException in VerifyCsrfToken.php line 53
解决办法:在form表单中再添加下面代码:
{!! csrf_field() !!}
或者:
<input type="hidden" name="_token" value="{!! csrf_token() !!}">
刚看到的一篇文章,见识了各种登录……:http://laravelbase.com/collections/1/51#
嗯继续报错:
problem: Class 'App\Http\Controllers\Auth\Auth' not found
解决办法:在AuthController上面加上:use Auth;
2015/11/27
一次作死之旅,修改了端口,php -S localhost:1026 -t punlic
不知道动了什么,总之数据库连不上了(血泪教训=-=总之不要乱改,底层问题还要钻研)
也找不到配置文件里的bin-address,同事建议重装WAMP,重装后我很开心,因为连上了?然而还是error,表找不到,drop不能create不能,记得卸载WAMP时有留下bin、www、alias文件夹,MySQL的各种文件配置都在,查到又说drop不行就直接去文件夹下删掉就好了,database是以directory存在,当file没有的时候就删不掉。所以删掉了一些database,然后又用Nacicat重建3306连接,好吧能用了(泪目
Controller接受view传过来的值,method=POST
方法一:
use INPUT
(方法中添加) $email = Input::get('email') ;
找了很久终于看实打实的代码,看到了第二种方法,小白感激涕零。作者balabala抱怨了一堆真可爱:link
方法二:
public function postLogin(Request $request){
$credentials = $this->getCredentials($request);}
然后英语要学好!
ThrottlesLogins:用于限制登录次数的
真是越来越糟糕,
problem:always redirect to loacalhost:8000/home
不管输入什么路径都是,然后看到解决办法:link
没心情看英语,了注释掉了guest的middleware,好使了,今天什么都没干……
卧槽,果然是密码的问题!,靠靠靠靠靠
table里面password字段全是是明文啊啊啊啊啊,authenticate怎么可能通得过!!!!!!
id=7的时候突然有条加密的记录,试了一下就登录成功了,之前也想过是不是这个可能了,但是create方法里是加密了的。
postRegister方法里提交到数据库里的是:
User::create($request->all());
修改为:
Auth::login($this->create($request->all()));
可以看到数据库里密码是加密后的乱码了。problem原理需要了解…………
看了一会儿文档,概念掌握:
Service Container|Facades :dependency injections, Closure
Schema: http://www.golaravel.com/laravel/docs/5.0/schema/ Laravel的字段类型
Query Builder(retrieve join
retireving hobbby用:
PHP和MYSQL中的“逗号”
http://my.oschina.net/dongqiangV/blog/201549
数据迁移
php artisan make:migration create_users_table
结构生成器:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name'); //string相当于varchar
$table->string('email')->unique();
$table->string('password', 60);
$table->char('gender', 2);
$table->tinyInteger('age');
$table->tinyInteger('marriage');
$table->string('hobby');
$table->boolean('public');
$table->dateTime('last_login'); // DATETIME 类型,最近一次登录
$table->softDeletes(); //加入 deleted_at 字段于软删除使用
$table->rememberToken();
$table->timestamps();// DATETIME 注册时间
});
本来只用了timestamp(create_at),但是登录的时候再connect.php找不到updated_at字段报错……算了就用timestamps了。
数据填充
seeds下可以向数据库中插入数据,这里用:
php artisan make:seeder UserTableSeeder
再seeds文件下可以看到新建的seeder文件,先填充一个admin来登录用,
DB::table('users')->insert([
'name' => 'admin',
'email' => 'admin'.'@admin.com',
'password' => bcrypt('123456'),
'gender' => '女',
'age' => '21',
]);
发现直接存入年龄是很不合理的,所以想把age字段改为birthday,发现Laravel有修改字段的功能:
http://laravel-china.org/docs/5.0/schema
http://wenda.golaravel.com/question/386
然而还是失败了,在原来的migration文件上改应该不行,以php artisan migrate:refesh所有的数据表都不在了,我想应该要新建一个migration文件吧。不管了重建就行。
然后把age改为了dateTime类型,不过输出的时候发现跟的有时分秒,看了以前的项目是在model中做了预定义。
2015/12/2
problem:修改mySQL数据类型
又是修改birth字段,发现应该直接用date数据类型而不应该用dateTime!
总算成功了一次:
php artisan make:migration user_birth_change --table=users
然后在新的迁移文件的up方法中加入mySQL语句:
DB::statement("ALTER TABLE Users CHANGE birth birth date");
注意不能忘记down中alter回去。最后php artisan migrate就成功啦!
problem:user/profile与user/{id}冲突
Routes相关,
Route::get('user/profile','UserController@profile');
必须写在
Route::get('/user/{id}','UserController@show');
前面,不然会把profile当做{id}一起传给UserController,哎。
开始做每个用户的message board
problem:建好model与controller后无法识别表格 PDOException: Base table or view not found
在model中加入:| stackoverflow
public $table = "message";
把留言者的name和email使用input type=”hidden“传入”,但是message表里并没有存入,然后看message模型,发现protected $fillable中没有加入这些字段。
2015/12/3
修改table字段
只知道author_id,没有想到好的方法把author_name显示到评论里,所以只好用本办法在message表中再添加一个author_name字段,又用的schema|结构生成器。
up方法:$table->string('author_name')->after('author_id');
down方法:$table->dropColomn('author_name');
昨天的谈话让我意识到session的重要性…………记录下用法
use Session;
//存入session
Session::put('email', "$nowUser->email");
//取出session
session('email');
真正试过之后才觉得session真的很好用,之前总说http什么stateless无状态,也不算能很好的理解吧,看文档说不同的session driver保存在不同的地方,加上cookie,session_id这些概念还是有点晕。
JellyBool有个关于session的文章,以后没事多看看:link
problem:marriage字段的数字显示为相应的中文意义。
关于数据库操作,只知道$users=User::all();然后再return view('user.index',compact('users'));
但是没有仔细想过怎么回事,为了处理marriage字段的数字所以请教了同事,善用var_dump……嗯嗯
然后发现all()返回的是一个对象集合,包含了所有user对象,compact函数可以搜索变量名创建数组。
同事建议我写一个方法判断数字从而转换为中文字符,于是新建了一个public function marriagechange(){}
然后直接$users->marriagechange(),
FatalErrorException :Call to undefined method Illuminate\Database\Eloquent\Collection::marriagechange()
方法是这样的:
public function marriagechange($users)
{
foreach ($users as $user)
{
switch ($user->marriage) {
case '0':
$user->marriage='未婚';
break;
case '1':
$user->marriage='已婚';
break;
case '2':
$user->marriage='离异';
break;
case '3':
$user->marriage='丧偶';
break;
default:
break;
} } }
又找上了万能的stackoverflow:link
$users->marriagechange()
修改一下:
$this->marriagechange($users);
成功了,关于$this这个keyWord的概念,对我来说依然晦涩难懂,继续在stackoverflow上查了一下,都在解释JS里的$(this),比如:
this is a reference to the DOM element of invocation. | link
可以理解为当前的instance么?
所以代表着Object instance?
找到个解释比较清晰的:link
Use
$this
to refer to the current object. Useself
to refer to the current class. In other words, use$this->member
for non-static members, useself::$member
for static members.
做到用户主页的时候发现要显示单个用户信息并不能用这个方法,所以把foreach单独用到index方法中,然后marriagechange就只剩switch判断,单独一个user object也可以调用了: $this->marriagechange($user);
表单验证 | form validation
太懒,最后才来做表单验证,连个request文件都懒得键呵呵,
在postRegister里添加:
$this->validate($request, [
'name' => 'required|max:255|min:3',
'email'=>'required|email|unique:users',
'password'=>'required|alpha_num|between:6,12|confirmed',
'password_confirmation'=>'required|alpha_num|between:6,12'
]);
继续完善表单验证,汉化验证提示信息。link
修改config/app.php
'locale' => 'zh',时区也可以修改为'PRC'。
在resources文件夹下新建zh文件,把en文件夹中的validation.php复制过来然后就可以修改了~
然后是处理last_login字段,在postLogin方法里:
if (Auth::attempt($credentials, $request)) {
$user = $request->user();
$user['last_login']=Carbon::now();
$user->update();
return redirect('user');
}else{
return redirect('auth/login')->with('message','用户或密码错误');
}
突然觉得session的保存似乎也应该放在这儿,之前放在user/index下的,每次请求这个界面都保存一次感觉不怎么好。
做留言板的时候希望实现最新的留言在最前面,还在忧心会不会很麻烦,结果Laravel有latest()这个方法……
$message = Message::latest()->get();
这么快就解决了……
JS逻辑 href="javascript:display()"
一点关于JS的逻辑,做了一个<a href="javascript:display()">来展开和隐藏元素。
但是每次刷新页面后第一次需要click两次才能展开,很苦恼。
后来发现是因为display存在三种情况,“”“none”“block”。
function display(){
var obj=document.getElementById("loginList");
if(obj.style.display=="" || obj.style.display=="none"){
obj.style.display="block";
}else{
obj.style.display="none";}
}
还有就是window.οnlοad=function(),页面加载完的动作也能解决很多想要的效果。
在front end感觉JS万能~
to do TASK:
profile表单验证
用户搜索
留言板界面,表情,时间几天前
用户头像
footer
判断是否公开用户信息(public)
problem:单选,接收不到类型为radio的<input>传的数值
深夜不得不记录一下奇葩的事,input标签的属性,顺序很重要吗?
request一直收不到表单传来的数据让我很奇怪,然后把 type="radio" 放到 id="public" 后面就好了,非常沉醉……
判断是否公开(public字段),本来是想写一个方法的,但是不知道该怎么用,
因为只知道可以User::where('public'.'0');
2015/12/4 2:06
纪念一下,居然写出来了!,$this最高!
public function ispublic(){
$users = User::where('public','0')->paginate(8);
return $users;
}
然后index里调用:
$users = $this->ispublic();
稍微有点理解到了$this的作用!因为$users没有实例化前没有办法调用方法!
返回之前界面
public function delete($mesid)
{
message::where('id',"$mesid")->delete();
return Redirect::back();
}
困扰了我好久的功能……记得 use Redirect;