【log】12/11 checking project:(Laravel)snsTest

环境准备以及laravel安装

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. Use self to refer to the current class. In other words, use $this->member for non-static members, use self::$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

  1. 修改config/app.php

  2. 'locale' => 'zh',时区也可以修改为'PRC'。

  3. 在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:

  1. profile表单验证

  2. 用户搜索

  3. 留言板界面,表情,时间几天前

  4. 用户头像

  5. 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;

转载于:https://my.oschina.net/sikou/blog/536046

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值