98 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package auth
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"log"
 | |
| 	"net/http"
 | |
| 
 | |
| 	"management/internal/erpserver/model/form"
 | |
| 	v1 "management/internal/erpserver/service/v1"
 | |
| 	"management/internal/erpserver/templ/auth"
 | |
| 	"management/internal/pkg/binding"
 | |
| 	"management/internal/pkg/mid"
 | |
| 	"management/internal/pkg/render"
 | |
| 	"management/internal/pkg/session"
 | |
| 
 | |
| 	"github.com/drhin/logger"
 | |
| )
 | |
| 
 | |
| type App struct {
 | |
| 	log            *logger.Logger
 | |
| 	sm             session.Manager
 | |
| 	render         render.Renderer
 | |
| 	captchaService v1.CaptchaService
 | |
| 	userService    v1.UserService
 | |
| }
 | |
| 
 | |
| func NewApp(
 | |
| 	log *logger.Logger,
 | |
| 	sm session.Manager,
 | |
| 	render render.Renderer,
 | |
| 	captchaService v1.CaptchaService,
 | |
| 	userService v1.UserService,
 | |
| ) *App {
 | |
| 	return &App{
 | |
| 		log:            log,
 | |
| 		sm:             sm,
 | |
| 		render:         render,
 | |
| 		captchaService: captchaService,
 | |
| 		userService:    userService,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (a *App) login(w http.ResponseWriter, r *http.Request) {
 | |
| 	ctx := r.Context()
 | |
| 	switch r.Method {
 | |
| 	case http.MethodGet:
 | |
| 		u := mid.GetUser(ctx)
 | |
| 		if u.ID > 0 {
 | |
| 			if err := a.sm.RenewToken(ctx); err == nil {
 | |
| 				http.Redirect(w, r, "/home.html", http.StatusFound)
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		_ = a.sm.Destroy(ctx)
 | |
| 		component := auth.Login(ctx)
 | |
| 		a.render.Render(ctx, w, component)
 | |
| 	case http.MethodPost:
 | |
| 		defer func(Body io.ReadCloser) {
 | |
| 			err := Body.Close()
 | |
| 			if err != nil {
 | |
| 				a.log.Error(err.Error(), err)
 | |
| 			}
 | |
| 		}(r.Body)
 | |
| 		var req form.Login
 | |
| 		if err := binding.Form.Bind(r, &req); err != nil {
 | |
| 			e := binding.ValidatorErrors(err)
 | |
| 			a.render.JSONErr(w, e)
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		if !a.captchaService.Verify(req.CaptchaID, req.Captcha, true) {
 | |
| 			a.render.JSONErr(w, "验证码错误")
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		req = req.SetAttributes(r)
 | |
| 		err := a.userService.Login(ctx, &req)
 | |
| 		if err != nil {
 | |
| 			log.Println(err)
 | |
| 			a.render.JSONErr(w, err.Error())
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		a.render.JSONOk(w, "login successfully")
 | |
| 	default:
 | |
| 		http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (a *App) logout(w http.ResponseWriter, r *http.Request) {
 | |
| 	err := a.sm.Destroy(r.Context())
 | |
| 	if err != nil {
 | |
| 		a.log.Error(err.Error(), err)
 | |
| 	}
 | |
| 	http.Redirect(w, r, "/", http.StatusFound)
 | |
| }
 |