作者 郑周

1.圆桌讨论模型

2.圆桌讨论-观点模型
3.圆桌讨论-采纳模型
4.小组件模型
  1 +
  2 +syntax = "v1"
  3 +
  4 +info(
  5 + title: "圆桌讨论"
  6 + desc: "圆桌讨论"
  7 + author: "zz"
  8 + email: "email"
  9 + version: "v1"
  10 +)
  11 +
  12 +@server(
  13 + prefix: discussion/v1
  14 + group: discussion
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @handler getDiscussion
  19 + post /discussion/:id (DiscussionGetRequest) returns (DiscussionGetResponse)
  20 + @handler saveDiscussion
  21 + post /discussion (DiscussionSaveRequest) returns (DiscussionSaveResponse)
  22 + @handler deleteDiscussion
  23 + delete /discussion/:id (DiscussionDeleteRequest) returns (DiscussionDeleteResponse)
  24 + @handler updateDiscussion
  25 + put /discussion/:id (DiscussionUpdateRequest) returns (DiscussionUpdateResponse)
  26 + @handler searchDiscussion
  27 + post /discussion/search (DiscussionSearchRequest) returns (DiscussionSearchResponse)
  28 +}
  29 +
  30 +type (
  31 + DiscussionGetRequest {
  32 + Id int64 `path:"id"`
  33 + }
  34 + DiscussionGetResponse struct{
  35 + Discussion DiscussionItem `json:"discussion"`
  36 + }
  37 +
  38 + DiscussionSaveRequest struct{
  39 + Discussion DiscussionItem `json:"discussion"`
  40 + }
  41 + DiscussionSaveResponse struct{}
  42 +
  43 + DiscussionDeleteRequest struct{
  44 + Id int64 `path:"id"`
  45 + }
  46 + DiscussionDeleteResponse struct{}
  47 +
  48 + DiscussionUpdateRequest struct{
  49 + Id int64 `path:"id"`
  50 + Discussion DiscussionItem `json:"discussion"`
  51 + }
  52 + DiscussionUpdateResponse struct{}
  53 +
  54 + DiscussionSearchRequest struct{
  55 + Page int `json:"page"`
  56 + Size int `json:"size"`
  57 + }
  58 + DiscussionSearchResponse{
  59 + List []DiscussionItem `json:"list"`
  60 + Total int64 `json:"total"`
  61 + }
  62 + DiscussionItem struct{
  63 +
  64 + }
  65 +)
  1 +
  2 +syntax = "v1"
  3 +
  4 +info(
  5 + title: "xx实例"
  6 + desc: "xx实例"
  7 + author: "author"
  8 + email: "email"
  9 + version: "v1"
  10 +)
  11 +
  12 +@server(
  13 + prefix: discussion_accept/v1
  14 + group: discussion_accept
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @handler getDiscussionAccept
  19 + post /discussion_accept/:id (DiscussionAcceptGetRequest) returns (DiscussionAcceptGetResponse)
  20 + @handler saveDiscussionAccept
  21 + post /discussion_accept (DiscussionAcceptSaveRequest) returns (DiscussionAcceptSaveResponse)
  22 + @handler deleteDiscussionAccept
  23 + delete /discussion_accept/:id (DiscussionAcceptDeleteRequest) returns (DiscussionAcceptDeleteResponse)
  24 + @handler updateDiscussionAccept
  25 + put /discussion_accept/:id (DiscussionAcceptUpdateRequest) returns (DiscussionAcceptUpdateResponse)
  26 + @handler searchDiscussionAccept
  27 + post /discussion_accept/search (DiscussionAcceptSearchRequest) returns (DiscussionAcceptSearchResponse)
  28 +}
  29 +
  30 +type (
  31 + DiscussionAcceptGetRequest {
  32 + Id int64 `path:"id"`
  33 + }
  34 + DiscussionAcceptGetResponse struct{
  35 + DiscussionAccept DiscussionAcceptItem `json:"discussion_accept"`
  36 + }
  37 +
  38 + DiscussionAcceptSaveRequest struct{
  39 + DiscussionAccept DiscussionAcceptItem `json:"discussion_accept"`
  40 + }
  41 + DiscussionAcceptSaveResponse struct{}
  42 +
  43 + DiscussionAcceptDeleteRequest struct{
  44 + Id int64 `path:"id"`
  45 + }
  46 + DiscussionAcceptDeleteResponse struct{}
  47 +
  48 + DiscussionAcceptUpdateRequest struct{
  49 + Id int64 `path:"id"`
  50 + DiscussionAccept DiscussionAcceptItem `json:"discussion_accept"`
  51 + }
  52 + DiscussionAcceptUpdateResponse struct{}
  53 +
  54 + DiscussionAcceptSearchRequest struct{
  55 + Page int `json:"page"`
  56 + Size int `json:"size"`
  57 + }
  58 + DiscussionAcceptSearchResponse{
  59 + List []DiscussionAcceptItem `json:"list"`
  60 + Total int64 `json:"total"`
  61 + }
  62 + DiscussionAcceptItem struct{
  63 +
  64 + }
  65 +)
  1 +
  2 +syntax = "v1"
  3 +
  4 +info(
  5 + title: "xx实例"
  6 + desc: "xx实例"
  7 + author: "author"
  8 + email: "email"
  9 + version: "v1"
  10 +)
  11 +
  12 +@server(
  13 + prefix: discussion_opinion/v1
  14 + group: discussion_opinion
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @handler getDiscussionOpinion
  19 + post /discussion_opinion/:id (DiscussionOpinionGetRequest) returns (DiscussionOpinionGetResponse)
  20 + @handler saveDiscussionOpinion
  21 + post /discussion_opinion (DiscussionOpinionSaveRequest) returns (DiscussionOpinionSaveResponse)
  22 + @handler deleteDiscussionOpinion
  23 + delete /discussion_opinion/:id (DiscussionOpinionDeleteRequest) returns (DiscussionOpinionDeleteResponse)
  24 + @handler updateDiscussionOpinion
  25 + put /discussion_opinion/:id (DiscussionOpinionUpdateRequest) returns (DiscussionOpinionUpdateResponse)
  26 + @handler searchDiscussionOpinion
  27 + post /discussion_opinion/search (DiscussionOpinionSearchRequest) returns (DiscussionOpinionSearchResponse)
  28 +}
  29 +
  30 +type (
  31 + DiscussionOpinionGetRequest {
  32 + Id int64 `path:"id"`
  33 + }
  34 + DiscussionOpinionGetResponse struct{
  35 + DiscussionOpinion DiscussionOpinionItem `json:"discussion_opinion"`
  36 + }
  37 +
  38 + DiscussionOpinionSaveRequest struct{
  39 + DiscussionOpinion DiscussionOpinionItem `json:"discussion_opinion"`
  40 + }
  41 + DiscussionOpinionSaveResponse struct{}
  42 +
  43 + DiscussionOpinionDeleteRequest struct{
  44 + Id int64 `path:"id"`
  45 + }
  46 + DiscussionOpinionDeleteResponse struct{}
  47 +
  48 + DiscussionOpinionUpdateRequest struct{
  49 + Id int64 `path:"id"`
  50 + DiscussionOpinion DiscussionOpinionItem `json:"discussion_opinion"`
  51 + }
  52 + DiscussionOpinionUpdateResponse struct{}
  53 +
  54 + DiscussionOpinionSearchRequest struct{
  55 + Page int `json:"page"`
  56 + Size int `json:"size"`
  57 + }
  58 + DiscussionOpinionSearchResponse{
  59 + List []DiscussionOpinionItem `json:"list"`
  60 + Total int64 `json:"total"`
  61 + }
  62 + DiscussionOpinionItem struct{
  63 +
  64 + }
  65 +)
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message DiscussionGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message DiscussionGetResp{
  12 + DiscussionItem User = 1;
  13 +}
  14 +
  15 +message DiscussionSaveReq {
  16 +
  17 +}
  18 +message DiscussionSaveResp{
  19 +
  20 +}
  21 +
  22 +message DiscussionDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message DiscussionDeleteResp{
  26 +
  27 +}
  28 +
  29 +message DiscussionUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message DiscussionUpdateResp{
  33 +
  34 +}
  35 +
  36 +message DiscussionSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message DiscussionSearchResp{
  41 + repeated DiscussionItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message DiscussionItem {
  45 +
  46 +}
  47 +
  48 +service DiscussionService {
  49 + rpc DiscussionGet(DiscussionGetReq) returns(DiscussionGetResp);
  50 + rpc DiscussionSave(DiscussionSaveReq) returns(DiscussionSaveResp);
  51 + rpc DiscussionDelete(DiscussionDeleteReq) returns(DiscussionDeleteResp);
  52 + rpc DiscussionUpdate(DiscussionUpdateReq) returns(DiscussionUpdateResp);
  53 + rpc DiscussionSearch(DiscussionSearchReq) returns(DiscussionSearchResp);
  54 +}
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message DiscussionAcceptGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message DiscussionAcceptGetResp{
  12 + DiscussionAcceptItem User = 1;
  13 +}
  14 +
  15 +message DiscussionAcceptSaveReq {
  16 +
  17 +}
  18 +message DiscussionAcceptSaveResp{
  19 +
  20 +}
  21 +
  22 +message DiscussionAcceptDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message DiscussionAcceptDeleteResp{
  26 +
  27 +}
  28 +
  29 +message DiscussionAcceptUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message DiscussionAcceptUpdateResp{
  33 +
  34 +}
  35 +
  36 +message DiscussionAcceptSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message DiscussionAcceptSearchResp{
  41 + repeated DiscussionAcceptItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message DiscussionAcceptItem {
  45 +
  46 +}
  47 +
  48 +service DiscussionAcceptService {
  49 + rpc DiscussionAcceptGet(DiscussionAcceptGetReq) returns(DiscussionAcceptGetResp);
  50 + rpc DiscussionAcceptSave(DiscussionAcceptSaveReq) returns(DiscussionAcceptSaveResp);
  51 + rpc DiscussionAcceptDelete(DiscussionAcceptDeleteReq) returns(DiscussionAcceptDeleteResp);
  52 + rpc DiscussionAcceptUpdate(DiscussionAcceptUpdateReq) returns(DiscussionAcceptUpdateResp);
  53 + rpc DiscussionAcceptSearch(DiscussionAcceptSearchReq) returns(DiscussionAcceptSearchResp);
  54 +}
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message DiscussionOpinionGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message DiscussionOpinionGetResp{
  12 + DiscussionOpinionItem User = 1;
  13 +}
  14 +
  15 +message DiscussionOpinionSaveReq {
  16 +
  17 +}
  18 +message DiscussionOpinionSaveResp{
  19 +
  20 +}
  21 +
  22 +message DiscussionOpinionDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message DiscussionOpinionDeleteResp{
  26 +
  27 +}
  28 +
  29 +message DiscussionOpinionUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message DiscussionOpinionUpdateResp{
  33 +
  34 +}
  35 +
  36 +message DiscussionOpinionSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message DiscussionOpinionSearchResp{
  41 + repeated DiscussionOpinionItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message DiscussionOpinionItem {
  45 +
  46 +}
  47 +
  48 +service DiscussionOpinionService {
  49 + rpc DiscussionOpinionGet(DiscussionOpinionGetReq) returns(DiscussionOpinionGetResp);
  50 + rpc DiscussionOpinionSave(DiscussionOpinionSaveReq) returns(DiscussionOpinionSaveResp);
  51 + rpc DiscussionOpinionDelete(DiscussionOpinionDeleteReq) returns(DiscussionOpinionDeleteResp);
  52 + rpc DiscussionOpinionUpdate(DiscussionOpinionUpdateReq) returns(DiscussionOpinionUpdateResp);
  53 + rpc DiscussionOpinionSearch(DiscussionOpinionSearchReq) returns(DiscussionOpinionSearchResp);
  54 +}
  1 +package models
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 + "gorm.io/gorm"
  7 + "gorm.io/plugin/soft_delete"
  8 +)
  9 +
  10 +// Discussion 圆桌讨论表
  11 +type Discussion struct {
  12 + Id int64 // 唯一标识
  13 + Title string `json:"title"` // 标题(不超过30个字符)
  14 + Content string `json:"content"` // 内容(不超过500个字符)
  15 + Images []domain.Image `json:"images"` // 图片(不超过5张)
  16 + Widget *domain.Widget `json:"widget"` // 小组件
  17 + ProviderId int64 `json:"providerId"` // 发起者ID
  18 + ParticipantIds []int64 `json:"participantIds"` // 参与者ID
  19 + ArticleId int64 `json:"articleId"` // 文章ID
  20 + State int `json:"state"` // 状态(1进行中、2搁置、3中止、4结案)
  21 + CreatedAt int64 `json:",omitempty"`
  22 + UpdatedAt int64 `json:",omitempty"`
  23 + DeletedAt int64 `json:",omitempty"`
  24 + Version int `json:",omitempty"`
  25 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  26 +}
  27 +
  28 +func (m *Discussion) TableName() string {
  29 + return "discussion"
  30 +}
  31 +
  32 +func (m *Discussion) BeforeCreate(tx *gorm.DB) (err error) {
  33 + // m.CreatedAt = time.Now().Unix()
  34 + // m.UpdatedAt = time.Now().Unix()
  35 + return
  36 +}
  37 +
  38 +func (m *Discussion) BeforeUpdate(tx *gorm.DB) (err error) {
  39 + // m.UpdatedAt = time.Now().Unix()
  40 + return
  41 +}
  42 +
  43 +func (m *Discussion) CacheKeyFunc() string {
  44 + if m.Id == 0 {
  45 + return ""
  46 + }
  47 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  48 +}
  49 +
  50 +func (m *Discussion) CacheKeyFuncByObject(obj interface{}) string {
  51 + if v, ok := obj.(*Discussion); ok {
  52 + return v.CacheKeyFunc()
  53 + }
  54 + return ""
  55 +}
  56 +
  57 +func (m *Discussion) CachePrimaryKeyFunc() string {
  58 + if len("") == 0 {
  59 + return ""
  60 + }
  61 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  62 +}
  1 +package models
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 + "gorm.io/gorm"
  7 + "gorm.io/plugin/soft_delete"
  8 +)
  9 +
  10 +// DiscussionAccept 圆桌讨论采纳表
  11 +type DiscussionAccept struct {
  12 + Id int64 // 唯一标识
  13 + ArticleId int64 `json:"articleId"` // 文章ID
  14 + DiscussionId int64 `json:"discussionId"` // 讨论ID
  15 + ProviderId int64 `json:"providerId"` // 发起人ID
  16 + DoIds []int64 `json:"DoIds"` // 意见采纳-用户观点
  17 + OpinionId int64 `json:"opinionId"` // 价值判定-选择观点
  18 + SubjectiveTitle string `json:"subjectiveTitle"` // 主观认定-标题
  19 + SubjectiveDesc string `json:"subjectiveDesc"` // 主观认定-内容
  20 + CreatedAt int64 `json:",omitempty"`
  21 + UpdatedAt int64 `json:",omitempty"`
  22 + DeletedAt int64 `json:",omitempty"`
  23 + Version int `json:",omitempty"`
  24 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  25 +}
  26 +
  27 +func (m *DiscussionAccept) TableName() string {
  28 + return "discussion_accept"
  29 +}
  30 +
  31 +func (m *DiscussionAccept) BeforeCreate(tx *gorm.DB) (err error) {
  32 + // m.CreatedAt = time.Now().Unix()
  33 + // m.UpdatedAt = time.Now().Unix()
  34 + return
  35 +}
  36 +
  37 +func (m *DiscussionAccept) BeforeUpdate(tx *gorm.DB) (err error) {
  38 + // m.UpdatedAt = time.Now().Unix()
  39 + return
  40 +}
  41 +
  42 +func (m *DiscussionAccept) CacheKeyFunc() string {
  43 + if m.Id == 0 {
  44 + return ""
  45 + }
  46 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  47 +}
  48 +
  49 +func (m *DiscussionAccept) CacheKeyFuncByObject(obj interface{}) string {
  50 + if v, ok := obj.(*DiscussionAccept); ok {
  51 + return v.CacheKeyFunc()
  52 + }
  53 + return ""
  54 +}
  55 +
  56 +func (m *DiscussionAccept) CachePrimaryKeyFunc() string {
  57 + if len("") == 0 {
  58 + return ""
  59 + }
  60 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  61 +}
  1 +package models
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 + "gorm.io/gorm"
  7 + "gorm.io/plugin/soft_delete"
  8 +)
  9 +
  10 +// DiscussionOpinion 圆桌讨论观点表
  11 +type DiscussionOpinion struct {
  12 + Id int64 // 唯一标识
  13 + ArticleId int64 `json:"articleId"` // 文章ID
  14 + DiscussionId int64 `json:"discussionId"` // 讨论ID
  15 + ProviderId int64 `json:"providerId"` // 用户ID
  16 + OpinionId int64 `json:"opinionId"` // 选项ID
  17 + OpinionDesc string `json:"opinionDesc"` // 选项描述
  18 + Reason string `json:"reason"` // 理由
  19 + Show int `json:"show"` // 显示状态(1显示、0不显示)
  20 + AcceptUserId int64 `json:"acceptUserId"` // 采纳人ID(最终结案的时候唯一)
  21 + CreatedAt int64 `json:",omitempty"`
  22 + UpdatedAt int64 `json:",omitempty"`
  23 + DeletedAt int64 `json:",omitempty"`
  24 + Version int `json:",omitempty"`
  25 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  26 +}
  27 +
  28 +func (m *DiscussionOpinion) TableName() string {
  29 + return "discussion_opinion"
  30 +}
  31 +
  32 +func (m *DiscussionOpinion) BeforeCreate(tx *gorm.DB) (err error) {
  33 + // m.CreatedAt = time.Now().Unix()
  34 + // m.UpdatedAt = time.Now().Unix()
  35 + return
  36 +}
  37 +
  38 +func (m *DiscussionOpinion) BeforeUpdate(tx *gorm.DB) (err error) {
  39 + // m.UpdatedAt = time.Now().Unix()
  40 + return
  41 +}
  42 +
  43 +func (m *DiscussionOpinion) CacheKeyFunc() string {
  44 + if m.Id == 0 {
  45 + return ""
  46 + }
  47 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  48 +}
  49 +
  50 +func (m *DiscussionOpinion) CacheKeyFuncByObject(obj interface{}) string {
  51 + if v, ok := obj.(*DiscussionOpinion); ok {
  52 + return v.CacheKeyFunc()
  53 + }
  54 + return ""
  55 +}
  56 +
  57 +func (m *DiscussionOpinion) CachePrimaryKeyFunc() string {
  58 + if len("") == 0 {
  59 + return ""
  60 + }
  61 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  62 +}
  1 +package repository
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/jinzhu/copier"
  6 + "github.com/pkg/errors"
  7 + "github.com/tiptok/gocomm/pkg/cache"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/models"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  11 + "gorm.io/gorm"
  12 +)
  13 +
  14 +type DiscussionAcceptRepository struct {
  15 + *cache.CachedRepository
  16 +}
  17 +
  18 +func (repository *DiscussionAcceptRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.DiscussionAccept) (*domain.DiscussionAccept, error) {
  19 + var (
  20 + err error
  21 + m = &models.DiscussionAccept{}
  22 + tx = conn.DB()
  23 + )
  24 + if m, err = repository.DomainModelToModel(dm); err != nil {
  25 + return nil, err
  26 + }
  27 + if tx = tx.Model(m).Save(m); tx.Error != nil {
  28 + return nil, tx.Error
  29 + }
  30 + dm.Id = m.Id
  31 + return repository.ModelToDomainModel(m)
  32 +
  33 +}
  34 +
  35 +func (repository *DiscussionAcceptRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.DiscussionAccept) (*domain.DiscussionAccept, error) {
  36 + var (
  37 + err error
  38 + m *models.DiscussionAccept
  39 + tx = conn.DB()
  40 + )
  41 + if m, err = repository.DomainModelToModel(dm); err != nil {
  42 + return nil, err
  43 + }
  44 + queryFunc := func() (interface{}, error) {
  45 + tx = tx.Model(m).Updates(m)
  46 + return nil, tx.Error
  47 + }
  48 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  49 + return nil, err
  50 + }
  51 + return repository.ModelToDomainModel(m)
  52 +}
  53 +
  54 +func (repository *DiscussionAcceptRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.DiscussionAccept) (*domain.DiscussionAccept, error) {
  55 + var (
  56 + err error
  57 + m *models.DiscussionAccept
  58 + tx = transaction.DB()
  59 + )
  60 + if m, err = repository.DomainModelToModel(dm); err != nil {
  61 + return nil, err
  62 + }
  63 + oldVersion := dm.Version
  64 + m.Version += 1
  65 + queryFunc := func() (interface{}, error) {
  66 + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m)
  67 + if tx.RowsAffected == 0 {
  68 + return nil, domain.ErrUpdateFail
  69 + }
  70 + return nil, tx.Error
  71 + }
  72 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  73 + return nil, err
  74 + }
  75 + return repository.ModelToDomainModel(m)
  76 +}
  77 +
  78 +func (repository *DiscussionAcceptRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.DiscussionAccept) (*domain.DiscussionAccept, error) {
  79 + var (
  80 + tx = conn.DB()
  81 + m = &models.DiscussionAccept{Id: dm.Identify().(int64)}
  82 + )
  83 + queryFunc := func() (interface{}, error) {
  84 + tx = tx.Where("id = ?", m.Id).Delete(m)
  85 + return m, tx.Error
  86 + }
  87 + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  88 + return dm, err
  89 + }
  90 + return repository.ModelToDomainModel(m)
  91 +}
  92 +
  93 +func (repository *DiscussionAcceptRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.DiscussionAccept, error) {
  94 + var (
  95 + err error
  96 + tx = conn.DB()
  97 + m = new(models.DiscussionAccept)
  98 + )
  99 + queryFunc := func() (interface{}, error) {
  100 + tx = tx.Model(m).Where("id = ?", id).First(m)
  101 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  102 + return nil, domain.ErrNotFound
  103 + }
  104 + return m, tx.Error
  105 + }
  106 + cacheModel := new(models.DiscussionAccept)
  107 + cacheModel.Id = id
  108 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  109 + return nil, err
  110 + }
  111 + return repository.ModelToDomainModel(m)
  112 +}
  113 +
  114 +func (repository *DiscussionAcceptRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.DiscussionAccept, error) {
  115 + var (
  116 + tx = conn.DB()
  117 + ms []*models.DiscussionAccept
  118 + dms = make([]*domain.DiscussionAccept, 0)
  119 + total int64
  120 + )
  121 + queryFunc := func() (interface{}, error) {
  122 + tx = tx.Model(&ms).Order("id desc")
  123 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  124 + return dms, tx.Error
  125 + }
  126 + return dms, nil
  127 + }
  128 +
  129 + if _, err := repository.Query(queryFunc); err != nil {
  130 + return 0, nil, err
  131 + }
  132 +
  133 + for _, item := range ms {
  134 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  135 + return 0, dms, err
  136 + } else {
  137 + dms = append(dms, dm)
  138 + }
  139 + }
  140 + return total, dms, nil
  141 +}
  142 +
  143 +func (repository *DiscussionAcceptRepository) ModelToDomainModel(from *models.DiscussionAccept) (*domain.DiscussionAccept, error) {
  144 + to := &domain.DiscussionAccept{}
  145 + err := copier.Copy(to, from)
  146 + return to, err
  147 +}
  148 +
  149 +func (repository *DiscussionAcceptRepository) DomainModelToModel(from *domain.DiscussionAccept) (*models.DiscussionAccept, error) {
  150 + to := &models.DiscussionAccept{}
  151 + err := copier.Copy(to, from)
  152 + return to, err
  153 +}
  154 +
  155 +func NewDiscussionAcceptRepository(cache *cache.CachedRepository) domain.DiscussionAcceptRepository {
  156 + return &DiscussionAcceptRepository{CachedRepository: cache}
  157 +}
  1 +package repository
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/jinzhu/copier"
  6 + "github.com/pkg/errors"
  7 + "github.com/tiptok/gocomm/pkg/cache"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/models"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  11 + "gorm.io/gorm"
  12 +)
  13 +
  14 +type DiscussionOpinionRepository struct {
  15 + *cache.CachedRepository
  16 +}
  17 +
  18 +func (repository *DiscussionOpinionRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.DiscussionOpinion) (*domain.DiscussionOpinion, error) {
  19 + var (
  20 + err error
  21 + m = &models.DiscussionOpinion{}
  22 + tx = conn.DB()
  23 + )
  24 + if m, err = repository.DomainModelToModel(dm); err != nil {
  25 + return nil, err
  26 + }
  27 + if tx = tx.Model(m).Save(m); tx.Error != nil {
  28 + return nil, tx.Error
  29 + }
  30 + dm.Id = m.Id
  31 + return repository.ModelToDomainModel(m)
  32 +
  33 +}
  34 +
  35 +func (repository *DiscussionOpinionRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.DiscussionOpinion) (*domain.DiscussionOpinion, error) {
  36 + var (
  37 + err error
  38 + m *models.DiscussionOpinion
  39 + tx = conn.DB()
  40 + )
  41 + if m, err = repository.DomainModelToModel(dm); err != nil {
  42 + return nil, err
  43 + }
  44 + queryFunc := func() (interface{}, error) {
  45 + tx = tx.Model(m).Updates(m)
  46 + return nil, tx.Error
  47 + }
  48 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  49 + return nil, err
  50 + }
  51 + return repository.ModelToDomainModel(m)
  52 +}
  53 +
  54 +func (repository *DiscussionOpinionRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.DiscussionOpinion) (*domain.DiscussionOpinion, error) {
  55 + var (
  56 + err error
  57 + m *models.DiscussionOpinion
  58 + tx = transaction.DB()
  59 + )
  60 + if m, err = repository.DomainModelToModel(dm); err != nil {
  61 + return nil, err
  62 + }
  63 + oldVersion := dm.Version
  64 + m.Version += 1
  65 + queryFunc := func() (interface{}, error) {
  66 + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m)
  67 + if tx.RowsAffected == 0 {
  68 + return nil, domain.ErrUpdateFail
  69 + }
  70 + return nil, tx.Error
  71 + }
  72 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  73 + return nil, err
  74 + }
  75 + return repository.ModelToDomainModel(m)
  76 +}
  77 +
  78 +func (repository *DiscussionOpinionRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.DiscussionOpinion) (*domain.DiscussionOpinion, error) {
  79 + var (
  80 + tx = conn.DB()
  81 + m = &models.DiscussionOpinion{Id: dm.Identify().(int64)}
  82 + )
  83 + queryFunc := func() (interface{}, error) {
  84 + tx = tx.Where("id = ?", m.Id).Delete(m)
  85 + return m, tx.Error
  86 + }
  87 + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  88 + return dm, err
  89 + }
  90 + return repository.ModelToDomainModel(m)
  91 +}
  92 +
  93 +func (repository *DiscussionOpinionRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.DiscussionOpinion, error) {
  94 + var (
  95 + err error
  96 + tx = conn.DB()
  97 + m = new(models.DiscussionOpinion)
  98 + )
  99 + queryFunc := func() (interface{}, error) {
  100 + tx = tx.Model(m).Where("id = ?", id).First(m)
  101 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  102 + return nil, domain.ErrNotFound
  103 + }
  104 + return m, tx.Error
  105 + }
  106 + cacheModel := new(models.DiscussionOpinion)
  107 + cacheModel.Id = id
  108 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  109 + return nil, err
  110 + }
  111 + return repository.ModelToDomainModel(m)
  112 +}
  113 +
  114 +func (repository *DiscussionOpinionRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.DiscussionOpinion, error) {
  115 + var (
  116 + tx = conn.DB()
  117 + ms []*models.DiscussionOpinion
  118 + dms = make([]*domain.DiscussionOpinion, 0)
  119 + total int64
  120 + )
  121 + queryFunc := func() (interface{}, error) {
  122 + tx = tx.Model(&ms).Order("id desc")
  123 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  124 + return dms, tx.Error
  125 + }
  126 + return dms, nil
  127 + }
  128 +
  129 + if _, err := repository.Query(queryFunc); err != nil {
  130 + return 0, nil, err
  131 + }
  132 +
  133 + for _, item := range ms {
  134 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  135 + return 0, dms, err
  136 + } else {
  137 + dms = append(dms, dm)
  138 + }
  139 + }
  140 + return total, dms, nil
  141 +}
  142 +
  143 +func (repository *DiscussionOpinionRepository) ModelToDomainModel(from *models.DiscussionOpinion) (*domain.DiscussionOpinion, error) {
  144 + to := &domain.DiscussionOpinion{}
  145 + err := copier.Copy(to, from)
  146 + return to, err
  147 +}
  148 +
  149 +func (repository *DiscussionOpinionRepository) DomainModelToModel(from *domain.DiscussionOpinion) (*models.DiscussionOpinion, error) {
  150 + to := &models.DiscussionOpinion{}
  151 + err := copier.Copy(to, from)
  152 + return to, err
  153 +}
  154 +
  155 +func NewDiscussionOpinionRepository(cache *cache.CachedRepository) domain.DiscussionOpinionRepository {
  156 + return &DiscussionOpinionRepository{CachedRepository: cache}
  157 +}
  1 +package repository
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/jinzhu/copier"
  6 + "github.com/pkg/errors"
  7 + "github.com/tiptok/gocomm/pkg/cache"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/models"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  11 + "gorm.io/gorm"
  12 +)
  13 +
  14 +type DiscussionRepository struct {
  15 + *cache.CachedRepository
  16 +}
  17 +
  18 +func (repository *DiscussionRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.Discussion) (*domain.Discussion, error) {
  19 + var (
  20 + err error
  21 + m = &models.Discussion{}
  22 + tx = conn.DB()
  23 + )
  24 + if m, err = repository.DomainModelToModel(dm); err != nil {
  25 + return nil, err
  26 + }
  27 + if tx = tx.Model(m).Save(m); tx.Error != nil {
  28 + return nil, tx.Error
  29 + }
  30 + dm.Id = m.Id
  31 + return repository.ModelToDomainModel(m)
  32 +
  33 +}
  34 +
  35 +func (repository *DiscussionRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.Discussion) (*domain.Discussion, error) {
  36 + var (
  37 + err error
  38 + m *models.Discussion
  39 + tx = conn.DB()
  40 + )
  41 + if m, err = repository.DomainModelToModel(dm); err != nil {
  42 + return nil, err
  43 + }
  44 + queryFunc := func() (interface{}, error) {
  45 + tx = tx.Model(m).Updates(m)
  46 + return nil, tx.Error
  47 + }
  48 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  49 + return nil, err
  50 + }
  51 + return repository.ModelToDomainModel(m)
  52 +}
  53 +
  54 +func (repository *DiscussionRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.Discussion) (*domain.Discussion, error) {
  55 + var (
  56 + err error
  57 + m *models.Discussion
  58 + tx = transaction.DB()
  59 + )
  60 + if m, err = repository.DomainModelToModel(dm); err != nil {
  61 + return nil, err
  62 + }
  63 + oldVersion := dm.Version
  64 + m.Version += 1
  65 + queryFunc := func() (interface{}, error) {
  66 + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m)
  67 + if tx.RowsAffected == 0 {
  68 + return nil, domain.ErrUpdateFail
  69 + }
  70 + return nil, tx.Error
  71 + }
  72 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  73 + return nil, err
  74 + }
  75 + return repository.ModelToDomainModel(m)
  76 +}
  77 +
  78 +func (repository *DiscussionRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.Discussion) (*domain.Discussion, error) {
  79 + var (
  80 + tx = conn.DB()
  81 + m = &models.Discussion{Id: dm.Identify().(int64)}
  82 + )
  83 + queryFunc := func() (interface{}, error) {
  84 + tx = tx.Where("id = ?", m.Id).Delete(m)
  85 + return m, tx.Error
  86 + }
  87 + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  88 + return dm, err
  89 + }
  90 + return repository.ModelToDomainModel(m)
  91 +}
  92 +
  93 +func (repository *DiscussionRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.Discussion, error) {
  94 + var (
  95 + err error
  96 + tx = conn.DB()
  97 + m = new(models.Discussion)
  98 + )
  99 + queryFunc := func() (interface{}, error) {
  100 + tx = tx.Model(m).Where("id = ?", id).First(m)
  101 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  102 + return nil, domain.ErrNotFound
  103 + }
  104 + return m, tx.Error
  105 + }
  106 + cacheModel := new(models.Discussion)
  107 + cacheModel.Id = id
  108 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  109 + return nil, err
  110 + }
  111 + return repository.ModelToDomainModel(m)
  112 +}
  113 +
  114 +func (repository *DiscussionRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.Discussion, error) {
  115 + var (
  116 + tx = conn.DB()
  117 + ms []*models.Discussion
  118 + dms = make([]*domain.Discussion, 0)
  119 + total int64
  120 + )
  121 + queryFunc := func() (interface{}, error) {
  122 + tx = tx.Model(&ms).Order("id desc")
  123 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  124 + return dms, tx.Error
  125 + }
  126 + return dms, nil
  127 + }
  128 +
  129 + if _, err := repository.Query(queryFunc); err != nil {
  130 + return 0, nil, err
  131 + }
  132 +
  133 + for _, item := range ms {
  134 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  135 + return 0, dms, err
  136 + } else {
  137 + dms = append(dms, dm)
  138 + }
  139 + }
  140 + return total, dms, nil
  141 +}
  142 +
  143 +func (repository *DiscussionRepository) ModelToDomainModel(from *models.Discussion) (*domain.Discussion, error) {
  144 + to := &domain.Discussion{}
  145 + err := copier.Copy(to, from)
  146 + return to, err
  147 +}
  148 +
  149 +func (repository *DiscussionRepository) DomainModelToModel(from *domain.Discussion) (*models.Discussion, error) {
  150 + to := &models.Discussion{}
  151 + err := copier.Copy(to, from)
  152 + return to, err
  153 +}
  154 +
  155 +func NewDiscussionRepository(cache *cache.CachedRepository) domain.DiscussionRepository {
  156 + return &DiscussionRepository{CachedRepository: cache}
  157 +}
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 +)
  7 +
  8 +type Discussion struct {
  9 + Id int64 // 唯一标识
  10 + Title string `json:"title"` // 标题(不超过30个字符)
  11 + Content string `json:"content"` // 内容(不超过500个字符)
  12 + Images []Image `json:"images"` // 图片(不超过5张)
  13 + Widget Widget `json:"widget"` // 小组件
  14 + ProviderId int64 `json:"providerId"` // 发起者ID
  15 + ParticipantIds []int64 `json:"participantIds"` // 参与者ID
  16 + ArticleId int64 `json:"articleId"` // 文章ID
  17 + State int `json:"state"` // 状态(1进行中、2搁置、3中止、4结案)
  18 + CreatedAt int64 `json:",omitempty"`
  19 + UpdatedAt int64 `json:",omitempty"`
  20 + DeletedAt int64 `json:",omitempty"`
  21 + Version int `json:",omitempty"`
  22 +}
  23 +
  24 +type DiscussionRepository interface {
  25 + Insert(ctx context.Context, conn transaction.Conn, dm *Discussion) (*Discussion, error)
  26 + Update(ctx context.Context, conn transaction.Conn, dm *Discussion) (*Discussion, error)
  27 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *Discussion) (*Discussion, error)
  28 + Delete(ctx context.Context, conn transaction.Conn, dm *Discussion) (*Discussion, error)
  29 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*Discussion, error)
  30 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*Discussion, error)
  31 +}
  32 +
  33 +func (m *Discussion) Identify() interface{} {
  34 + if m.Id == 0 {
  35 + return nil
  36 + }
  37 + return m.Id
  38 +}
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 +)
  7 +
  8 +type DiscussionAccept struct {
  9 + Id int64 // 唯一标识
  10 + ArticleId int64 `json:"articleId"` // 文章ID
  11 + DiscussionId int64 `json:"discussionId"` // 讨论ID
  12 + ProviderId int64 `json:"providerId"` // 发起人ID
  13 + DoIds []int64 `json:"DoIds"` // 意见采纳-用户观点
  14 + OpinionId int64 `json:"opinionId"` // 价值判定-选择观点
  15 + SubjectiveTitle string `json:"subjectiveTitle"` // 主观认定-标题
  16 + SubjectiveDesc string `json:"subjectiveDesc"` // 主观认定-内容
  17 + CreatedAt int64 `json:",omitempty"`
  18 + UpdatedAt int64 `json:",omitempty"`
  19 + DeletedAt int64 `json:",omitempty"`
  20 + Version int `json:",omitempty"`
  21 +}
  22 +
  23 +type DiscussionAcceptRepository interface {
  24 + Insert(ctx context.Context, conn transaction.Conn, dm *DiscussionAccept) (*DiscussionAccept, error)
  25 + Update(ctx context.Context, conn transaction.Conn, dm *DiscussionAccept) (*DiscussionAccept, error)
  26 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *DiscussionAccept) (*DiscussionAccept, error)
  27 + Delete(ctx context.Context, conn transaction.Conn, dm *DiscussionAccept) (*DiscussionAccept, error)
  28 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*DiscussionAccept, error)
  29 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*DiscussionAccept, error)
  30 +}
  31 +
  32 +func (m *DiscussionAccept) Identify() interface{} {
  33 + if m.Id == 0 {
  34 + return nil
  35 + }
  36 + return m.Id
  37 +}
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 +)
  7 +
  8 +type DiscussionOpinion struct {
  9 + Id int64 // 唯一标识
  10 + ArticleId int64 `json:"articleId"` // 文章ID
  11 + DiscussionId int64 `json:"discussionId"` // 讨论ID
  12 + ProviderId int64 `json:"providerId"` // 用户ID
  13 + OpinionId int64 `json:"opinionId"` // 选项ID
  14 + OpinionDesc string `json:"opinionDesc"` // 选项描述
  15 + Reason string `json:"reason"` // 理由
  16 + Show int `json:"show"` // 显示状态(1显示、0不显示)
  17 + AcceptUserId int64 `json:"acceptUserId"` // 采纳人ID(最终结案的时候唯一)
  18 + CreatedAt int64 `json:",omitempty"`
  19 + UpdatedAt int64 `json:",omitempty"`
  20 + DeletedAt int64 `json:",omitempty"`
  21 + Version int `json:",omitempty"`
  22 +}
  23 +
  24 +type DiscussionOpinionRepository interface {
  25 + Insert(ctx context.Context, conn transaction.Conn, dm *DiscussionOpinion) (*DiscussionOpinion, error)
  26 + Update(ctx context.Context, conn transaction.Conn, dm *DiscussionOpinion) (*DiscussionOpinion, error)
  27 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *DiscussionOpinion) (*DiscussionOpinion, error)
  28 + Delete(ctx context.Context, conn transaction.Conn, dm *DiscussionOpinion) (*DiscussionOpinion, error)
  29 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*DiscussionOpinion, error)
  30 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*DiscussionOpinion, error)
  31 +}
  32 +
  33 +func (m *DiscussionOpinion) Identify() interface{} {
  34 + if m.Id == 0 {
  35 + return nil
  36 + }
  37 + return m.Id
  38 +}
@@ -14,6 +14,20 @@ type Location struct { @@ -14,6 +14,20 @@ type Location struct {
14 Descript string `json:"descript"` //地点描述 14 Descript string `json:"descript"` //地点描述
15 } 15 }
16 16
  17 +// Widget 小组件
  18 +type Widget struct {
  19 + Id int64 `json:"id"` // ID
  20 + Type int `json:"type"` // 类型(1投票、2PK)
  21 + Title string `json:"title"` // 标题(不超过15个字)
  22 + Opinions []Opinion `json:"opinions"` // 选项
  23 +}
  24 +
  25 +// Opinion 观点选项
  26 +type Opinion struct {
  27 + Id int64 `json:"id"` // ID
  28 + Desc string `json:"desc"` // 描述(不超过10个字)
  29 +}
  30 +
17 type UserSimple struct { 31 type UserSimple struct {
18 Id int64 // 人员id 32 Id int64 // 人员id
19 Name string // 人员的名字 33 Name string // 人员的名字