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
-
6internal/model/entity/user.go
-
3internal/model/entity/vote_option.go
-
2internal/model/entity/vote_poll.go
-
8internal/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