ltotal 2 éve
szülő
commit
5d2ccc4ec6

+ 0 - 2
api/api.go

@@ -5,8 +5,6 @@ type CommonRes struct {
 }
 
 type PagerRes struct {
-	Code  int         `json:"code"`
-	Msg   string      `json:"msg"`
 	Data  interface{} `json:"data"`
 	Pager interface{} `json:"pager"`
 }

+ 10 - 3
api/fund.go

@@ -3,12 +3,19 @@ package api
 import "github.com/gogf/gf/v2/frame/g"
 
 type FundListReq struct {
-	g.Meta   `path:"/fund/list" method:"get" tags:"基金相关" summary:"获取基金列表"`
-	Page     int `p:"page" d:"1" v:"required"`
-	PageSize int `p:"page_size" d:"20" v:"required"`
+	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"`
 }
 
 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缺失|基金格式有误"`
+}
+
+type FundTestReq struct {
+	g.Meta `path:"/fund/test" method:"get" tags:"基金相关" summary:"基金模块测试接口"`
 	FundId string `p:"fund_id" v:"required#基金id缺失"`
 }

internal/logic/.gitkeep → api/rules/.gitkeep


+ 10 - 0
api/user.go

@@ -0,0 +1,10 @@
+package api
+
+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"`
+}

+ 4 - 0
hack/config.yaml

@@ -8,3 +8,7 @@ gfcli:
         removePrefix: "dc_"
         overwriteDao: false
         jsonCase:     "Snake"
+      - link: "mysql:root:root@tcp(127.0.0.1:3306)/ppw_user"
+        removePrefix: "usr_"
+        overwriteDao: false
+        jsonCase:     "Snake"

+ 4 - 2
internal/cmd/cmd.go

@@ -18,13 +18,15 @@ var (
 		Brief: "start http server",
 		Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
 			s := g.Server()
+			s.Use(middleware.Response)
+			s.Use(middleware.Sign)
 			s.Use(middleware.Session)
 			s.Use(middleware.Auth)
-			s.Use(middleware.Log)
+			// s.Use(middleware.Log)
 			s.Group("/api", func(group *ghttp.RouterGroup) {
-				group.Middleware(middleware.Res)
 				group.Bind(
 					controller.Fund,
+					controller.User,
 				)
 			})
 			s.Run()

+ 17 - 0
internal/controller/controller.go

@@ -0,0 +1,17 @@
+package controller
+
+import (
+	"github.com/gogf/gf/v2/frame/g"
+	"math"
+)
+
+type Controller struct{}
+
+func (p *Controller) getPager(count int, page int, pageSize int) g.Map {
+	return g.Map{
+		"page":       page,
+		"page_size":  pageSize,
+		"count":      count,
+		"total_page": math.Ceil(float64(count) / float64(pageSize)),
+	}
+}

+ 21 - 4
internal/controller/fund.go

@@ -2,25 +2,42 @@ package controller
 
 import (
 	"context"
+	"github.com/gogf/gf/v2/errors/gcode"
+	"github.com/gogf/gf/v2/errors/gerror"
 	"gof_ppw_api/api"
 	"gof_ppw_api/internal/service"
 )
 
 var Fund = new(FundController)
 
-type FundController struct{}
+type FundController struct {
+	Controller
+}
 
 // List 基金列表
 func (p *FundController) List(ctx context.Context, req *api.FundListReq) (res *api.CommonRes, err error) {
+	data, count, err := service.Fund.List(ctx, req)
+	res = &api.CommonRes{
+		Data: api.PagerRes{
+			Data:  data,
+			Pager: p.getPager(count, req.Page, req.PageSize),
+		},
+	}
 	return
 }
 
 // Detail 基金详情
-func (p *FundController) Detail(ctx context.Context, req *api.FundDetailReq) (res api.CommonRes, err error) {
+func (p *FundController) Detail(ctx context.Context, req *api.FundDetailReq) (res *api.CommonRes, err error) {
 	data, err := service.Fund.Detail(ctx, req.FundId)
-	//g.RequestFromCtx(ctx).Response.WriteJson(data)
-	res = api.CommonRes{
+	res = &api.CommonRes{
 		Data: data,
 	}
 	return
 }
+
+// Test 自定义错误测试
+func (p *FundController) Test(ctx context.Context, req *api.FundTestReq) (res *api.CommonRes, err error) {
+	// g.RequestFromCtx(ctx).Response.WriteJson(data)
+	// 自定义错误代码、错误信息返回
+	return nil, gerror.NewCode(gcode.New(400, "", nil), "我来报错了-_-")
+}

+ 7 - 0
internal/controller/user.go

@@ -0,0 +1,7 @@
+package controller
+
+var User = new(FundController)
+
+type UserController struct {
+	Controller
+}

+ 2 - 2
internal/dao/internal/fund_information.go

@@ -78,7 +78,7 @@ type FundInformationColumns struct {
 	Createtime                string // 创建时间,默认第一次创建的getdate()时间
 	Updaterid                 string // 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
 	Updatetime                string // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
-	Isvalid                   string // 记录的有效性;1-有效;0-无效;
+	IsValid                   string // 记录的有效性;1-有效;0-无效;
 	RegisterNumber            string //
 	Istiered                  string // 是否分级:1-分级,0-不分级;
 	IstieredDesc              string // 分级说明:0-空 1-优先份额 2-中间份额 3-劣后份额
@@ -168,7 +168,7 @@ var fundInformationColumns = FundInformationColumns{
 	Createtime:                "createtime",
 	Updaterid:                 "updaterid",
 	Updatetime:                "updatetime",
-	Isvalid:                   "isvalid",
+	IsValid:                   "is_valid",
 	RegisterNumber:            "register_number",
 	Istiered:                  "istiered",
 	IstieredDesc:              "istiered_desc",

+ 2 - 2
internal/dao/internal/fund_last_nav.go

@@ -26,7 +26,7 @@ type FundLastNavColumns struct {
 	Nav                     string // 单位净值
 	CumulativeNav           string // 考虑分红再投资的单位累计净值
 	CumulativeNavWithdrawal string // 分红不投资的单位累计净值
-	Updatetime              string // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+	UpdateTime              string // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
 }
 
 //  fundLastNavColumns holds the columns for table dc_fund_last_nav.
@@ -37,7 +37,7 @@ var fundLastNavColumns = FundLastNavColumns{
 	Nav:                     "nav",
 	CumulativeNav:           "cumulative_nav",
 	CumulativeNavWithdrawal: "cumulative_nav_withdrawal",
-	Updatetime:              "updatetime",
+	UpdateTime:              "update_time",
 }
 
 // NewFundLastNavDao creates and returns a new DAO object for table data access.

+ 85 - 0
internal/dao/internal/user.go

@@ -0,0 +1,85 @@
+// ==========================================================================
+// Code generated by GoFrame CLI tool. DO NOT EDIT.
+// ==========================================================================
+
+package internal
+
+import (
+	"context"
+
+	"github.com/gogf/gf/v2/database/gdb"
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+// UserDao is the data access object for table usr_user.
+type UserDao struct {
+	table   string      // table is the underlying table name of the DAO.
+	group   string      // group is the database configuration group name of current DAO.
+	columns UserColumns // columns contains all the column names of Table for convenient usage.
+}
+
+// UserColumns defines and stores column names for table usr_user.
+type UserColumns struct {
+	Id         string // User ID
+	UserName   string // User Passport
+	Password   string // User Password
+	Nickname   string // User Nickname
+	CreateTime string // Created Time
+	UpdateTime string // Updated Time
+	IsValid    string //
+}
+
+//  userColumns holds the columns for table usr_user.
+var userColumns = UserColumns{
+	Id:         "id",
+	UserName:   "user_name",
+	Password:   "password",
+	Nickname:   "nickname",
+	CreateTime: "create_time",
+	UpdateTime: "update_time",
+	IsValid:    "is_valid",
+}
+
+// NewUserDao creates and returns a new DAO object for table data access.
+func NewUserDao() *UserDao {
+	return &UserDao{
+		group:   "default",
+		table:   "usr_user",
+		columns: userColumns,
+	}
+}
+
+// DB retrieves and returns the underlying raw database management object of current DAO.
+func (dao *UserDao) DB() gdb.DB {
+	return g.DB(dao.group)
+}
+
+// Table returns the table name of current dao.
+func (dao *UserDao) Table() string {
+	return dao.table
+}
+
+// Columns returns all column names of current dao.
+func (dao *UserDao) Columns() UserColumns {
+	return dao.columns
+}
+
+// Group returns the configuration group name of database of current dao.
+func (dao *UserDao) Group() string {
+	return dao.group
+}
+
+// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
+func (dao *UserDao) Ctx(ctx context.Context) *gdb.Model {
+	return dao.DB().Model(dao.table).Safe().Ctx(ctx)
+}
+
+// Transaction wraps the transaction logic using function f.
+// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
+// It commits the transaction and returns nil if function f returns nil.
+//
+// Note that, you should not Commit or Rollback the transaction in function f
+// as it is automatically handled by this function.
+func (dao *UserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx *gdb.TX) error) (err error) {
+	return dao.Ctx(ctx).Transaction(ctx, f)
+}

+ 27 - 0
internal/dao/user.go

@@ -0,0 +1,27 @@
+// =================================================================================
+// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
+// =================================================================================
+
+package dao
+
+import (
+	"gof_ppw_api/internal/dao/internal"
+)
+
+// internalUserDao is internal type for wrapping internal DAO implements.
+type internalUserDao = *internal.UserDao
+
+// userDao is the data access object for table usr_user.
+// You can define custom methods on it to extend its functionality as you wish.
+type userDao struct {
+	internalUserDao
+}
+
+var (
+	// User is globally public accessible object for table usr_user operations.
+	User = userDao{
+		internal.NewUserDao(),
+	}
+)
+
+// Fill with you ideas below.

+ 9 - 9
internal/middleware/res.go

@@ -1,12 +1,11 @@
 package middleware
 
 import (
-	"fmt"
 	"github.com/gogf/gf/v2/errors/gcode"
 	"github.com/gogf/gf/v2/errors/gerror"
 	"github.com/gogf/gf/v2/net/ghttp"
+	"gof_ppw_api/api"
 	"net/http"
-	"reflect"
 )
 
 type DefaultHandlerResponse struct {
@@ -15,25 +14,25 @@ type DefaultHandlerResponse struct {
 	Data    interface{} `json:"data" dc:"响应数据"`
 }
 
-func Res(r *ghttp.Request) {
+func Response(r *ghttp.Request) {
 	r.Middleware.Next()
-
-	// There's custom buffer content, it then exits current handler.
+	// fmt.Println("using res middleware after..")
 	if r.Response.BufferLength() > 0 {
 		return
 	}
-
 	var (
 		msg  string
 		err  = r.GetError()
 		res  = r.GetHandlerResponse()
 		code = gerror.Code(err)
+		fRes interface{}
 	)
 	if err != nil {
 		if code == gcode.CodeNil {
 			code = gcode.CodeInternalError
 		}
 		msg = err.Error()
+		fRes = struct{}{}
 	} else if r.Response.Status > 0 && r.Response.Status != http.StatusOK {
 		msg = http.StatusText(r.Response.Status)
 		switch r.Response.Status {
@@ -44,14 +43,15 @@ func Res(r *ghttp.Request) {
 		default:
 			code = gcode.CodeUnknown
 		}
+		fRes = struct{}{}
 	} else {
 		code = gcode.CodeOK
+		fRes = res.(*api.CommonRes).Data
 	}
-	fmt.Println("res_type: ", reflect.TypeOf(res))
-	fmt.Println("res_data: ", res)
+
 	r.Response.WriteJsonExit(DefaultHandlerResponse{
 		Code:    code.Code(),
 		Message: msg,
-		Data:    res,
+		Data:    fRes,
 	})
 }

+ 1 - 1
internal/middleware/session.go

@@ -5,7 +5,7 @@ import (
 )
 
 func Session(r *ghttp.Request) {
-	//fmt.Println("using session middleware..")
+	//fmt.Println("using session middleware before..")
 	//_ = r.Session.Set("time", gtime.Timestamp())
 	r.Middleware.Next()
 }

+ 9 - 0
internal/middleware/sign.go

@@ -0,0 +1,9 @@
+package middleware
+
+import "github.com/gogf/gf/v2/net/ghttp"
+
+func Sign(r *ghttp.Request) {
+	//fmt.Println("using session middleware before..")
+	//_ = r.Session.Set("time", gtime.Timestamp())
+	r.Middleware.Next()
+}

+ 1 - 1
internal/model/do/fund_information.go

@@ -70,7 +70,7 @@ type FundInformation struct {
 	Createtime                *gtime.Time // 创建时间,默认第一次创建的getdate()时间
 	Updaterid                 interface{} // 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
 	Updatetime                *gtime.Time // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
-	Isvalid                   interface{} // 记录的有效性;1-有效;0-无效;
+	IsValid                   interface{} // 记录的有效性;1-有效;0-无效;
 	RegisterNumber            interface{} //
 	Istiered                  interface{} // 是否分级:1-分级,0-不分级;
 	IstieredDesc              interface{} // 分级说明:0-空 1-优先份额 2-中间份额 3-劣后份额

+ 1 - 1
internal/model/do/fund_last_nav.go

@@ -18,5 +18,5 @@ type FundLastNav struct {
 	Nav                     interface{} // 单位净值
 	CumulativeNav           interface{} // 考虑分红再投资的单位累计净值
 	CumulativeNavWithdrawal interface{} // 分红不投资的单位累计净值
-	Updatetime              *gtime.Time // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+	UpdateTime              *gtime.Time // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
 }

+ 22 - 0
internal/model/do/user.go

@@ -0,0 +1,22 @@
+// =================================================================================
+// Code generated by GoFrame CLI tool. DO NOT EDIT.
+// =================================================================================
+
+package do
+
+import (
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gtime"
+)
+
+// User is the golang structure of table usr_user for DAO operations like Where/Data.
+type User struct {
+	g.Meta     `orm:"table:usr_user, do:true"`
+	Id         interface{} // User ID
+	UserName   interface{} // User Passport
+	Password   interface{} // User Password
+	Nickname   interface{} // User Nickname
+	CreateTime *gtime.Time // Created Time
+	UpdateTime *gtime.Time // Updated Time
+	IsValid    interface{} //
+}

+ 1 - 1
internal/model/entity/fund_information.go

@@ -68,7 +68,7 @@ type FundInformation struct {
 	Createtime                *gtime.Time `json:"createtime"                  ` // 创建时间,默认第一次创建的getdate()时间
 	Updaterid                 int         `json:"updaterid"                   ` // 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
 	Updatetime                *gtime.Time `json:"updatetime"                  ` // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
-	Isvalid                   int         `json:"isvalid"                     ` // 记录的有效性;1-有效;0-无效;
+	IsValid                   int         `json:"is_valid"                    ` // 记录的有效性;1-有效;0-无效;
 	RegisterNumber            string      `json:"register_number"             ` //
 	Istiered                  int         `json:"istiered"                    ` // 是否分级:1-分级,0-不分级;
 	IstieredDesc              int         `json:"istiered_desc"               ` // 分级说明:0-空 1-优先份额 2-中间份额 3-劣后份额

+ 1 - 1
internal/model/entity/fund_last_nav.go

@@ -16,5 +16,5 @@ type FundLastNav struct {
 	Nav                     float64     `json:"nav"                       ` // 单位净值
 	CumulativeNav           float64     `json:"cumulative_nav"            ` // 考虑分红再投资的单位累计净值
 	CumulativeNavWithdrawal float64     `json:"cumulative_nav_withdrawal" ` // 分红不投资的单位累计净值
-	Updatetime              *gtime.Time `json:"updatetime"                ` // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+	UpdateTime              *gtime.Time `json:"update_time"               ` // 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
 }

+ 20 - 0
internal/model/entity/user.go

@@ -0,0 +1,20 @@
+// =================================================================================
+// Code generated by GoFrame CLI tool. DO NOT EDIT.
+// =================================================================================
+
+package entity
+
+import (
+	"github.com/gogf/gf/v2/os/gtime"
+)
+
+// User is the golang structure for table user.
+type User struct {
+	Id         uint        `json:"id"          ` // User ID
+	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
+	IsValid    int         `json:"is_valid"    ` //
+}

+ 22 - 3
internal/service/fund.go

@@ -2,6 +2,7 @@ package service
 
 import (
 	"context"
+	"gof_ppw_api/api"
 	"gof_ppw_api/internal/dao"
 )
 
@@ -12,13 +13,31 @@ type FundService struct {
 }
 
 // List 基金列表
-func (p *FundService) List() {
+func (p *FundService) List(ctx context.Context, req *api.FundListReq) (ret interface{}, count int, err error) {
+	orm := dao.FundInformation.Ctx(ctx).As("a")
+	orm = orm.InnerJoin("dc_fund_last_nav b", "a.is_valid = 1 AND a.fund_id = b.fund_id")
+	if req.BeginPriceDate != "" {
+		orm = orm.WhereGTE("b.price_date", req.BeginPriceDate)
+	}
+	if req.EndPriceDate != "" {
+		orm = orm.WhereLTE("b.price_date", req.EndPriceDate)
+	}
+	count, _ = orm.Count()
+
+	offset, length := (req.Page-1)*req.PageSize, req.PageSize
+	all, err := orm.Fields("a.fund_id,a.fund_name,a.fund_short_name,b.price_date,b.nav").Limit(offset, length).Order("b.price_date DESC").All()
+	if err != nil {
+		return nil, 0, nil
+	}
+	return all.List(), count, nil
 }
 
 // Detail 特定基金详情
-func (p *FundService) Detail(ctx context.Context, fundId string) (m interface{}, err error) {
+func (p *FundService) Detail(ctx context.Context, fundId string) (ret interface{}, err error) {
+	// db := g.DB("default")
+	// one, err := db.GetOne(ctx, "SELECT fund_id,fund_name,fund_short_name FROM dc_fund_information WHERE is_valid = 1 AND fund_id = ?", fundId)
 	one, err := dao.FundInformation.Ctx(ctx).
-		Where("fund_id", fundId).
+		Where("is_valid = ? AND fund_id = ?", 1, fundId).
 		Fields("fund_id,fund_name,fund_short_name").
 		One()
 	if err != nil {

+ 14 - 0
internal/service/service.go

@@ -1,3 +1,17 @@
 package service
 
+import (
+	"github.com/gogf/gf/v2/errors/gcode"
+	"github.com/gogf/gf/v2/errors/gerror"
+)
+
 type Service struct{}
+
+// List 基金列表
+func (p *Service) getError(msg string) error {
+	code := gcode.CodeBusinessValidationFailed.Code()
+	if "" == msg {
+		msg = gcode.CodeBusinessValidationFailed.Message()
+	}
+	return gerror.NewCode(gcode.New(code, "", nil), msg)
+}

+ 1 - 0
internal/service/user.go

@@ -0,0 +1 @@
+package service

+ 1 - 1
main.go

@@ -3,7 +3,7 @@ package main
 import (
 	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
 	_ "gof_ppw_api/internal/packed"
-
+	
 	"github.com/gogf/gf/v2/os/gctx"
 	"gof_ppw_api/internal/cmd"
 )

+ 3 - 0
manifest/config/config.yaml

@@ -19,3 +19,6 @@ database:
   default:
     link:   "mysql:root:root@tcp(127.0.0.1:3306)/ppw_data_core"
     debug:  true
+  user:
+    link: "mysql:root:root@tcp(127.0.0.1:3306)/ppw_user"
+    debug: true