Let's Go احراز هویت کاربر › راه‌اندازی مسیرها
قبلی · فهرست · بعدی
فصل ۱۰.۱.

راه‌اندازی مسیرها

بیایید این بخش را با اضافه کردن پنج مسیر جدید به برنامه خود شروع کنیم، به طوری که به این صورت باشد:

Route pattern Handler Action
GET /{$} home نمایش صفحه اصلی
GET /snippet/view/{id} snippetView نمایش یک اسنیپت خاص
GET /snippet/create snippetCreate نمایش فرم ایجاد یک اسنیپت جدید
POST /snippet/create snippetCreatePost ایجاد یک اسنیپت جدید
GET /user/signup userSignup نمایش فرم ثبت‌نام یک کاربر جدید
POST /user/signup userSignupPost ایجاد یک کاربر جدید
GET /user/login userLogin نمایش فرم ورود کاربر
POST /user/login userLoginPost احراز هویت و ورود کاربر
POST /user/logout userLogoutPost خروج کاربر
GET /static/ http.FileServer سرو یک فایل استاتیک خاص

توجه داشته باشید که handlerهای تغییردهنده وضعیت جدید — userSignupPost، userLoginPost و userLogoutPost — همه از درخواست‌های POST استفاده می‌کنند، نه GET.

اگر در حال دنبال کردن هستید، فایل handlers.go خود را باز کنید و placeholderهایی برای پنج تابع handler جدید به این صورت اضافه کنید:

File: cmd/web/handlers.go
package main

...

func (app *application) userSignup(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Display a form for signing up a new user...")
}

func (app *application) userSignupPost(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Create a new user...")
}

func (app *application) userLogin(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Display a form for logging in a user...")
}

func (app *application) userLoginPost(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Authenticate and login the user...")
}

func (app *application) userLogoutPost(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Logout the user...")
}

سپس وقتی که انجام شد، بیایید مسیرهای مربوطه را در فایل routes.go ایجاد کنیم:

File: cmd/web/routes.go
package main

...

func (app *application) routes() http.Handler {
    mux := http.NewServeMux()

    fileServer := http.FileServer(http.Dir("./ui/static/"))
    mux.Handle("GET /static/", http.StripPrefix("/static", fileServer))

    dynamic := alice.New(app.sessionManager.LoadAndSave)

    mux.Handle("GET /{$}", dynamic.ThenFunc(app.home))
    mux.Handle("GET /snippet/view/{id}", dynamic.ThenFunc(app.snippetView))
    mux.Handle("GET /snippet/create", dynamic.ThenFunc(app.snippetCreate))
    mux.Handle("POST /snippet/create", dynamic.ThenFunc(app.snippetCreatePost))

    // Add the five new routes, all of which use our 'dynamic' middleware chain.
    mux.Handle("GET /user/signup", dynamic.ThenFunc(app.userSignup))
    mux.Handle("POST /user/signup", dynamic.ThenFunc(app.userSignupPost))
    mux.Handle("GET /user/login", dynamic.ThenFunc(app.userLogin))
    mux.Handle("POST /user/login", dynamic.ThenFunc(app.userLoginPost))
    mux.Handle("POST /user/logout", dynamic.ThenFunc(app.userLogoutPost))

    standard := alice.New(app.recoverPanic, app.logRequest, commonHeaders)
    return standard.Then(mux)
}

در نهایت، همچنین باید partial nav.tmpl را به‌روزرسانی کنیم تا آیتم‌های ناوبری برای صفحات جدید را شامل شود:

File: ui/html/partials/nav.tmpl
{{define "nav"}}
<nav>
    <div>
        <a href='/'>Home</a>
        <a href='/snippet/create'>Create snippet</a>
    </div>
    <div>
        <a href='/user/signup'>Signup</a>
        <a href='/user/login'>Login</a>
        <form action='/user/logout' method='POST'>
            <button>Logout</button>
        </form>
    </div>
</nav>
{{end}}

اگر دوست دارید، می‌توانید در این مرحله برنامه را اجرا کنید و باید آیتم‌های جدید را در نوار ناوبری به این صورت ببینید:

10.01-01.png

اگر روی لینک‌های جدید کلیک کنید، باید با پاسخ متنی placeholder مربوطه پاسخ دهند. به عنوان مثال، اگر روی لینک ‘Signup’ کلیک کنید، باید پاسخی مشابه این ببینید:

10.01-02.png