国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

20151103addinfo-laravel小練習-小結

jackzou / 3254人閱讀

摘要:學習了一段時間的小結一下最近做的小任務寫下來才知道好亂糟糟,還是以記錄學習的資料為主,寫的很糟糕,還需要再揣度多屢屢思路。

學習了一段時間的laravel,小結一下最近做的laravel小任務,寫下來才知道好亂糟糟,還是以記錄學習的資料為主,寫的很糟糕,還需要再揣度多屢屢思路。
20151103-16

源碼地址:https://github.com/dingyiming/xc-addinfo-1103

學習資料:

laravel學院

laravist.com

laracasts.com

laravelcollective

vuejs

預先準備

關節點

登錄

用戶信息增改刪查與權限區分

員工管理與權限區分

字段查詢

修改個人密碼

前端vue-form驗證

dingo/API + vue-resource 唯一性判斷

添加Oauth2.0

拓展

預先準備

學習了laravel

創建項目 :打開終端,新建文件夾mkdir dev,下載laravel項目源碼

composer create-project laravel/laravel addinfo

php artisan server 訪問localhost:8000查看

配置好.env數據庫配置

在我學了一陣子的laravel后,感覺到有很多東西都是了解到,但卻不清晰,然后接到這個任務我開始著手實踐一下,自然沒想象的那么順利,其中遇到了很多看起來很基礎的問題,往往會卡我半天甚至是一天,真的蠻郁悶的,在自己的草稿本上多少有些殘留,回顧一下,很有收獲,其中得到了laravel學院和Laravist.com很大的幫助,非常感謝

剛剛開始的時候,我恰巧看了Laravist.com關于API的那一個系列教程(60元),我按著他得路子做了一些開頭,我其實是很想用vuejs做成SPA的,不過自己還不會做,還是應該先以完成任務為目標,一步步改進自己,所以還是使用模板Blade來渲染視圖。

我先用bootstrap做了下頁面,也由于一些原因,還沒用上SCSS,希望后面有時間可以嘗試改進一下,在此就不放頁面樣式了,主要做些關鍵點的記錄,現在想想還是一團糟的,得抓重點回憶。

關節點

我覺著在往常的web應用中主要是這幾個關節點:
1.數據庫連接配置: .env
2.路由 : (訪問的URL)從哪里去找誰(一般找控制器) http://laravelacademy.org/post/53.html
3.控制器 : 寫邏輯操作和少量的數據驗證與數據操作(Eloquent很快捷)http://laravelacademy.org/post/60.html
4.數據處理: 輔助控制器進行一些數據處理與快捷映射,

模型類 : app/Http/Model

請求驗證Requests : app/Http/Requests

數據倉庫Repositories: app/Http/Repositories (laravel不自帶)
數據倉庫Repositories配置方法:http://segmentfault.com/a/1190000003488038

5.把結果數據傳遞給視圖:視圖渲染頁面(blade) ,視圖基本上都是使用bladeIlluminateHtml
靜態資源的引用:/assets/css/all.css
參考資料:

http://laravelacademy.org/post/76.html

http://laravelacademy.org/post/79.html

https://laravist.com/article/14

http://laravelcollective.com/docs/5.1/html

6.在laravel重要的ServiceProvider在config/app.php里配置后可在全局快捷使用;
7.消息反饋 :參考:http://laravelacademy.org/post/68.html
在控制器中使用larvel一次性Session:

 $request->session()->flash("status1", $msg1);

在視圖中判斷顯示

@if(session("status1"))
    
@endif

登錄

我把用戶信息的增改刪查作為resource路由,接著是因為用戶信息的操作是需要用戶登錄才操作的,所以,我跟著laravel學院的教程做了下laravel內置的auth注冊登錄;
使用laravel內置 auth,
參考資料:http://laravelacademy.org/post/1258.html

laravel自帶了開箱即用的auth注冊登錄(只需要配置一下路由和視圖),已有用戶模型AppUser,控制器在appHttpControllersAuthAuthController.php

默認是使用email進行注冊登錄,可以在AuthController.php里進行修改一些驗證以及默認的登錄字段 protected $username = "name";

自動生成表 php artisan migrate 數據庫出現三張表

添加登錄路由,在appHttp outes.php

創建視圖 在resources/views/auth/login.blade.php

表單如果是自己寫得HTML,需要加上隱藏的csrf_tokern,
在blade中form下輸入 {!! csrf_field()!!}即可;

修改登錄成功后的跳轉地址,
appHttpControllersAuthAuthController.php中添加protected $redirectPath = "/userinfo";

現在可以正常注冊登錄了,然而我在這里遇到個坑,是關于密碼加密的,如果改了加密方法卻沒改校驗方法,就永久登錄失敗(注冊成功后會自動登錄,退出后將不能登錄,報錯信息為:These credentials do not match our records)
laravel在auth中使用了 "password" => bcrypt($data["password"]) 即使用了內置的bcrypt()方法加密,這是不可逆的Hash加密,并且我自己還比對了下,發現每次相同字符串生成的密文還是不同的,如果需要驗證這個加密,就使用Hash::check($input, $oldpwd)驗證,返回值為true/false

顯示錯誤

@if (count($errors) > 0)
//此處添加錯誤反饋,
//例: swal("對不起", "xxx", "error");//sweetalert不過有點過,

//可以使用bootstrap的alert
@endif
用戶信息增改刪查與權限區分

權限區分 http://laravelacademy.org/post/577.html
我在表中添加了用于區分權限的字段,在app/Providers/AuthServiceProvider.php中進行權限分配:

 public function boot(GateContract $gate)
    {
        parent::registerPolicies($gate);

        //權限1,可以查看全部錄入的信息,以及所有員工
        $gate->define("see-all", function ($user) {
            return $user->authority === 1;
        });

        //權限2,可以查看部門提交的數據
        $gate->define("see-dep", function ($user) {
            return $user->authority === 2;
        });

        //權限3,可以查看自己提交的數據
        $gate->define("see-me", function ($user) {
            return $user->authority === 3;
        });
    }

路由

//登錄用戶才能訪問進行用戶信息操作
Route::group(["middleware" => "auth"], function () {
    resource("userinfo", "UserinfosController");
});

Model設置,對應表、可填充字段、表關聯

資料:http://laravelacademy.org/post/140.html
逆向的遠層一對多:https://github.com/znck/belongs-to-through

 protected $table = "userinfos";

    protected $fillable = [
        "phone",
        "name",
        "email",
    ];

    //多個信息對應一個錄入信息的人
    public function user()
    {
        return $this->belongsTo("AppUser", "addman_id", "id");
    }

    //格式化生日時間
    public function setBirthdayAttribute($birthday)
    {
        return $this->attributes["birthday"] = Carbon::createFromFormat("Y-m-d", $birthday);
    }

    //userinfo按照用戶ID倒序
    public function scopeOrdered($query)
    {
        $query->OrderBy("userinfos.id", "desc");
    }

控制器

//分權限顯示用戶信息
    public function index(Request $req)
    {
        $datas = null;
        switch ($req) {
            case $req->user()->can("see-all"):
                $datas = $this->userinfos->selectAll();
                break;
            case $req->user()->can("see-dep"):
                $datas = $this->userinfos->selectDep($this->user["dep_id"]);
                break;
            case $req->user()->can("see-me"):
                $datas = $this->userinfos->selectMe($this->user["id"]);
                break;
        }
        if ($datas) return view("userinfo.index", compact("datas"));
        return $this->responseResult(null, $req, "查詢失敗", null, "userinfo");
    }

自建的數據倉庫 App/Repositories/UserinfoRepository.php

public function selectAll()
    {
        return Userinfo::ordered()->Paginate(env("PAGE_ROWS"));
    }

    public function selectDep($dep_id)
    {
        return Department::find($dep_id)
            ->userinfos()
            ->ordered()
            ->Paginate(env("PAGE_ROWS"));
    }

    public function selectMe($user_id)
    {
        return User::find($user_id)
            ->userinfos()
            ->ordered()
            ->Paginate(env("PAGE_ROWS"));
    }

視圖,省略。。。

上面主要記錄了分權限進行的錄入信息查看,其它增改刪都會基于這里,具體看源碼

基于權限的員工管理

routes.php

//員工管理
Route::group(["middleware" => "auth"], function () {
    resource("users", "UsersController");
});

Model :app/User.php

  protected $table = "users";
    protected $fillable = ["email", "password", "realname", "dep_id", "authority"];
    protected $hidden = ["password", "remember_token"];

    //一個錄入信息的人對應多個錄入的信息
    public function userinfos()
    {
        return $this->hasMany("AppUserinfo", "addman_id", "id");
    }

    //一個員工屬于一個部門
    public function dep()
    {
        return $this->belongsTo("AppDepartment", "dep_id", "id");
    }

控制器 UsersController.php

//顯示員工管理頁面
    public function index(Request $request)
    {
        switch ($request) {
            case $request->user()->can("see-all"):
                $users = $this->users->getAllUser();
                break;
            case $request->user()->can("see-dep"):
                $users = $this->users->getDepUser($this->auth["dep_id"]);
                break;
            default :
                return $this->responseResult(null, $request, "你沒有權限", "", "userinfo");
        }
        return view("user.index", compact("users"));
    }

UserRepository.php

class UserRepository implements UserRepositoryInterface
{
    public function getAllUser()
    {
        return $this->alluser()->Paginate(env("PAGE_ROWS"));
    }

    public function getDepUser($dep_id)
    {
        $users = $this->alluser();
        return $users->where("dep_id", $dep_id)->Paginate(env("PAGE_ROWS"));
    }

    private function alluser()
    {
        $users = User::with("dep")
            ->select("users.*", "departments.dep_name")
            ->leftJoin("departments", "departments.id", "=", "users.dep_id")
            ->OrderBy("dep_id");
        return $users;
    }
}
字段查詢

->where($field, "like", "%" . $data . "%")

 //搜索姓名/手機/身份證
    public function search(Request $req)
    {
        $name = $req->input("name");
        $phone = $req->input("phone");
        $identity = $req->input("identity");

        switch (true) {
            case !empty($name):
                $datas = $this->userinfos->search($req, "name", $name);
                break;
            case !empty($phone):
                $datas = $this->userinfos->search($req, "phone", $phone);
                break;
            case !empty($identity):
                $datas = $this->userinfos->search($req, "identity", $identity);
                break;
            default:
                return $this->responseResult(null, $req, "請填寫查詢條件", "", "userinfo");
        }
        if ($datas->total() > 0) return view("userinfo.index", compact("datas"));
        return $this->responseResult(null, $req, "查詢不到你要的內容", "", "userinfo");
    }

對搜索也限定了權限

public function search($req, $field, $data)
    {
        switch ($req) {
            case $req->user()->can("see-all"):
                return $this->commonWhere($field, $data)
                    ->Paginate(env("PAGE_ROWS"));
                break;
            case $req->user()->can("see-dep"):
                $dep_id = $req->user()["dep_id"];
                return Department::findOrFail($dep_id)
                    ->userinfos()
                    ->where($field, "like", "%" . $data . "%")
                    ->ordered()
                    ->Paginate(env("PAGE_ROWS"));
                break;
            case $req->user()->can("see-me"):
                return $this->commonWhere($field, $data)
                    ->where("addman_id", $req->user()["id"])
                    ->Paginate(env("PAGE_ROWS"));
                break;
        }
    }
修改個人密碼

關鍵也就是前面在登錄提到的加密和驗證密碼的問題,用了laravel自帶方法:bcrypt()(即Hash::make())和Hash::check("輸入的老密碼","原密碼")

//更改密碼
    public function updatereset(Request $request)
    {
        $this->validate($request, [
            "old_password" => "required",
            "new_password" => "required | confirmed",
        ]);

        $user = User::find($this->auth["id"]);
        $input = $request->all();
        $old_pwd0 = $user["password"];
        $old_pwd1 = $input["old_password"];
        if (Hash::check($old_pwd1, $old_pwd0)) {
            $user->password = Hash::make($input["new_password"]);
            $res = $user->save();
            return $this->responseResult($res, $request, "修改失敗", "修改成功", "/userinfo");
        }
        return $this->responseResult(null, $request, "原密碼不正確", "", "/users/resetpwd");
    }
前端vue-form驗證

vuejs官網 : http://cn.vuejs.org
vuejs: https://github.com/vuejs/vue
vue-form : https://github.com/fergaldoyle/vue-form

頁面需要添加一些標識

{!! csrf_field() !!} 登錄
* 請輸入正確的郵箱
* 請輸入密碼 * 請輸入6到16位密碼 * 請輸入6到16位密碼

js代碼

new Vue({
    el: "#app",
    data: {
        myform: {},
        model: {}
    },
    methods: {
        onSubmit: function() {
            console.log(this.myform.$valid);
            if(this.myform.$valid == true)
                $("#myform").submit();
        }
    }
});
dingo/API + vue-resource 唯一性判斷

dingo/API : https://github.com/dingo/api
vue-resource : https://github.com/vuejs/vue-resource

composer.json

 "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
        "illuminate/html": "^5.0",
        "lucadegasperi/oauth2-server-laravel": "5.0.*",
        "dingo/api": "1.0.*@dev"
    },

app.php配置

//dingo/api
DingoApiProviderLaravelServiceProvider::class

.env配置

API_STANDARDS_TREE=vnd
API_PREFIX=api
API_VERSION=v1
API_DEBUG=true

路由

//dingo/api
$api = app("DingoApiRoutingRouter");
$api->version("v1", function ($api) {
    $api->group(["namespace" => "AppApiControllers"], function ($api) {
        $api->get("onephone/{params}", "ValidController@onephone");
        $api->get("oneidentity/{params}", "ValidController@oneidentity");
    });
});

app/Api/Controllers/BaseController.php

class BaseController extends Controller
{
    use Helpers;//使用Dingo內置幫助函數
}

其它Controller繼承BaseController.php,從而使用Dingo內置幫助函數

vue-resource https://github.com/vuejs/vue-resource

 onephone: function () {
            this.$http.get("/api/onephone/" + this.model.phone.trim(), function (data, status, request) {
                if (data == 0) {
                    this.model.onephone = false;
                }
                if (data == 1) {
                    console.log(data);
                    this.model.onephone = true;
                }
            }).error(function (data, status, request) {
            });
        },
添加Oauth2.0

laravel-Oauth2.0 :https://github.com/lucadegasperi/oauth2-server-laravel

配置

 "providers" => [
//Oauth2.0
LucaDegasperiOAuth2ServerStorageFluentStorageServiceProvider::class,
LucaDegasperiOAuth2ServerOAuth2ServerServiceProvider::class,]

"aliases" =>[
"Authorizer" => LucaDegasperiOAuth2ServerFacadesAuthorizer::class,]

數據表生成

php artisan migrate

路由

//Oauth2登錄
Route::post("oauth/access_token", function () {
    return Response::json(Authorizer::issueAccessToken());
});
拓展

或者說接下來還需要完善的一些東西

scss頁面重構,現在的頁面的確很low;

把前端驗證通過vuejs、vue-form、vue-resource進一步完善;

學習vue-router的使用節省不必要的跳轉;

文檔、文檔、文檔,積累很重要,還有很多要琢磨的東西,一步步來。

能做的太少,要做要學的很多,得計劃著來

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21224.html

相關文章

  • 程序實踐結(一)

    摘要:最近自己在做小程序練習,分享一下我遇到的小坑數據更新直接對進行賦值,是無法更新視圖綁定的數據的,會造成數據不一致需要使用更新暫時不支持絕對路徑不能使用靜態文件,只能使用和網絡圖片可以用 最近自己在做小程序練習,分享一下我遇到的小坑 data數據更新 直接對this.data進行賦值,是無法更新視圖綁定的數據的,會造成數據不一致 需要使用this.setData更新 this.dat...

    tianhang 評論0 收藏0
  • 手把手教你擴展個人微信號(1)

    摘要:關于本教程有任何建議或者疑問,都歡迎郵件與我聯系,或者在上提出教程流程簡介教程將會從如何分析微信協議開始,第一部分將教你如何從零開始獲取并模擬擴展個人微信號所需要的協議。 現在的日常生活已經離不開微信,難免會生出微信有沒有什么API可以使用的想法。 那樣就可以拿自己微信做個消息聚合、開個投票什么的,可以顯然沒有這種東西。 不過還好,有網頁版微信不就等于有了API么,這個項目就是出于這個...

    siberiawolf 評論0 收藏0
  • 我的Java開發之路

    摘要:提高有了入門的基礎,開始自學當時流行的三大框架和。業余的時間,經常在上閑逛,看一些博客或開源的代碼。 最近有一位小伙伴通過公眾號給我留言, 我參加工作沒多久,看著圈里的技術大牛,特別羨慕,也渴望成為技術大牛,想讓您分享一下從小白到大牛是怎樣練成的,我該如何提高自己 首先,謝謝這位小伙伴的一直關注。其次,我并不是大牛,只是早搬了幾年的磚而已,不過可以分享一下我的Java開發之路。 入門 ...

    lidashuang 評論0 收藏0
  • 面試寶典

    摘要:有談談面試與面試題對于前端面試的一些看法。動態規劃算法的思想及實現方法幫大家理清動態規劃的解決思路以及原理方法前端經典面試題從輸入到頁面加載發生了什么這是一篇開發的科普類文章,涉及到優化等多個方面。極客學院前端練習題道練習題,面試季練練手。 由數據綁定和排序引入的幾個 JavaScript 知識點 在 JavaScript 的數據綁定和做簡單的表格排序中遇到的幾個知識點 [[JS 基礎...

    neu 評論0 收藏0
  • 前端練級攻略(第一部分)

    摘要:第一部分介紹了如何使用和開發接口。由于系統變得越來越復雜,人們提出了稱為預處理器和后處理器的工具來管理復雜性。當您第一次得知有預處理器和后處理器時,你很有可能在任何地方已經使用它們。我之前建議的文章,,也涵蓋了預處理器相關的知識。 我記得我剛開始學習前端開發的時候。我看到了很多文章及資料,被學習的資料壓得喘不過氣來,甚至不知道從哪里開始。 本指南列出前端學習路線,并提供了平時收藏的一些...

    qpal 評論0 收藏0

發表評論

0條評論

jackzou

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<