ltotal il y a 2 ans
Parent
commit
088fe332fc

+ 2 - 0
api/api.go

@@ -1,5 +1,7 @@
 package api
 
+type CommonReq struct{}
+
 type CommonRes struct {
 	Data interface{} `json:"data"`
 }

+ 6 - 6
api/fund.go

@@ -4,18 +4,18 @@ import "github.com/gogf/gf/v2/frame/g"
 
 type FundListReq struct {
 	g.Meta         `path:"/fund/list" method:"get" tags:"基金相关" summary:"获取基金列表"`
-	BeginPriceDate string `p:"begin_price_date" v:"date-format:Y-m-d"`
-	EndPriceDate   string `p:"end_price_date" v:"date-format:Y-m-d"`
-	Page           int    `p:"page" d:"1" v:"required|min:1"`
-	PageSize       int    `p:"page_size" d:"10" v:"required|min:1"`
+	BeginPriceDate string `p:"begin_price_date" v:"date-format:Y-m-d" dc:"起始净值日"`
+	EndPriceDate   string `p:"end_price_date" v:"date-format:Y-m-d" dc:"结束净值日"`
+	Page           int    `p:"page" d:"1" v:"required|min:1" dc:"当前页数"`
+	PageSize       int    `p:"page_size" d:"10" v:"required|min:1" dc:"单页数据量"`
 }
 
 type FundDetailReq struct {
 	g.Meta `path:"/fund/detail" method:"get" tags:"基金相关" summary:"获取特定基金详情"`
-	FundId string `p:"fund_id" v:"required|regex:^HF[0-9A-Z]{8}$#基金id缺失|基金格式有误"`
+	FundId string `p:"fund_id" v:"required|regex:^HF[0-9A-Z]{8}$#基金id缺失|基金格式有误" dc:"基金id"`
 }
 
 type FundTestReq struct {
 	g.Meta `path:"/fund/test" method:"get" tags:"基金相关" summary:"基金模块测试接口"`
-	FundId string `p:"fund_id" v:"required#基金id缺失"`
+	FundId string `p:"fund_id" v:"required#基金id缺失" dc:"基金id"`
 }

+ 30 - 3
api/user.go

@@ -4,7 +4,34 @@ import "github.com/gogf/gf/v2/frame/g"
 
 type UserCreateReq struct {
 	g.Meta   `path:"/user/create" method:"post" tags:"用户相关" summary:"创建用户"`
-	UserName string `p:"user_name" v:"required"`
-	Password string `p:"password" v:"required"`
-	NickName string `p:"nick_name" v:"required"`
+	UserName string `p:"user_name" v:"required" dc:"用户名"`
+	Password string `p:"password" v:"required" dc:"用户密码"`
+	NickName string `p:"nick_name" dc:"用户昵称"`
+}
+
+type UserUpdateReq struct {
+	g.Meta   `path:"/user/update" method:"post" tags:"用户相关" summary:"修改用户"`
+	UserId   int    `p:"user_id" v:"required" dc:"用户id"`
+	UserName string `p:"user_name" dc:"用户名"`
+	Password string `p:"password" dc:"用户密码"`
+	NickName string `p:"nick_name" dc:"用户昵称"`
+}
+
+type UserDeleteReq struct {
+	g.Meta `path:"/user/delete" method:"post" tags:"用户相关" summary:"删除用户"`
+	UserId int `p:"user_id" v:"required" dc:"用户id"`
+}
+
+type UserLoginReq struct {
+	g.Meta   `path:"/user/login" method:"post" tags:"用户相关" summary:"用户登录"`
+	UserName string `p:"user_name" v:"required" dc:"用户名"`
+	Password string `p:"password" v:"required" dc:"用户密码"`
+}
+
+type UserLogoutReq struct {
+	g.Meta `path:"/user/logout" method:"post" tags:"用户相关" summary:"用户登出"`
+}
+
+type UserTestReq struct {
+	g.Meta `path:"/user/test" method:"get" tags:"用户相关" summary:"测试"`
 }

+ 5 - 3
hack/config.yaml

@@ -5,10 +5,12 @@ gfcli:
   gen:
     dao:
       - link:         "mysql:root:root@tcp(127.0.0.1:3306)/ppw_data_core"
+        group:        "default"
         removePrefix: "dc_"
-        overwriteDao: false
+        overwriteDao: true
         jsonCase:     "Snake"
-      - link: "mysql:root:root@tcp(127.0.0.1:3306)/ppw_user"
+      - link:         "mysql:root:root@tcp(127.0.0.1:3306)/ppw_user"
+        group:        "user"
         removePrefix: "usr_"
-        overwriteDao: false
+        overwriteDao: true
         jsonCase:     "Snake"

+ 8 - 2
internal/cmd/cmd.go

@@ -2,7 +2,9 @@ package cmd
 
 import (
 	"context"
+	"github.com/gogf/gf/v2/os/gsession"
 	"gof_ppw_api/internal/middleware"
+	"time"
 
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
@@ -18,15 +20,19 @@ var (
 		Brief: "start http server",
 		Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
 			s := g.Server()
+
+			s.SetSessionMaxAge(30 * time.Second)
+			s.SetSessionStorage(gsession.NewStorageRedis(g.Redis()))
+
 			s.Use(middleware.Response)
 			s.Use(middleware.Sign)
-			s.Use(middleware.Session)
 			s.Use(middleware.Auth)
 			// s.Use(middleware.Log)
+
 			s.Group("/api", func(group *ghttp.RouterGroup) {
 				group.Bind(
-					controller.Fund,
 					controller.User,
+					controller.Fund,
 				)
 			})
 			s.Run()

+ 11 - 0
internal/controller/controller.go

@@ -2,6 +2,7 @@ package controller
 
 import (
 	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/util/gconv"
 	"math"
 )
 
@@ -15,3 +16,13 @@ func (p *Controller) getPager(count int, page int, pageSize int) g.Map {
 		"total_page": math.Ceil(float64(count) / float64(pageSize)),
 	}
 }
+
+func (p *Controller) parseReq(req interface{}) g.Map {
+	data := gconv.Map(req)
+	for k, v := range data {
+		if "" == v {
+			delete(data, k)
+		}
+	}
+	return data
+}

+ 1 - 1
internal/controller/fund.go

@@ -8,7 +8,7 @@ import (
 	"gof_ppw_api/internal/service"
 )
 
-var Fund = new(FundController)
+var Fund = &FundController{}
 
 type FundController struct {
 	Controller

+ 52 - 1
internal/controller/user.go

@@ -1,7 +1,58 @@
 package controller
 
-var User = new(FundController)
+import (
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"gof_ppw_api/api"
+	"gof_ppw_api/internal/service"
+)
+
+var User = &UserController{}
 
 type UserController struct {
 	Controller
 }
+
+// Create 创建用户
+func (p *UserController) Create(ctx context.Context, req *api.UserCreateReq) (res *api.CommonRes, err error) {
+	data := p.parseReq(req)
+	err = service.User.Create(ctx, data)
+	return
+}
+
+// Update 修改用户
+func (p *UserController) Update(ctx context.Context, req *api.UserUpdateReq) (res *api.CommonRes, err error) {
+	data := p.parseReq(req)
+	err = service.User.Update(ctx, data)
+	return
+}
+
+// Delete 删除用户
+func (p *UserController) Delete(ctx context.Context, req *api.UserDeleteReq) (res *api.CommonRes, err error) {
+	data := p.parseReq(req)
+	err = service.User.Delete(ctx, data)
+	return
+}
+
+// Login 用户登录
+func (p *UserController) Login(ctx context.Context, req *api.UserLoginReq) (res *api.CommonRes, err error) {
+	data := p.parseReq(req)
+	err = service.User.Login(ctx, data)
+	return
+}
+
+// Logout 用户登出
+func (p *UserController) Logout(ctx context.Context, req *api.UserLogoutReq) (res *api.CommonRes, err error) {
+	err = service.User.Logout(ctx)
+	return
+}
+
+func (p *UserController) Test(ctx context.Context, req *api.UserTestReq) (res *api.CommonRes, err error) {
+	sessData, _ := g.RequestFromCtx(ctx).Session.Get("user_id")
+	fmt.Println(sessData.Val() == nil)
+	res = &api.CommonRes{
+		Data: sessData,
+	}
+	return
+}

+ 3 - 3
internal/dao/internal/user.go

@@ -24,8 +24,8 @@ type UserColumns struct {
 	UserName   string // User Passport
 	Password   string // User Password
 	Nickname   string // User Nickname
-	CreateTime string // Created Time
-	UpdateTime string // Updated Time
+	CreateTime string // 创建时间
+	UpdateTime string // 最后修改时间
 	IsValid    string //
 }
 
@@ -43,7 +43,7 @@ var userColumns = UserColumns{
 // NewUserDao creates and returns a new DAO object for table data access.
 func NewUserDao() *UserDao {
 	return &UserDao{
-		group:   "default",
+		group:   "user",
 		table:   "usr_user",
 		columns: userColumns,
 	}

+ 13 - 5
internal/middleware/auth.go

@@ -1,14 +1,22 @@
 package middleware
 
 import (
+	"github.com/gogf/gf/v2/errors/gcode"
 	"github.com/gogf/gf/v2/net/ghttp"
-	"net/http"
+	"strings"
 )
 
 func Auth(r *ghttp.Request) {
-	if true {
-		r.Middleware.Next()
-	} else {
-		r.Response.WriteStatus(http.StatusForbidden)
+	// 放行设置
+	if !strings.Contains(r.RequestURI, "/user/login") && !strings.Contains(r.RequestURI, "/user/logout") {
+		sessData, _ := r.Session.Get("user_id")
+		if sessData.Val() == nil {
+			r.Response.WriteJsonExit(DefaultHandlerResponse{
+				Code:    gcode.CodeNotAuthorized.Code(),
+				Message: "请先登录",
+				Data:    struct{}{},
+			})
+		}
 	}
+	r.Middleware.Next()
 }

+ 3 - 1
internal/middleware/ctx.go

@@ -1,6 +1,8 @@
 package middleware
 
-import "github.com/gogf/gf/v2/net/ghttp"
+import (
+	"github.com/gogf/gf/v2/net/ghttp"
+)
 
 func Ctx(r *ghttp.Request) {
 	r.Middleware.Next()

+ 7 - 0
internal/middleware/middleware.go

@@ -0,0 +1,7 @@
+package middleware
+
+type DefaultHandlerResponse struct {
+	Code    int         `json:"code" dc:"响应状态码"`
+	Message string      `json:"msg" dc:"响应信息"`
+	Data    interface{} `json:"data" dc:"响应数据"`
+}

+ 6 - 7
internal/middleware/response.go

@@ -8,15 +8,10 @@ import (
 	"net/http"
 )
 
-type DefaultHandlerResponse struct {
-	Code    int         `json:"code" dc:"响应状态码"`
-	Message string      `json:"msg" dc:"响应信息"`
-	Data    interface{} `json:"data" dc:"响应数据"`
-}
-
 func Response(r *ghttp.Request) {
 	r.Middleware.Next()
 	// fmt.Println("using res middleware after..")
+	// fmt.Println(r.Response.BufferLength())
 	if r.Response.BufferLength() > 0 {
 		return
 	}
@@ -46,7 +41,11 @@ func Response(r *ghttp.Request) {
 		fRes = struct{}{}
 	} else {
 		code = gcode.CodeOK
-		fRes = res.(*api.CommonRes).Data
+		if res.(*api.CommonRes) != nil {
+			fRes = res.(*api.CommonRes).Data
+		} else {
+			fRes = struct{}{}
+		}
 	}
 
 	r.Response.WriteJsonExit(DefaultHandlerResponse{

+ 2 - 2
internal/model/do/user.go

@@ -16,7 +16,7 @@ type User struct {
 	UserName   interface{} // User Passport
 	Password   interface{} // User Password
 	Nickname   interface{} // User Nickname
-	CreateTime *gtime.Time // Created Time
-	UpdateTime *gtime.Time // Updated Time
+	CreateTime *gtime.Time // 创建时间
+	UpdateTime *gtime.Time // 最后修改时间
 	IsValid    interface{} //
 }

+ 2 - 2
internal/model/entity/user.go

@@ -14,7 +14,7 @@ type User struct {
 	UserName   string      `json:"user_name"   ` // User Passport
 	Password   string      `json:"password"    ` // User Password
 	Nickname   string      `json:"nickname"    ` // User Nickname
-	CreateTime *gtime.Time `json:"create_time" ` // Created Time
-	UpdateTime *gtime.Time `json:"update_time" ` // Updated Time
+	CreateTime *gtime.Time `json:"create_time" ` // 创建时间
+	UpdateTime *gtime.Time `json:"update_time" ` // 最后修改时间
 	IsValid    int         `json:"is_valid"    ` //
 }

+ 1 - 1
internal/service/fund.go

@@ -6,7 +6,7 @@ import (
 	"gof_ppw_api/internal/dao"
 )
 
-var Fund = new(FundService)
+var Fund = &FundService{}
 
 type FundService struct {
 	Service

+ 61 - 0
internal/service/user.go

@@ -1 +1,62 @@
 package service
+
+import (
+	"context"
+	"github.com/gogf/gf/v2/errors/gerror"
+	"github.com/gogf/gf/v2/frame/g"
+	"gof_ppw_api/internal/dao"
+	"gof_ppw_api/internal/model/do"
+	"gof_ppw_api/internal/model/entity"
+)
+
+var User = &UserService{}
+
+type UserService struct {
+	Service
+}
+
+// Create 创建用户
+func (p *UserService) Create(ctx context.Context, data map[string]interface{}) (err error) {
+	//事务
+	//return dao.User.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+	//	_, err = dao.User.Ctx(ctx).Data(data).Insert()
+	//	return err
+	//})
+	_, err = dao.User.Ctx(ctx).Data(data).Insert()
+	return err
+}
+
+// Update 修改用户
+func (p *UserService) Update(ctx context.Context, data map[string]interface{}) (err error) {
+	_, err = dao.User.Ctx(ctx).Where("id", data["user_id"]).Data(data).Update()
+	return err
+}
+
+// Delete 删除用户
+func (p *UserService) Delete(ctx context.Context, data map[string]interface{}) (err error) {
+	_, err = dao.User.Ctx(ctx).Delete("id", data["user_id"])
+	return err
+}
+
+// Login 用户登录
+func (p *UserService) Login(ctx context.Context, data map[string]interface{}) (err error) {
+	var user *entity.User
+	err = dao.User.Ctx(ctx).Where(do.User{
+		UserName: data["user_name"],
+		Password: data["password"],
+	}).Scan(&user)
+	if err != nil {
+		return err
+	}
+	if user == nil {
+		return gerror.New("用户名或密码错误")
+	}
+	_ = g.RequestFromCtx(ctx).Session.Set("user_id", user.Id)
+	return nil
+}
+
+// Logout 用户登出
+func (p *UserService) Logout(ctx context.Context) (err error) {
+	_ = g.RequestFromCtx(ctx).Session.Remove("user_id")
+	return nil
+}

+ 12 - 0
manifest/config/config.yaml

@@ -22,3 +22,15 @@ database:
   user:
     link: "mysql:root:root@tcp(127.0.0.1:3306)/ppw_user"
     debug: true
+
+
+
+# Redis 配置示例
+redis:
+  default:
+    address:     127.0.0.1:6379
+    db:          0
+    # pass:        ""
+    idleTimeout: 600
+
+