committed by
liruiqiang
37 changed files with 226 additions and 400 deletions
-
58api/article/article.go
-
15api/hello/hello.go
-
12api/hello/v1/hello.go
-
2hack/config.yaml
-
9internal/cmd/cmd.go
-
60internal/controller/article/article.go
-
5internal/controller/hello/hello.go
-
15internal/controller/hello/hello_new.go
-
13internal/controller/hello/hello_v1_hello.go
-
2internal/dao/internal/article.go
-
87internal/dao/internal/post.go
-
85internal/dao/internal/remain_vote_number.go
-
6internal/dao/internal/user.go
-
4internal/dao/internal/vote_option.go
-
4internal/dao/internal/vote_poll.go
-
10internal/dao/internal/vote_record.go
-
22internal/dao/post.go
-
22internal/dao/remain_vote_number.go
-
23internal/logic/article/article.go
-
5internal/logic/logic.go
-
2internal/model/do/article.go
-
20internal/model/do/post.go
-
19internal/model/do/remain_vote_number.go
-
6internal/model/do/user.go
-
3internal/model/do/vote_option.go
-
2internal/model/do/vote_poll.go
-
8internal/model/do/vote_record.go
-
2internal/model/entity/article.go
-
18internal/model/entity/post.go
-
17internal/model/entity/remain_vote_number.go
-
14internal/model/entity/user.go
-
11internal/model/entity/vote_option.go
-
2internal/model/entity/vote_poll.go
-
14internal/model/entity/vote_record.go
-
23internal/service/article.go
-
2main.go
-
4manifest/config/config.yaml
@ -0,0 +1,58 @@ |
|||
package article |
|||
|
|||
import ( |
|||
"github.com/gogf/gf/v2/frame/g" |
|||
"github.com/gogf/gf/v2/os/gtime" |
|||
) |
|||
|
|||
type ArticleReq struct { |
|||
g.Meta `path:"/addArticle" method:"post" tags:"添加文章"` |
|||
|
|||
//Article Article `json:"article"`
|
|||
//VotePoll VotePoll `json:"votePoll"`
|
|||
//VoteOption VoteOption `json:"voteOption"`
|
|||
//Article表字段
|
|||
UserId int64 `p:"userId" v:"required" dc:"用户 ID"` |
|||
ArticleTitle string `p:"articleTitle" v:"required#标题不能为空" dc:"文章标题"` |
|||
ArticleContent string `p:"articleContent" v:"required#内容不能为空" dc:"文章内容"` |
|||
VoteStatus int `p:"voteStatus" v:"required" dc:"是否投票"` |
|||
//VotePoll表字段
|
|||
ArticleId int64 `p:"articleId" dc:"文章ID"` |
|||
VoteTitle string `p:"voteTitle" v:"required#投票标题不能为空|len:max=24#投票标题不能超过24个字" dc:"投票标题"` |
|||
MultiOption int `p:"multiOption" v:"required" dc:"是否多选"` |
|||
DeadlineTime *gtime.Time `p:"deadlineTime" v:"required" dc:"截止时间"` |
|||
Status int `p:"status" v:"required" dc:"投票活动状态" d:"1"` |
|||
//VoteOption表字段
|
|||
VoteId int64 `p:"voteId" dc:"投票活动ID"` |
|||
OptionList []OptionList `p:"optionList" v:"required#选项不能为空" dc:"投票选项与第几个选项"` |
|||
} |
|||
|
|||
type OptionList struct { |
|||
OptionIndex int `json:"optionIndex" v:"required" dc:"选项序号"` |
|||
OptionContent string `json:"optionContent" v:"required#选项不能为空" dc:"投票选项"` |
|||
} |
|||
|
|||
type ArticleRes struct { |
|||
g.Meta `mime:"application/json"` |
|||
} |
|||
|
|||
//type Article struct {
|
|||
// g.Meta `mime:"application/json"`
|
|||
// UserId int64 `p:"userId" v:"required" dc:"用户 ID"`
|
|||
// ArticleTitle string `p:"articleTitle" v:"required#标题不能为空" dc:"文章标题"`
|
|||
// ArticleContent string `p:"articleContent" v:"required#内容不能为空" dc:"文章内容"`
|
|||
// VoteStatus int `p:"voteStatus" v:"required" dc:"是否投票"`
|
|||
//}
|
|||
//
|
|||
//type VotePoll struct {
|
|||
// g.Meta `mime:"application/json"`
|
|||
// ArticleId int64 `p:"articleId" v:"required" dc:"文章ID"`
|
|||
// VoteTitle string `p:"voteTitle" v:"required#投票标题不能为空|len:max=24#投票标题不能超过24个字" dc:"投票标题"`
|
|||
// MultiOption int `p:"multiOption" v:"required" dc:"是否多选"`
|
|||
// DeadlineTime *gtime.Time `p:"deadlineTime" v:"required" dc:"截止时间"`
|
|||
//}
|
|||
//
|
|||
//type VoteOption struct {
|
|||
// g.Meta `mime:"application/json"`
|
|||
// OptionList []string `p:"optionList" v:"required#选项不能为空" dc:"投票选项"`
|
|||
//}
|
@ -1,15 +0,0 @@ |
|||
// =================================================================================
|
|||
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
|
|||
// =================================================================================
|
|||
|
|||
package hello |
|||
|
|||
import ( |
|||
"context" |
|||
|
|||
"practice_ArticleVote_Go/api/hello/v1" |
|||
) |
|||
|
|||
type IHelloV1 interface { |
|||
Hello(ctx context.Context, req *v1.HelloReq) (res *v1.HelloRes, err error) |
|||
} |
@ -1,12 +0,0 @@ |
|||
package v1 |
|||
|
|||
import ( |
|||
"github.com/gogf/gf/v2/frame/g" |
|||
) |
|||
|
|||
type HelloReq struct { |
|||
g.Meta `path:"/hello" tags:"Hello" method:"get" summary:"You first hello api"` |
|||
} |
|||
type HelloRes struct { |
|||
g.Meta `mime:"text/html" example:"string"` |
|||
} |
@ -0,0 +1,60 @@ |
|||
package article |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
"practice_ArticleVote_Go/api/article" |
|||
"practice_ArticleVote_Go/internal/dao" |
|||
"practice_ArticleVote_Go/internal/service" |
|||
) |
|||
|
|||
var ArticlecController = &cArticle{} |
|||
|
|||
type cArticle struct { |
|||
service service.IArticle |
|||
} |
|||
|
|||
func (c *cArticle) AddArticle(ctx context.Context, req *article.ArticleReq) (res *article.ArticleRes, err error) { |
|||
|
|||
var Aid int64 |
|||
var Vid int64 |
|||
type VoteOption struct { |
|||
VoteId int64 |
|||
OptionContent string |
|||
OptionIndex int |
|||
Status int |
|||
} |
|||
var VoteOptions []VoteOption |
|||
|
|||
// 创建文章
|
|||
Aid, err = dao.Article.Ctx(ctx).Data(req).InsertAndGetId() |
|||
|
|||
if req.VoteStatus == 1 { |
|||
req.ArticleId = Aid |
|||
// 如果发起投票,创建投票活动
|
|||
Vid, err = dao.VotePoll.Ctx(ctx).Data(req).InsertAndGetId() |
|||
if err != nil { |
|||
return nil, fmt.Errorf("创建投票活动失败: %w", err) |
|||
} |
|||
|
|||
// 如果发起投票,创建投票选项
|
|||
for _, option := range req.OptionList { |
|||
VoteOptions = append(VoteOptions, VoteOption{ |
|||
VoteId: Vid, |
|||
OptionContent: option.OptionContent, |
|||
OptionIndex: option.OptionIndex, |
|||
Status: 1, |
|||
}) |
|||
} |
|||
_, err = dao.VoteOption.Ctx(ctx).Data(VoteOptions).Insert() |
|||
|
|||
if err != nil { |
|||
return nil, fmt.Errorf("创建投票选项失败: %w", err) |
|||
} |
|||
} |
|||
|
|||
if err != nil { |
|||
return nil, fmt.Errorf("创建文章失败: %w", err) |
|||
} |
|||
return |
|||
} |
@ -1,5 +0,0 @@ |
|||
// =================================================================================
|
|||
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
|
|||
// =================================================================================
|
|||
|
|||
package hello |
@ -1,15 +0,0 @@ |
|||
// =================================================================================
|
|||
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
|
|||
// =================================================================================
|
|||
|
|||
package hello |
|||
|
|||
import ( |
|||
"practice_ArticleVote_Go/api/hello" |
|||
) |
|||
|
|||
type ControllerV1 struct{} |
|||
|
|||
func NewV1() hello.IHelloV1 { |
|||
return &ControllerV1{} |
|||
} |
@ -1,13 +0,0 @@ |
|||
package hello |
|||
|
|||
import ( |
|||
"context" |
|||
"github.com/gogf/gf/v2/frame/g" |
|||
|
|||
"practice_ArticleVote_Go/api/hello/v1" |
|||
) |
|||
|
|||
func (c *ControllerV1) Hello(ctx context.Context, req *v1.HelloReq) (res *v1.HelloRes, err error) { |
|||
g.RequestFromCtx(ctx).Response.Writeln("Hello World!") |
|||
return |
|||
} |
@ -1,87 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Code generated and maintained 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" |
|||
) |
|||
|
|||
// PostDao is the data access object for the table post.
|
|||
type PostDao struct { |
|||
table string // table is the underlying table name of the DAO.
|
|||
group string // group is the database configuration group name of the current DAO.
|
|||
columns PostColumns // columns contains all the column names of Table for convenient usage.
|
|||
handlers []gdb.ModelHandler // handlers for customized model modification.
|
|||
} |
|||
|
|||
// PostColumns defines and stores column names for the table post.
|
|||
type PostColumns struct { |
|||
Id string //
|
|||
PostTitle string // 文章/视频标题
|
|||
PostContent string // 文章/视频内容
|
|||
VoteStatus string // 是否发起投票:1发起,0不发起
|
|||
CreateTime string //
|
|||
} |
|||
|
|||
// postColumns holds the columns for the table post.
|
|||
var postColumns = PostColumns{ |
|||
Id: "id", |
|||
PostTitle: "post_title", |
|||
PostContent: "post_content", |
|||
VoteStatus: "vote_status", |
|||
CreateTime: "create_time", |
|||
} |
|||
|
|||
// NewPostDao creates and returns a new DAO object for table data access.
|
|||
func NewPostDao(handlers ...gdb.ModelHandler) *PostDao { |
|||
return &PostDao{ |
|||
group: "default", |
|||
table: "post", |
|||
columns: postColumns, |
|||
handlers: handlers, |
|||
} |
|||
} |
|||
|
|||
// DB retrieves and returns the underlying raw database management object of the current DAO.
|
|||
func (dao *PostDao) DB() gdb.DB { |
|||
return g.DB(dao.group) |
|||
} |
|||
|
|||
// Table returns the table name of the current DAO.
|
|||
func (dao *PostDao) Table() string { |
|||
return dao.table |
|||
} |
|||
|
|||
// Columns returns all column names of the current DAO.
|
|||
func (dao *PostDao) Columns() PostColumns { |
|||
return dao.columns |
|||
} |
|||
|
|||
// Group returns the database configuration group name of the current DAO.
|
|||
func (dao *PostDao) Group() string { |
|||
return dao.group |
|||
} |
|||
|
|||
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
|
|||
func (dao *PostDao) Ctx(ctx context.Context) *gdb.Model { |
|||
model := dao.DB().Model(dao.table) |
|||
for _, handler := range dao.handlers { |
|||
model = handler(model) |
|||
} |
|||
return model.Safe().Ctx(ctx) |
|||
} |
|||
|
|||
// Transaction wraps the transaction logic using function f.
|
|||
// It rolls back the transaction and returns the error if function f returns a non-nil error.
|
|||
// It commits the transaction and returns nil if function f returns nil.
|
|||
//
|
|||
// Note: Do not commit or roll back the transaction in function f,
|
|||
// as it is automatically handled by this function.
|
|||
func (dao *PostDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { |
|||
return dao.Ctx(ctx).Transaction(ctx, f) |
|||
} |
@ -1,85 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Code generated and maintained 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" |
|||
) |
|||
|
|||
// RemainVoteNumberDao is the data access object for the table remain_vote_number.
|
|||
type RemainVoteNumberDao struct { |
|||
table string // table is the underlying table name of the DAO.
|
|||
group string // group is the database configuration group name of the current DAO.
|
|||
columns RemainVoteNumberColumns // columns contains all the column names of Table for convenient usage.
|
|||
handlers []gdb.ModelHandler // handlers for customized model modification.
|
|||
} |
|||
|
|||
// RemainVoteNumberColumns defines and stores column names for the table remain_vote_number.
|
|||
type RemainVoteNumberColumns struct { |
|||
Id string //
|
|||
UserId string //
|
|||
RemainTimes string //
|
|||
LastDate string //
|
|||
} |
|||
|
|||
// remainVoteNumberColumns holds the columns for the table remain_vote_number.
|
|||
var remainVoteNumberColumns = RemainVoteNumberColumns{ |
|||
Id: "id", |
|||
UserId: "user_id", |
|||
RemainTimes: "remain_times", |
|||
LastDate: "last_date", |
|||
} |
|||
|
|||
// NewRemainVoteNumberDao creates and returns a new DAO object for table data access.
|
|||
func NewRemainVoteNumberDao(handlers ...gdb.ModelHandler) *RemainVoteNumberDao { |
|||
return &RemainVoteNumberDao{ |
|||
group: "default", |
|||
table: "remain_vote_number", |
|||
columns: remainVoteNumberColumns, |
|||
handlers: handlers, |
|||
} |
|||
} |
|||
|
|||
// DB retrieves and returns the underlying raw database management object of the current DAO.
|
|||
func (dao *RemainVoteNumberDao) DB() gdb.DB { |
|||
return g.DB(dao.group) |
|||
} |
|||
|
|||
// Table returns the table name of the current DAO.
|
|||
func (dao *RemainVoteNumberDao) Table() string { |
|||
return dao.table |
|||
} |
|||
|
|||
// Columns returns all column names of the current DAO.
|
|||
func (dao *RemainVoteNumberDao) Columns() RemainVoteNumberColumns { |
|||
return dao.columns |
|||
} |
|||
|
|||
// Group returns the database configuration group name of the current DAO.
|
|||
func (dao *RemainVoteNumberDao) Group() string { |
|||
return dao.group |
|||
} |
|||
|
|||
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
|
|||
func (dao *RemainVoteNumberDao) Ctx(ctx context.Context) *gdb.Model { |
|||
model := dao.DB().Model(dao.table) |
|||
for _, handler := range dao.handlers { |
|||
model = handler(model) |
|||
} |
|||
return model.Safe().Ctx(ctx) |
|||
} |
|||
|
|||
// Transaction wraps the transaction logic using function f.
|
|||
// It rolls back the transaction and returns the error if function f returns a non-nil error.
|
|||
// It commits the transaction and returns nil if function f returns nil.
|
|||
//
|
|||
// Note: Do not commit or roll back the transaction in function f,
|
|||
// as it is automatically handled by this function.
|
|||
func (dao *RemainVoteNumberDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { |
|||
return dao.Ctx(ctx).Transaction(ctx, f) |
|||
} |
@ -1,22 +0,0 @@ |
|||
// =================================================================================
|
|||
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
|
|||
// =================================================================================
|
|||
|
|||
package dao |
|||
|
|||
import ( |
|||
"practice_ArticleVote_Go/internal/dao/internal" |
|||
) |
|||
|
|||
// postDao is the data access object for the table post.
|
|||
// You can define custom methods on it to extend its functionality as needed.
|
|||
type postDao struct { |
|||
*internal.PostDao |
|||
} |
|||
|
|||
var ( |
|||
// Post is a globally accessible object for table post operations.
|
|||
Post = postDao{internal.NewPostDao()} |
|||
) |
|||
|
|||
// Add your custom methods and functionality below.
|
@ -1,22 +0,0 @@ |
|||
// =================================================================================
|
|||
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
|
|||
// =================================================================================
|
|||
|
|||
package dao |
|||
|
|||
import ( |
|||
"practice_ArticleVote_Go/internal/dao/internal" |
|||
) |
|||
|
|||
// remainVoteNumberDao is the data access object for the table remain_vote_number.
|
|||
// You can define custom methods on it to extend its functionality as needed.
|
|||
type remainVoteNumberDao struct { |
|||
*internal.RemainVoteNumberDao |
|||
} |
|||
|
|||
var ( |
|||
// RemainVoteNumber is a globally accessible object for table remain_vote_number operations.
|
|||
RemainVoteNumber = remainVoteNumberDao{internal.NewRemainVoteNumberDao()} |
|||
) |
|||
|
|||
// Add your custom methods and functionality below.
|
@ -0,0 +1,23 @@ |
|||
package article |
|||
|
|||
import ( |
|||
"context" |
|||
"practice_ArticleVote_Go/internal/dao" |
|||
"practice_ArticleVote_Go/internal/model/do" |
|||
"practice_ArticleVote_Go/internal/service" |
|||
) |
|||
|
|||
func init() { |
|||
service.RegisterArticle(New()) |
|||
} |
|||
|
|||
func New() *iArticle { |
|||
return &iArticle{} |
|||
} |
|||
|
|||
type iArticle struct{} |
|||
|
|||
func (i iArticle) AddArticle(ctx context.Context, article do.Article) (Aid int64, err error) { |
|||
Aid, err = dao.Article.Ctx(ctx).Data(article).InsertAndGetId() |
|||
return Aid, err |
|||
} |
@ -0,0 +1,5 @@ |
|||
package logic |
|||
|
|||
import ( |
|||
_ "practice_ArticleVote_Go/internal/logic/article" |
|||
) |
@ -1,20 +0,0 @@ |
|||
// =================================================================================
|
|||
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
|
|||
// =================================================================================
|
|||
|
|||
package do |
|||
|
|||
import ( |
|||
"github.com/gogf/gf/v2/frame/g" |
|||
"github.com/gogf/gf/v2/os/gtime" |
|||
) |
|||
|
|||
// Post is the golang structure of table post for DAO operations like Where/Data.
|
|||
type Post struct { |
|||
g.Meta `orm:"table:post, do:true"` |
|||
Id interface{} //
|
|||
PostTitle interface{} // 文章/视频标题
|
|||
PostContent interface{} // 文章/视频内容
|
|||
VoteStatus interface{} // 是否发起投票:1发起,0不发起
|
|||
CreateTime *gtime.Time //
|
|||
} |
@ -1,19 +0,0 @@ |
|||
// =================================================================================
|
|||
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
|
|||
// =================================================================================
|
|||
|
|||
package do |
|||
|
|||
import ( |
|||
"github.com/gogf/gf/v2/frame/g" |
|||
"github.com/gogf/gf/v2/os/gtime" |
|||
) |
|||
|
|||
// RemainVoteNumber is the golang structure of table remain_vote_number for DAO operations like Where/Data.
|
|||
type RemainVoteNumber struct { |
|||
g.Meta `orm:"table:remain_vote_number, do:true"` |
|||
Id interface{} //
|
|||
UserId interface{} //
|
|||
RemainTimes interface{} //
|
|||
LastDate *gtime.Time //
|
|||
} |
@ -1,18 +0,0 @@ |
|||
// =================================================================================
|
|||
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
|
|||
// =================================================================================
|
|||
|
|||
package entity |
|||
|
|||
import ( |
|||
"github.com/gogf/gf/v2/os/gtime" |
|||
) |
|||
|
|||
// Post is the golang structure for table post.
|
|||
type Post struct { |
|||
Id int64 `json:"id" orm:"id" description:""` //
|
|||
PostTitle string `json:"postTitle" orm:"post_title" description:"文章/视频标题"` // 文章/视频标题
|
|||
PostContent string `json:"postContent" orm:"post_content" description:"文章/视频内容"` // 文章/视频内容
|
|||
VoteStatus int `json:"voteStatus" orm:"vote_status" description:"是否发起投票:1发起,0不发起"` // 是否发起投票:1发起,0不发起
|
|||
CreateTime *gtime.Time `json:"createTime" orm:"create_time" description:""` //
|
|||
} |
@ -1,17 +0,0 @@ |
|||
// =================================================================================
|
|||
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
|
|||
// =================================================================================
|
|||
|
|||
package entity |
|||
|
|||
import ( |
|||
"github.com/gogf/gf/v2/os/gtime" |
|||
) |
|||
|
|||
// RemainVoteNumber is the golang structure for table remain_vote_number.
|
|||
type RemainVoteNumber struct { |
|||
Id int64 `json:"id" orm:"id" description:""` //
|
|||
UserId int64 `json:"userId" orm:"user_id" description:""` //
|
|||
RemainTimes int `json:"remainTimes" orm:"remain_times" description:""` //
|
|||
LastDate *gtime.Time `json:"lastDate" orm:"last_date" description:""` //
|
|||
} |
@ -0,0 +1,23 @@ |
|||
package service |
|||
|
|||
import ( |
|||
"context" |
|||
"practice_ArticleVote_Go/internal/model/do" |
|||
) |
|||
|
|||
type IArticle interface { |
|||
AddArticle(ctx context.Context, article do.Article) (Aid int64, err error) |
|||
} |
|||
|
|||
var localArticle IArticle |
|||
|
|||
func Article() IArticle { |
|||
if localArticle == nil { |
|||
panic("IArticle接口未实现或未注册") |
|||
} |
|||
return localArticle |
|||
} |
|||
|
|||
func RegisterArticle(i IArticle) { |
|||
localArticle = i |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue