Merge branch 'dev' of http://gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss into dev
正在显示
30 个修改的文件
包含
1242 行增加
和
94 行删除
| @@ -544,6 +544,7 @@ type ( | @@ -544,6 +544,7 @@ type ( | ||
| 544 | MiniSearchArticleItem{ | 544 | MiniSearchArticleItem{ |
| 545 | ArticleId int64 `json:"articleId"` | 545 | ArticleId int64 `json:"articleId"` |
| 546 | Title string `json:"title"` | 546 | Title string `json:"title"` |
| 547 | + AuthorId int64 `json:"authorId"` | ||
| 547 | Author string `json:"author"` // 发布人 | 548 | Author string `json:"author"` // 发布人 |
| 548 | Avatar string `json:"avatar"`// 发布人的头像 | 549 | Avatar string `json:"avatar"`// 发布人的头像 |
| 549 | Images []string `json:"images"` | 550 | Images []string `json:"images"` |
| @@ -106,6 +106,7 @@ type ( | @@ -106,6 +106,7 @@ type ( | ||
| 106 | 106 | ||
| 107 | CommentAtWho { | 107 | CommentAtWho { |
| 108 | Id int64 `json:"id"` | 108 | Id int64 `json:"id"` |
| 109 | + Avatar string `json:"avatar,optional"` // 人员头像URL | ||
| 109 | Name string `json:"name,optional"` | 110 | Name string `json:"name,optional"` |
| 110 | FirstLetter string `json:"firstLetter,optional"` | 111 | FirstLetter string `json:"firstLetter,optional"` |
| 111 | } | 112 | } |
| @@ -365,6 +366,7 @@ type ( | @@ -365,6 +366,7 @@ type ( | ||
| 365 | CompanyId int64 `json:",optional"` | 366 | CompanyId int64 `json:",optional"` |
| 366 | Id int64 `json:"id"` | 367 | Id int64 `json:"id"` |
| 367 | Show int `json:"show"` //[1 显示评论] [2: 隐藏评论] | 368 | Show int `json:"show"` //[1 显示评论] [2: 隐藏评论] |
| 369 | + Content string `json:"content,optional"` | ||
| 368 | CountAdminLove int `json:"countAdminLove,optional"` | 370 | CountAdminLove int `json:"countAdminLove,optional"` |
| 369 | } | 371 | } |
| 370 | 372 |
| @@ -55,6 +55,9 @@ service Core { | @@ -55,6 +55,9 @@ service Core { | ||
| 55 | @doc "用户快讯" | 55 | @doc "用户快讯" |
| 56 | @handler miniUserNews | 56 | @handler miniUserNews |
| 57 | post /mini/user/news (MiniUserNewsRequest)returns(MiniUserNewsResposne) | 57 | post /mini/user/news (MiniUserNewsRequest)returns(MiniUserNewsResposne) |
| 58 | + @doc "我关注人发布的信息" | ||
| 59 | + @handler miniUserMyFollowingNews | ||
| 60 | + post /mini/user/my_following_news (MiniUserNewsRequest)returns(MiniUserNewsResposne) | ||
| 58 | @doc "关注我的人" | 61 | @doc "关注我的人" |
| 59 | @handler miniUserFollower | 62 | @handler miniUserFollower |
| 60 | post /mini/user/follower (MiniUserFollowedSearchRequest)returns(MiniUserFollowedSearchResponse) | 63 | post /mini/user/follower (MiniUserFollowedSearchRequest)returns(MiniUserFollowedSearchResponse) |
| @@ -9,12 +9,13 @@ Timeout: 30000 | @@ -9,12 +9,13 @@ Timeout: 30000 | ||
| 9 | LogRequest: true # 记录详细请求日志 | 9 | LogRequest: true # 记录详细请求日志 |
| 10 | 10 | ||
| 11 | Log: | 11 | Log: |
| 12 | - #Mode: file | 12 | + # Mode: file |
| 13 | Encoding: plain | 13 | Encoding: plain |
| 14 | Level: debug # info | 14 | Level: debug # info |
| 15 | MaxSize: 1 # 2MB | 15 | MaxSize: 1 # 2MB |
| 16 | TimeFormat: 2006-01-02 15:04:05 | 16 | TimeFormat: 2006-01-02 15:04:05 |
| 17 | - #Rotation: size | 17 | + Rotation: size |
| 18 | + MaxContentLength: 10240 | ||
| 18 | 19 | ||
| 19 | SystemAuth: | 20 | SystemAuth: |
| 20 | AccessSecret: digital-platform | 21 | AccessSecret: digital-platform |
| @@ -276,6 +276,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { | @@ -276,6 +276,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { | ||
| 276 | }, | 276 | }, |
| 277 | { | 277 | { |
| 278 | Method: http.MethodPost, | 278 | Method: http.MethodPost, |
| 279 | + Path: "/mini/user/my_following_news", | ||
| 280 | + Handler: user.MiniUserMyFollowingNewsHandler(serverCtx), | ||
| 281 | + }, | ||
| 282 | + { | ||
| 283 | + Method: http.MethodPost, | ||
| 279 | Path: "/mini/user/follower", | 284 | Path: "/mini/user/follower", |
| 280 | Handler: user.MiniUserFollowerHandler(serverCtx), | 285 | Handler: user.MiniUserFollowerHandler(serverCtx), |
| 281 | }, | 286 | }, |
| 1 | +package user | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/user" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +func MiniUserMyFollowingNewsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
| 14 | + return func(w http.ResponseWriter, r *http.Request) { | ||
| 15 | + var req types.MiniUserNewsRequest | ||
| 16 | + if err := httpx.Parse(r, &req); err != nil { | ||
| 17 | + httpx.ErrorCtx(r.Context(), w, err) | ||
| 18 | + return | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + l := user.NewMiniUserMyFollowingNewsLogic(r.Context(), svcCtx) | ||
| 22 | + resp, err := l.MiniUserMyFollowingNews(&req) | ||
| 23 | + result.HttpResult(r, w, resp, err) | ||
| 24 | + } | ||
| 25 | +} |
| @@ -3,8 +3,10 @@ package article | @@ -3,8 +3,10 @@ package article | ||
| 3 | import ( | 3 | import ( |
| 4 | "context" | 4 | "context" |
| 5 | 5 | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction" | ||
| 6 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" | 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata" | 8 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata" |
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" | ||
| 8 | 10 | ||
| 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" | 11 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" |
| 10 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" | 12 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" |
| @@ -16,6 +18,7 @@ type MiniArticleMarkListLogic struct { | @@ -16,6 +18,7 @@ type MiniArticleMarkListLogic struct { | ||
| 16 | logx.Logger | 18 | logx.Logger |
| 17 | ctx context.Context | 19 | ctx context.Context |
| 18 | svcCtx *svc.ServiceContext | 20 | svcCtx *svc.ServiceContext |
| 21 | + userCache map[int64]*domain.User | ||
| 19 | } | 22 | } |
| 20 | 23 | ||
| 21 | func NewMiniArticleMarkListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleMarkListLogic { | 24 | func NewMiniArticleMarkListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniArticleMarkListLogic { |
| @@ -23,6 +26,7 @@ func NewMiniArticleMarkListLogic(ctx context.Context, svcCtx *svc.ServiceContext | @@ -23,6 +26,7 @@ func NewMiniArticleMarkListLogic(ctx context.Context, svcCtx *svc.ServiceContext | ||
| 23 | Logger: logx.WithContext(ctx), | 26 | Logger: logx.WithContext(ctx), |
| 24 | ctx: ctx, | 27 | ctx: ctx, |
| 25 | svcCtx: svcCtx, | 28 | svcCtx: svcCtx, |
| 29 | + userCache: make(map[int64]*domain.User, 0), | ||
| 26 | } | 30 | } |
| 27 | } | 31 | } |
| 28 | 32 | ||
| @@ -36,10 +40,16 @@ func (l *MiniArticleMarkListLogic) MiniArticleMarkList(req *types.MiniArticleMar | @@ -36,10 +40,16 @@ func (l *MiniArticleMarkListLogic) MiniArticleMarkList(req *types.MiniArticleMar | ||
| 36 | if err != nil { | 40 | if err != nil { |
| 37 | return nil, err | 41 | return nil, err |
| 38 | } | 42 | } |
| 43 | + companyInfo, err := l.svcCtx.CompanyRepository.FindOne(l.ctx, l.svcCtx.DefaultDBConn(), userToken.CompanyId) | ||
| 44 | + if err != nil { | ||
| 45 | + return nil, xerr.NewErrMsgErr("获取文章信息失败", err) | ||
| 46 | + } | ||
| 39 | resp = &types.MiniArticleMarkListResponse{} | 47 | resp = &types.MiniArticleMarkListResponse{} |
| 40 | resp.Total = total | 48 | resp.Total = total |
| 41 | resp.List = make([]types.MiniArticleMarkItem, 0) | 49 | resp.List = make([]types.MiniArticleMarkItem, 0) |
| 50 | + var author domain.User | ||
| 42 | for _, item := range list { | 51 | for _, item := range list { |
| 52 | + author = l.getAuthor(l.svcCtx.DefaultDBConn(), item.Author.Id) | ||
| 43 | to := types.MiniArticleMarkItem{ | 53 | to := types.MiniArticleMarkItem{ |
| 44 | Id: item.Id, | 54 | Id: item.Id, |
| 45 | CompanyId: item.CompanyId, | 55 | CompanyId: item.CompanyId, |
| @@ -48,10 +58,10 @@ func (l *MiniArticleMarkListLogic) MiniArticleMarkList(req *types.MiniArticleMar | @@ -48,10 +58,10 @@ func (l *MiniArticleMarkListLogic) MiniArticleMarkList(req *types.MiniArticleMar | ||
| 48 | Author: types.SimpleUser{ | 58 | Author: types.SimpleUser{ |
| 49 | Id: item.Author.Id, | 59 | Id: item.Author.Id, |
| 50 | CompanyId: item.Author.CompanyId, | 60 | CompanyId: item.Author.CompanyId, |
| 51 | - CompanyName: item.Author.Company, | ||
| 52 | - Name: item.Author.Name, | ||
| 53 | - Avatar: item.Author.Avatar, | ||
| 54 | - Position: item.Author.Position, | 61 | + CompanyName: companyInfo.Name, |
| 62 | + Name: author.Name, | ||
| 63 | + Avatar: author.Avatar, | ||
| 64 | + Position: author.Position, | ||
| 55 | }, | 65 | }, |
| 56 | UpdatedAt: item.UpdatedAt, | 66 | UpdatedAt: item.UpdatedAt, |
| 57 | } | 67 | } |
| @@ -59,3 +69,15 @@ func (l *MiniArticleMarkListLogic) MiniArticleMarkList(req *types.MiniArticleMar | @@ -59,3 +69,15 @@ func (l *MiniArticleMarkListLogic) MiniArticleMarkList(req *types.MiniArticleMar | ||
| 59 | } | 69 | } |
| 60 | return resp, nil | 70 | return resp, nil |
| 61 | } | 71 | } |
| 72 | + | ||
| 73 | +func (l *MiniArticleMarkListLogic) getAuthor(conn transaction.Conn, userid int64) domain.User { | ||
| 74 | + if u, ok := l.userCache[userid]; ok { | ||
| 75 | + return *u | ||
| 76 | + } | ||
| 77 | + toUser, err := l.svcCtx.UserRepository.FindOne(l.ctx, conn, userid) | ||
| 78 | + if err == nil { | ||
| 79 | + l.userCache[toUser.Id] = toUser | ||
| 80 | + return *toUser | ||
| 81 | + } | ||
| 82 | + return domain.User{} | ||
| 83 | +} |
| @@ -11,6 +11,7 @@ import ( | @@ -11,6 +11,7 @@ import ( | ||
| 11 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" | 11 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" |
| 12 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" | 12 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" |
| 13 | 13 | ||
| 14 | + "github.com/samber/lo" | ||
| 14 | "github.com/zeromicro/go-zero/core/logx" | 15 | "github.com/zeromicro/go-zero/core/logx" |
| 15 | ) | 16 | ) |
| 16 | 17 | ||
| @@ -61,6 +62,7 @@ func (l *MiniArticleSetTagLogic) MiniArticleSetTag(req *types.MiniArticleSetTagR | @@ -61,6 +62,7 @@ func (l *MiniArticleSetTagLogic) MiniArticleSetTag(req *types.MiniArticleSetTagR | ||
| 61 | } | 62 | } |
| 62 | articleAndTagList = append(articleAndTagList, articleAndTag) | 63 | articleAndTagList = append(articleAndTagList, articleAndTag) |
| 63 | } | 64 | } |
| 65 | + tagIdList = lo.Union(tagIdList) | ||
| 64 | //更新article中的tags | 66 | //更新article中的tags |
| 65 | articleInfo.Tags = tagIdList | 67 | articleInfo.Tags = tagIdList |
| 66 | // 查询可能存在的 ArticleAndTag | 68 | // 查询可能存在的 ArticleAndTag |
| @@ -35,15 +35,9 @@ func NewMiniCreateArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) | @@ -35,15 +35,9 @@ func NewMiniCreateArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) | ||
| 35 | // 创建新文章 | 35 | // 创建新文章 |
| 36 | func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateRequest) (resp *types.MiniArticleCreateResponse, err error) { | 36 | func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateRequest) (resp *types.MiniArticleCreateResponse, err error) { |
| 37 | var conn = l.svcCtx.DefaultDBConn() | 37 | var conn = l.svcCtx.DefaultDBConn() |
| 38 | - | ||
| 39 | - // 检查文字数量 | ||
| 40 | - wordNum := 0 | ||
| 41 | - for i := range req.Section { | ||
| 42 | - num := utf8.RuneCountInString(req.Section[i]) | ||
| 43 | - wordNum += num | ||
| 44 | - } | ||
| 45 | - if wordNum >= 1000 { | ||
| 46 | - return nil, xerr.NewErrMsgErr("最多只能输入1000字", err) | 38 | + err = l.validateTextLimit(req) |
| 39 | + if err != nil { | ||
| 40 | + return nil, err | ||
| 47 | } | 41 | } |
| 48 | // 检查发布人 | 42 | // 检查发布人 |
| 49 | author, err := l.svcCtx.UserRepository.FindOne(l.ctx, conn, req.AuthorId) | 43 | author, err := l.svcCtx.UserRepository.FindOne(l.ctx, conn, req.AuthorId) |
| @@ -181,19 +175,7 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR | @@ -181,19 +175,7 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR | ||
| 181 | newArticle.MatchUrl[k] = v | 175 | newArticle.MatchUrl[k] = v |
| 182 | } | 176 | } |
| 183 | //设置内容概要 | 177 | //设置内容概要 |
| 184 | - if len(sectionList) > 0 { | ||
| 185 | - // 截取内容 50个字 | ||
| 186 | - runeNumber := 0 //字数 | ||
| 187 | - stringIndex := 0 //字符串长度 | ||
| 188 | - for i := range sectionList[0].Content { | ||
| 189 | - if runeNumber > 50 { | ||
| 190 | - break | ||
| 191 | - } | ||
| 192 | - runeNumber += 1 | ||
| 193 | - stringIndex = i | ||
| 194 | - } | ||
| 195 | - newArticle.Summary = sectionList[0].Content[0:stringIndex] | ||
| 196 | - } | 178 | + newArticle.SetSummary(sectionList) |
| 197 | 179 | ||
| 198 | err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { | 180 | err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { |
| 199 | newArticle, err = l.svcCtx.ArticleRepository.Insert(ctx, c, newArticle) | 181 | newArticle, err = l.svcCtx.ArticleRepository.Insert(ctx, c, newArticle) |
| @@ -208,13 +190,6 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR | @@ -208,13 +190,6 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR | ||
| 208 | return xerr.NewErrMsgErr("创建文章内容失败", err) | 190 | return xerr.NewErrMsgErr("创建文章内容失败", err) |
| 209 | } | 191 | } |
| 210 | } | 192 | } |
| 211 | - // 设置保存备份 | ||
| 212 | - // backup := newArticle.MakeBackup(newArticle.Author, sectionList) | ||
| 213 | - // backup.Action = "新增" | ||
| 214 | - // _, err = l.svcCtx.ArticleBackupRepository.Insert(ctx, c, backup) | ||
| 215 | - // if err != nil { | ||
| 216 | - // return xerr.NewErrMsgErr("创建文章内容失败", err) | ||
| 217 | - // } | ||
| 218 | return nil | 193 | return nil |
| 219 | }, true) | 194 | }, true) |
| 220 | if err != nil { | 195 | if err != nil { |
| @@ -226,3 +201,22 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR | @@ -226,3 +201,22 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR | ||
| 226 | } | 201 | } |
| 227 | return | 202 | return |
| 228 | } | 203 | } |
| 204 | + | ||
| 205 | +// validateTextLimit 验证输入文本长度 | ||
| 206 | +func (l *MiniCreateArticleLogic) validateTextLimit(req *types.MiniArticleCreateRequest) error { | ||
| 207 | + | ||
| 208 | + titleWordNum := utf8.RuneCountInString(req.Title) | ||
| 209 | + if titleWordNum > 64 { | ||
| 210 | + return xerr.NewErrMsg("标题最多只能输入64字") | ||
| 211 | + } | ||
| 212 | + wordNum := 0 | ||
| 213 | + for i := range req.Section { | ||
| 214 | + num := utf8.RuneCountInString(req.Section[i]) | ||
| 215 | + wordNum += num | ||
| 216 | + } | ||
| 217 | + if wordNum > 1000 { | ||
| 218 | + return xerr.NewErrMsg("内容最多只能输入1000字") | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + return nil | ||
| 222 | +} |
| @@ -41,7 +41,8 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( | @@ -41,7 +41,8 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( | ||
| 41 | if articleInfo.CompanyId != req.CompanyId { | 41 | if articleInfo.CompanyId != req.CompanyId { |
| 42 | return nil, xerr.NewErrMsg("没有查看权限") | 42 | return nil, xerr.NewErrMsg("没有查看权限") |
| 43 | } | 43 | } |
| 44 | - | 44 | + // 检查文章的可查看人 |
| 45 | + if articleInfo.AuthorId != int64(req.UserId) { | ||
| 45 | if len(articleInfo.WhoRead) > 0 { | 46 | if len(articleInfo.WhoRead) > 0 { |
| 46 | inWhoRead := false | 47 | inWhoRead := false |
| 47 | for _, val := range articleInfo.WhoRead { | 48 | for _, val := range articleInfo.WhoRead { |
| @@ -51,23 +52,25 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( | @@ -51,23 +52,25 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( | ||
| 51 | } | 52 | } |
| 52 | if !inWhoRead { | 53 | if !inWhoRead { |
| 53 | // 文章内容不显示 | 54 | // 文章内容不显示 |
| 54 | - resp = &types.MiniArticleGetResponse{ | ||
| 55 | - Id: articleInfo.Id, | ||
| 56 | - Title: articleInfo.Title, | ||
| 57 | - Show: int(domain.ArticleShowDisable), | 55 | + // resp = &types.MiniArticleGetResponse{ |
| 56 | + // Id: articleInfo.Id, | ||
| 57 | + // Title: articleInfo.Title, | ||
| 58 | + // Show: int(domain.ArticleShowDisable), | ||
| 59 | + // } | ||
| 60 | + // return resp, nil | ||
| 61 | + return nil, xerr.NewErrMsg("没有查看权限") | ||
| 58 | } | 62 | } |
| 59 | - return resp, nil | ||
| 60 | } | 63 | } |
| 61 | } | 64 | } |
| 62 | - | ||
| 63 | if articleInfo.Show == domain.ArticleShowDisable { | 65 | if articleInfo.Show == domain.ArticleShowDisable { |
| 64 | // 文章内容不显示 | 66 | // 文章内容不显示 |
| 65 | - resp = &types.MiniArticleGetResponse{ | ||
| 66 | - Id: articleInfo.Id, | ||
| 67 | - Title: articleInfo.Title, | ||
| 68 | - Show: int(domain.ArticleShowDisable), | ||
| 69 | - } | ||
| 70 | - return resp, nil | 67 | + // resp = &types.MiniArticleGetResponse{ |
| 68 | + // Id: articleInfo.Id, | ||
| 69 | + // Title: articleInfo.Title, | ||
| 70 | + // Show: int(domain.ArticleShowDisable), | ||
| 71 | + // } | ||
| 72 | + // return resp, nil | ||
| 73 | + return nil, xerr.NewErrMsg("没有查看权限") | ||
| 71 | } | 74 | } |
| 72 | 75 | ||
| 73 | queryOption := domain.NewQueryOptions(). | 76 | queryOption := domain.NewQueryOptions(). |
| @@ -80,7 +83,7 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( | @@ -80,7 +83,7 @@ func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) ( | ||
| 80 | } | 83 | } |
| 81 | 84 | ||
| 82 | //获取作者信息 | 85 | //获取作者信息 |
| 83 | - author, _ := l.svcCtx.UserRepository.FindOne(l.ctx, conn, int64(req.UserId)) | 86 | + author, _ := l.svcCtx.UserRepository.FindOne(l.ctx, conn, int64(articleInfo.AuthorId)) |
| 84 | 87 | ||
| 85 | var meLoveFlag int | 88 | var meLoveFlag int |
| 86 | if req.UserId > 0 { | 89 | if req.UserId > 0 { |
| @@ -5,6 +5,7 @@ import ( | @@ -5,6 +5,7 @@ import ( | ||
| 5 | 5 | ||
| 6 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" | 6 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" | 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" |
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction" | ||
| 8 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" | 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" | 10 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" |
| 10 | 11 | ||
| @@ -15,6 +16,7 @@ type MiniSearchArticlePageLogic struct { | @@ -15,6 +16,7 @@ type MiniSearchArticlePageLogic struct { | ||
| 15 | logx.Logger | 16 | logx.Logger |
| 16 | ctx context.Context | 17 | ctx context.Context |
| 17 | svcCtx *svc.ServiceContext | 18 | svcCtx *svc.ServiceContext |
| 19 | + userCache map[int64]*domain.User | ||
| 18 | } | 20 | } |
| 19 | 21 | ||
| 20 | func NewMiniSearchArticlePageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniSearchArticlePageLogic { | 22 | func NewMiniSearchArticlePageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniSearchArticlePageLogic { |
| @@ -22,6 +24,7 @@ func NewMiniSearchArticlePageLogic(ctx context.Context, svcCtx *svc.ServiceConte | @@ -22,6 +24,7 @@ func NewMiniSearchArticlePageLogic(ctx context.Context, svcCtx *svc.ServiceConte | ||
| 22 | Logger: logx.WithContext(ctx), | 24 | Logger: logx.WithContext(ctx), |
| 23 | ctx: ctx, | 25 | ctx: ctx, |
| 24 | svcCtx: svcCtx, | 26 | svcCtx: svcCtx, |
| 27 | + userCache: make(map[int64]*domain.User), | ||
| 25 | } | 28 | } |
| 26 | } | 29 | } |
| 27 | 30 | ||
| @@ -63,11 +66,13 @@ func (l *MiniSearchArticlePageLogic) MiniSearchArticlePage(req *types.MiniSearch | @@ -63,11 +66,13 @@ func (l *MiniSearchArticlePageLogic) MiniSearchArticlePage(req *types.MiniSearch | ||
| 63 | } | 66 | } |
| 64 | 67 | ||
| 65 | for i, val := range articleList { | 68 | for i, val := range articleList { |
| 69 | + author := l.getAuthor(conn, val.AuthorId) | ||
| 66 | item := types.MiniSearchArticleItem{ | 70 | item := types.MiniSearchArticleItem{ |
| 67 | ArticleId: val.Id, | 71 | ArticleId: val.Id, |
| 68 | Title: val.Title, | 72 | Title: val.Title, |
| 69 | - Author: val.Author.Name, | ||
| 70 | - Avatar: val.Author.Avatar, | 73 | + AuthorId: val.AuthorId, |
| 74 | + Author: author.Name, | ||
| 75 | + Avatar: author.Avatar, | ||
| 71 | Images: []string{}, | 76 | Images: []string{}, |
| 72 | CreatedAt: val.CreatedAt, | 77 | CreatedAt: val.CreatedAt, |
| 73 | MeReadFlag: 0, | 78 | MeReadFlag: 0, |
| @@ -84,3 +89,15 @@ func (l *MiniSearchArticlePageLogic) MiniSearchArticlePage(req *types.MiniSearch | @@ -84,3 +89,15 @@ func (l *MiniSearchArticlePageLogic) MiniSearchArticlePage(req *types.MiniSearch | ||
| 84 | 89 | ||
| 85 | return resp, nil | 90 | return resp, nil |
| 86 | } | 91 | } |
| 92 | + | ||
| 93 | +func (l *MiniSearchArticlePageLogic) getAuthor(conn transaction.Conn, userid int64) domain.User { | ||
| 94 | + if u, ok := l.userCache[userid]; ok { | ||
| 95 | + return *u | ||
| 96 | + } | ||
| 97 | + toUser, err := l.svcCtx.UserRepository.FindOne(l.ctx, conn, userid) | ||
| 98 | + if err == nil { | ||
| 99 | + l.userCache[toUser.Id] = toUser | ||
| 100 | + return *toUser | ||
| 101 | + } | ||
| 102 | + return domain.User{} | ||
| 103 | +} |
| @@ -102,7 +102,7 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeArticle(req *types.MiniSetUserLi | @@ -102,7 +102,7 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeArticle(req *types.MiniSetUserLi | ||
| 102 | 102 | ||
| 103 | // 删除点赞文章消息 | 103 | // 删除点赞文章消息 |
| 104 | var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx) | 104 | var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx) |
| 105 | - err = messageLogic.UnLikeArticle(c, articleInfo.Id) | 105 | + err = messageLogic.UnLikeArticle(c, articleInfo.Id, articleInfo.AuthorId) |
| 106 | if err != nil { | 106 | if err != nil { |
| 107 | return err | 107 | return err |
| 108 | } | 108 | } |
| @@ -183,7 +183,7 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeComment(req *types.MiniSetUserLi | @@ -183,7 +183,7 @@ func (l *MiniSetUserLikeLogic) cancelSetUserLikeComment(req *types.MiniSetUserLi | ||
| 183 | 183 | ||
| 184 | // 删除点赞评论消息 | 184 | // 删除点赞评论消息 |
| 185 | var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx) | 185 | var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx) |
| 186 | - err = messageLogic.UnLikeComment(c, commentInfo.ArticleId, commentInfo.Id) | 186 | + err = messageLogic.UnLikeComment(c, commentInfo.ArticleId, commentInfo.Id, commentInfo.FromUserId) |
| 187 | if err != nil { | 187 | if err != nil { |
| 188 | return err | 188 | return err |
| 189 | } | 189 | } |
| @@ -77,6 +77,8 @@ func (l *SystemArticleRestoreLogic) SystemArticleRestore(req *types.SystemArticl | @@ -77,6 +77,8 @@ func (l *SystemArticleRestoreLogic) SystemArticleRestore(req *types.SystemArticl | ||
| 77 | }) | 77 | }) |
| 78 | }) | 78 | }) |
| 79 | 79 | ||
| 80 | + article.SetSummary(articleSections) | ||
| 81 | + | ||
| 80 | err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { | 82 | err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { |
| 81 | //保存文章 | 83 | //保存文章 |
| 82 | _, err = l.svcCtx.ArticleRepository.Update(ctx, c, article) | 84 | _, err = l.svcCtx.ArticleRepository.Update(ctx, c, article) |
| @@ -2,11 +2,12 @@ package article | @@ -2,11 +2,12 @@ package article | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "context" | 4 | "context" |
| 5 | - "github.com/jinzhu/copier" | ||
| 6 | - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/message" | ||
| 7 | "strconv" | 5 | "strconv" |
| 8 | "unicode/utf8" | 6 | "unicode/utf8" |
| 9 | 7 | ||
| 8 | + "github.com/jinzhu/copier" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/message" | ||
| 10 | + | ||
| 10 | "strings" | 11 | "strings" |
| 11 | 12 | ||
| 12 | "github.com/samber/lo" | 13 | "github.com/samber/lo" |
| @@ -85,6 +86,7 @@ func (l *SystemUpdateArticleLogic) SystemUpdateArticle(req *types.SystemArticleU | @@ -85,6 +86,7 @@ func (l *SystemUpdateArticleLogic) SystemUpdateArticle(req *types.SystemArticleU | ||
| 85 | if err != nil { | 86 | if err != nil { |
| 86 | return nil, err | 87 | return nil, err |
| 87 | } | 88 | } |
| 89 | + | ||
| 88 | //检查文章可被哪些人查看 | 90 | //检查文章可被哪些人查看 |
| 89 | whoRead, err := l.validateAndGetWhoRead(req, article) | 91 | whoRead, err := l.validateAndGetWhoRead(req, article) |
| 90 | if err != nil { | 92 | if err != nil { |
| @@ -115,19 +117,7 @@ func (l *SystemUpdateArticleLogic) SystemUpdateArticle(req *types.SystemArticleU | @@ -115,19 +117,7 @@ func (l *SystemUpdateArticleLogic) SystemUpdateArticle(req *types.SystemArticleU | ||
| 115 | //文章内容 | 117 | //文章内容 |
| 116 | articleSections := l.getSections(req, article) | 118 | articleSections := l.getSections(req, article) |
| 117 | //设置内容概要 | 119 | //设置内容概要 |
| 118 | - if len(req.Section) > 0 { | ||
| 119 | - // 截取内容 50个字 | ||
| 120 | - runeNumber := 0 //字数 | ||
| 121 | - stringIndex := 0 //字符串长度 | ||
| 122 | - for i := range req.Section[0].Content { | ||
| 123 | - if runeNumber > 50 { | ||
| 124 | - break | ||
| 125 | - } | ||
| 126 | - runeNumber += 1 | ||
| 127 | - stringIndex = i | ||
| 128 | - } | ||
| 129 | - article.Summary = req.Section[0].Content[0:stringIndex] | ||
| 130 | - } | 120 | + article.SetSummary(articleSections) |
| 131 | 121 | ||
| 132 | err = transaction.UseTrans(l.ctx, l.conn.DB(), func(ctx context.Context, c transaction.Conn) error { | 122 | err = transaction.UseTrans(l.ctx, l.conn.DB(), func(ctx context.Context, c transaction.Conn) error { |
| 133 | _, err = l.svcCtx.ArticleRepository.Update(l.ctx, c, article) | 123 | _, err = l.svcCtx.ArticleRepository.Update(l.ctx, c, article) |
| @@ -198,8 +188,8 @@ func (l *SystemUpdateArticleLogic) validateTextLimit(req *types.SystemArticleUpd | @@ -198,8 +188,8 @@ func (l *SystemUpdateArticleLogic) validateTextLimit(req *types.SystemArticleUpd | ||
| 198 | num := utf8.RuneCountInString(req.Section[i].Content) | 188 | num := utf8.RuneCountInString(req.Section[i].Content) |
| 199 | wordNum += num | 189 | wordNum += num |
| 200 | } | 190 | } |
| 201 | - if wordNum >= 1000 { | ||
| 202 | - return xerr.NewErrMsg("最多只能输入1000字") | 191 | + if wordNum > 1000 { |
| 192 | + return xerr.NewErrMsg("内容最多只能输入1000字") | ||
| 203 | } | 193 | } |
| 204 | return nil | 194 | return nil |
| 205 | } | 195 | } |
| @@ -40,7 +40,7 @@ func (l *MiniArticleCommentAtWhoLogic) MiniArticleCommentAtWho(req *types.MiniAr | @@ -40,7 +40,7 @@ func (l *MiniArticleCommentAtWhoLogic) MiniArticleCommentAtWho(req *types.MiniAr | ||
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | var userList []*domain.User | 42 | var userList []*domain.User |
| 43 | - if len(articleInfo.WhoRead) == 0 { | 43 | + if articleInfo.TargetUser == domain.ArticleTargetAll { |
| 44 | //获取所有人 | 44 | //获取所有人 |
| 45 | queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("companyId", articleInfo.CompanyId) | 45 | queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("companyId", articleInfo.CompanyId) |
| 46 | _, userList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption) | 46 | _, userList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption) |
| @@ -49,6 +49,7 @@ func (l *MiniArticleCommentAtWhoLogic) MiniArticleCommentAtWho(req *types.MiniAr | @@ -49,6 +49,7 @@ func (l *MiniArticleCommentAtWhoLogic) MiniArticleCommentAtWho(req *types.MiniAr | ||
| 49 | return resp, nil | 49 | return resp, nil |
| 50 | } | 50 | } |
| 51 | } else { | 51 | } else { |
| 52 | + if len(articleInfo.WhoRead) > 0 { | ||
| 52 | queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("ids", articleInfo.WhoRead) | 53 | queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("ids", articleInfo.WhoRead) |
| 53 | _, userList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption) | 54 | _, userList, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption) |
| 54 | if err != nil { | 55 | if err != nil { |
| @@ -56,13 +57,13 @@ func (l *MiniArticleCommentAtWhoLogic) MiniArticleCommentAtWho(req *types.MiniAr | @@ -56,13 +57,13 @@ func (l *MiniArticleCommentAtWhoLogic) MiniArticleCommentAtWho(req *types.MiniAr | ||
| 56 | return resp, nil | 57 | return resp, nil |
| 57 | } | 58 | } |
| 58 | } | 59 | } |
| 59 | - | 60 | + } |
| 60 | uList := make([]types.CommentAtWho, len(userList)) | 61 | uList := make([]types.CommentAtWho, len(userList)) |
| 61 | - | ||
| 62 | for i := range userList { | 62 | for i := range userList { |
| 63 | uList[i] = types.CommentAtWho{ | 63 | uList[i] = types.CommentAtWho{ |
| 64 | Id: userList[i].Id, | 64 | Id: userList[i].Id, |
| 65 | Name: userList[i].Name, | 65 | Name: userList[i].Name, |
| 66 | + Avatar: userList[i].Avatar, | ||
| 66 | FirstLetter: "", | 67 | FirstLetter: "", |
| 67 | } | 68 | } |
| 68 | for _, val := range userList[i].PinYinName { | 69 | for _, val := range userList[i].PinYinName { |
| @@ -96,8 +96,10 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini | @@ -96,8 +96,10 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini | ||
| 96 | if err != nil { | 96 | if err != nil { |
| 97 | return nil, xerr.NewErrMsgErr("检查@的人员失败", err) | 97 | return nil, xerr.NewErrMsgErr("检查@的人员失败", err) |
| 98 | } | 98 | } |
| 99 | - if len(atWhoIds) != len(atWhoList) { | ||
| 100 | - return nil, xerr.NewErrMsg("检查@的人员失败") | 99 | + for _, val := range atWhoList { |
| 100 | + if val.CompanyId != req.CompanyId { | ||
| 101 | + return nil, xerr.NewErrMsgErr("检查@的人员失败", err) | ||
| 102 | + } | ||
| 101 | } | 103 | } |
| 102 | } | 104 | } |
| 103 | // 处理文本内容 | 105 | // 处理文本内容 |
| @@ -5,6 +5,7 @@ import ( | @@ -5,6 +5,7 @@ import ( | ||
| 5 | 5 | ||
| 6 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" | 6 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" | 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" |
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction" | ||
| 8 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" | 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" | 10 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" |
| 10 | 11 | ||
| @@ -15,6 +16,7 @@ type MiniTop5ArticleCommentLogic struct { | @@ -15,6 +16,7 @@ type MiniTop5ArticleCommentLogic struct { | ||
| 15 | logx.Logger | 16 | logx.Logger |
| 16 | ctx context.Context | 17 | ctx context.Context |
| 17 | svcCtx *svc.ServiceContext | 18 | svcCtx *svc.ServiceContext |
| 19 | + userCache map[int64]types.CommentAuthor | ||
| 18 | } | 20 | } |
| 19 | 21 | ||
| 20 | func NewMiniTop5ArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniTop5ArticleCommentLogic { | 22 | func NewMiniTop5ArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniTop5ArticleCommentLogic { |
| @@ -22,6 +24,7 @@ func NewMiniTop5ArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceCont | @@ -22,6 +24,7 @@ func NewMiniTop5ArticleCommentLogic(ctx context.Context, svcCtx *svc.ServiceCont | ||
| 22 | Logger: logx.WithContext(ctx), | 24 | Logger: logx.WithContext(ctx), |
| 23 | ctx: ctx, | 25 | ctx: ctx, |
| 24 | svcCtx: svcCtx, | 26 | svcCtx: svcCtx, |
| 27 | + userCache: make(map[int64]types.CommentAuthor), | ||
| 25 | } | 28 | } |
| 26 | } | 29 | } |
| 27 | 30 | ||
| @@ -50,9 +53,15 @@ func (l *MiniTop5ArticleCommentLogic) MiniTop5ArticleComment(req *types.MiniTop5 | @@ -50,9 +53,15 @@ func (l *MiniTop5ArticleCommentLogic) MiniTop5ArticleComment(req *types.MiniTop5 | ||
| 50 | resp = &types.MiniTop5ArticleCommentResponse{ | 53 | resp = &types.MiniTop5ArticleCommentResponse{ |
| 51 | List: make([]types.ArticleCommentItem, len(commentList)), | 54 | List: make([]types.ArticleCommentItem, len(commentList)), |
| 52 | } | 55 | } |
| 56 | + companyInfo, err := l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, req.CompanyId) | ||
| 57 | + if err != nil { | ||
| 58 | + return nil, xerr.NewErrMsgErr("获取公司信息失败", err) | ||
| 59 | + | ||
| 60 | + } | ||
| 53 | for i, val := range commentList { | 61 | for i, val := range commentList { |
| 54 | item := NewArticleCommentItem(val) | 62 | item := NewArticleCommentItem(val) |
| 55 | - | 63 | + item.FromUser = l.getCommentAuthor(conn, val.FromUserId, companyInfo.Name) |
| 64 | + item.ToUser = l.getCommentAuthor(conn, val.ToUserId, companyInfo.Name) | ||
| 56 | if _, ok := flagMap[val.Id]; ok { | 65 | if _, ok := flagMap[val.Id]; ok { |
| 57 | item.MeLoveFlag = 1 | 66 | item.MeLoveFlag = 1 |
| 58 | } | 67 | } |
| @@ -70,6 +79,25 @@ func (l *MiniTop5ArticleCommentLogic) MiniTop5ArticleComment(req *types.MiniTop5 | @@ -70,6 +79,25 @@ func (l *MiniTop5ArticleCommentLogic) MiniTop5ArticleComment(req *types.MiniTop5 | ||
| 70 | return | 79 | return |
| 71 | } | 80 | } |
| 72 | 81 | ||
| 82 | +func (l *MiniTop5ArticleCommentLogic) getCommentAuthor(conn transaction.Conn, userid int64, companyName string) types.CommentAuthor { | ||
| 83 | + if u, ok := l.userCache[userid]; ok { | ||
| 84 | + return u | ||
| 85 | + } | ||
| 86 | + toUser, err := l.svcCtx.UserRepository.FindOne(l.ctx, conn, userid) | ||
| 87 | + if err == nil { | ||
| 88 | + commentToUser := types.CommentAuthor{ | ||
| 89 | + Id: toUser.Id, | ||
| 90 | + Name: toUser.Name, | ||
| 91 | + Avatar: toUser.Avatar, | ||
| 92 | + Position: toUser.Position, | ||
| 93 | + Company: companyName, | ||
| 94 | + } | ||
| 95 | + l.userCache[toUser.Id] = commentToUser | ||
| 96 | + return commentToUser | ||
| 97 | + } | ||
| 98 | + return types.CommentAuthor{} | ||
| 99 | +} | ||
| 100 | + | ||
| 73 | func NewArticleCommentItem(val *domain.ArticleComment) types.ArticleCommentItem { | 101 | func NewArticleCommentItem(val *domain.ArticleComment) types.ArticleCommentItem { |
| 74 | item := types.ArticleCommentItem{ | 102 | item := types.ArticleCommentItem{ |
| 75 | Id: val.Id, | 103 | Id: val.Id, |
| @@ -36,7 +36,32 @@ func (l *SystemEditAticleCommentLogic) SystemEditAticleComment(req *types.System | @@ -36,7 +36,32 @@ func (l *SystemEditAticleCommentLogic) SystemEditAticleComment(req *types.System | ||
| 36 | if commetInfo.CompanyId != req.CompanyId { | 36 | if commetInfo.CompanyId != req.CompanyId { |
| 37 | return nil, xerr.NewErrMsg("没有操作权限") | 37 | return nil, xerr.NewErrMsg("没有操作权限") |
| 38 | } | 38 | } |
| 39 | + { | ||
| 40 | + //检查运营点赞的值 | ||
| 41 | + //查找对应的文章 | ||
| 42 | + articleInfo, err := l.svcCtx.ArticleRepository.FindOne(l.ctx, conn, commetInfo.ArticleId) | ||
| 43 | + if err != nil { | ||
| 44 | + return nil, xerr.NewErrMsgErr("没有找到对应的文章", err) | ||
| 45 | + } | ||
| 46 | + var maxCount int | ||
| 47 | + //获取文章可以被多少人查看 | ||
| 48 | + if articleInfo.TargetUser == domain.ArticleTargetLimit { | ||
| 49 | + maxCount = commetInfo.MaxCountAdminLove(len(articleInfo.WhoRead)) | ||
| 50 | + } else { | ||
| 51 | + //统计全员人数 | ||
| 52 | + queryOption := domain.NewQueryOptions().WithCountOnly().MustWithKV("companyId", req.CompanyId) | ||
| 53 | + cnt, _, err := l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption) | ||
| 54 | + if err != nil { | ||
| 55 | + return nil, xerr.NewErrMsgErr("获取人员数据失败", err) | ||
| 56 | + } | ||
| 57 | + maxCount = commetInfo.MaxCountAdminLove(int(cnt)) | ||
| 58 | + } | ||
| 59 | + if maxCount < req.CountAdminLove { | ||
| 60 | + return nil, xerr.NewErrMsg("运营点数设置错误") | ||
| 61 | + } | ||
| 62 | + } | ||
| 39 | commetInfo.CountAdminLove = req.CountAdminLove | 63 | commetInfo.CountAdminLove = req.CountAdminLove |
| 64 | + commetInfo.Content = req.Content | ||
| 40 | var increaseCount int | 65 | var increaseCount int |
| 41 | switch req.Show { | 66 | switch req.Show { |
| 42 | case 1: | 67 | case 1: |
| @@ -52,7 +77,7 @@ func (l *SystemEditAticleCommentLogic) SystemEditAticleComment(req *types.System | @@ -52,7 +77,7 @@ func (l *SystemEditAticleCommentLogic) SystemEditAticleComment(req *types.System | ||
| 52 | increaseCount = -1 | 77 | increaseCount = -1 |
| 53 | } | 78 | } |
| 54 | } | 79 | } |
| 55 | - commetInfo.Show = domain.CommentShowEnable | 80 | + |
| 56 | // 变更回复数量 | 81 | // 变更回复数量 |
| 57 | err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { | 82 | err = transaction.UseTrans(l.ctx, conn.DB(), func(ctx context.Context, c transaction.Conn) error { |
| 58 | _, err = l.svcCtx.ArticleCommentRepository.Update(ctx, c, commetInfo) | 83 | _, err = l.svcCtx.ArticleCommentRepository.Update(ctx, c, commetInfo) |
| @@ -47,6 +47,35 @@ func (l *SystemEditAticleCommentLoveLogic) SystemEditAticleCommentLove(req *type | @@ -47,6 +47,35 @@ func (l *SystemEditAticleCommentLoveLogic) SystemEditAticleCommentLove(req *type | ||
| 47 | if err != nil { | 47 | if err != nil { |
| 48 | return nil, xerr.NewErrMsgErr("编辑评论信息失败", err) | 48 | return nil, xerr.NewErrMsgErr("编辑评论信息失败", err) |
| 49 | } | 49 | } |
| 50 | + | ||
| 51 | + for _, commetInfo := range commetList { | ||
| 52 | + //检查运营点赞的值 | ||
| 53 | + //查找对应的文章 | ||
| 54 | + articleInfo, err := l.svcCtx.ArticleRepository.FindOne(l.ctx, conn, commetInfo.ArticleId) | ||
| 55 | + if err != nil { | ||
| 56 | + return nil, xerr.NewErrMsgErr("没有找到对应的文章", err) | ||
| 57 | + } | ||
| 58 | + var maxCount int | ||
| 59 | + //获取文章可以被多少人查看 | ||
| 60 | + if articleInfo.TargetUser == domain.ArticleTargetLimit { | ||
| 61 | + maxCount = commetInfo.MaxCountAdminLove(len(articleInfo.WhoRead)) | ||
| 62 | + } else { | ||
| 63 | + //统计全员人数 | ||
| 64 | + queryOption := domain.NewQueryOptions().WithCountOnly().MustWithKV("companyId", req.CompanyId) | ||
| 65 | + cnt, _, err := l.svcCtx.UserRepository.Find(l.ctx, conn, queryOption) | ||
| 66 | + if err != nil { | ||
| 67 | + return nil, xerr.NewErrMsgErr("获取人员数据失败", err) | ||
| 68 | + } | ||
| 69 | + maxCount = commetInfo.MaxCountAdminLove(int(cnt)) | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + if paramCountData, ok := paramMap[commetInfo.Id]; ok { | ||
| 73 | + if maxCount < paramCountData { | ||
| 74 | + return nil, xerr.NewErrMsg("运营点数设置错误") | ||
| 75 | + } | ||
| 76 | + } | ||
| 77 | + } | ||
| 78 | + // 更新运营点赞数 | ||
| 50 | resp = &types.SystemEditCommentLoveResponse{} | 79 | resp = &types.SystemEditCommentLoveResponse{} |
| 51 | for _, val := range commetList { | 80 | for _, val := range commetList { |
| 52 | if val.CompanyId != req.CompanyId { | 81 | if val.CompanyId != req.CompanyId { |
| @@ -248,13 +248,13 @@ func (l *MiniBusinessLogic) LikeComment(conn transaction.Conn, articleId int64, | @@ -248,13 +248,13 @@ func (l *MiniBusinessLogic) LikeComment(conn transaction.Conn, articleId int64, | ||
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | // UnLikeArticle 取消点赞文章 | 250 | // UnLikeArticle 取消点赞文章 |
| 251 | -func (l *MiniBusinessLogic) UnLikeArticle(conn transaction.Conn, articleId int64) (err error) { | ||
| 252 | - return l.deleteMessage(conn, domain.OptTypeArticle, articleId, 0) | 251 | +func (l *MiniBusinessLogic) UnLikeArticle(conn transaction.Conn, articleId int64, recipientId int64) (err error) { |
| 252 | + return l.deleteMessage(conn, domain.OptTypeArticle, articleId, 0, recipientId) | ||
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | // UnLikeComment 取消点赞评论 | 255 | // UnLikeComment 取消点赞评论 |
| 256 | -func (l *MiniBusinessLogic) UnLikeComment(conn transaction.Conn, articleId int64, commentId int64) (err error) { | ||
| 257 | - return l.deleteMessage(conn, domain.OptTypeComment, articleId, commentId) | 256 | +func (l *MiniBusinessLogic) UnLikeComment(conn transaction.Conn, articleId int64, commentId int64, recipientId int64) (err error) { |
| 257 | + return l.deleteMessage(conn, domain.OptTypeComment, articleId, commentId, recipientId) | ||
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | func (l *MiniBusinessLogic) createMessage( | 260 | func (l *MiniBusinessLogic) createMessage( |
| @@ -287,14 +287,14 @@ func (l *MiniBusinessLogic) createMessage( | @@ -287,14 +287,14 @@ func (l *MiniBusinessLogic) createMessage( | ||
| 287 | return nil | 287 | return nil |
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | -func (l *MiniBusinessLogic) deleteMessage(conn transaction.Conn, optType domain.MsgBusinessOpt, articleId int64, commentId int64) (err error) { | 290 | +func (l *MiniBusinessLogic) deleteMessage(conn transaction.Conn, optType domain.MsgBusinessOpt, articleId int64, commentId int64, recipientId int64) (err error) { |
| 291 | var userToken = contextdata.GetUserTokenFromCtx(l.ctx) | 291 | var userToken = contextdata.GetUserTokenFromCtx(l.ctx) |
| 292 | 292 | ||
| 293 | queryOption := domain.NewQueryOptions().WithFindOnly().WithOffsetLimit(1, 1). | 293 | queryOption := domain.NewQueryOptions().WithFindOnly().WithOffsetLimit(1, 1). |
| 294 | MustWithKV("type", domain.MsgTypeLike). | 294 | MustWithKV("type", domain.MsgTypeLike). |
| 295 | MustWithKV("optType", optType). | 295 | MustWithKV("optType", optType). |
| 296 | MustWithKV("companyId", userToken.CompanyId). | 296 | MustWithKV("companyId", userToken.CompanyId). |
| 297 | - MustWithKV("recipientId", userToken.UserId). | 297 | + MustWithKV("recipientId", recipientId). |
| 298 | MustWithKV("articleId", articleId). | 298 | MustWithKV("articleId", articleId). |
| 299 | MustWithKV("commentId", commentId) | 299 | MustWithKV("commentId", commentId) |
| 300 | 300 |
| 1 | +package user | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "github.com/samber/lo" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr" | ||
| 9 | + | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" | ||
| 12 | + | ||
| 13 | + "github.com/zeromicro/go-zero/core/logx" | ||
| 14 | +) | ||
| 15 | + | ||
| 16 | +type MiniUserMyFollowingNewsLogic struct { | ||
| 17 | + logx.Logger | ||
| 18 | + ctx context.Context | ||
| 19 | + svcCtx *svc.ServiceContext | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func NewMiniUserMyFollowingNewsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniUserMyFollowingNewsLogic { | ||
| 23 | + return &MiniUserMyFollowingNewsLogic{ | ||
| 24 | + Logger: logx.WithContext(ctx), | ||
| 25 | + ctx: ctx, | ||
| 26 | + svcCtx: svcCtx, | ||
| 27 | + } | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +func (l *MiniUserMyFollowingNewsLogic) MiniUserMyFollowingNews(req *types.MiniUserNewsRequest) (resp *types.MiniUserNewsResposne, err error) { | ||
| 31 | + var ( | ||
| 32 | + conn = l.svcCtx.DefaultDBConn() | ||
| 33 | + user *domain.User | ||
| 34 | + userToken = contextdata.GetUserTokenFromCtx(l.ctx) | ||
| 35 | + articles []*domain.Article | ||
| 36 | + readArticles = make([]*domain.UserReadArticle, 0) | ||
| 37 | + userMap = make(map[int64]*domain.User) | ||
| 38 | + ) | ||
| 39 | + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil { | ||
| 40 | + return nil, xerr.NewErrMsgErr("用户不存在", err) | ||
| 41 | + } | ||
| 42 | + var ( | ||
| 43 | + users = user.Following | ||
| 44 | + ) | ||
| 45 | + if req.AuthorId > 0 { | ||
| 46 | + users = []int64{req.AuthorId} | ||
| 47 | + } | ||
| 48 | + if _, articles, err = l.svcCtx.ArticleRepository.FindAuthorsLatestArticle(l.ctx, conn, user.CompanyId, users, user.Id, req.LastArticleId, req.Size); err != nil { | ||
| 49 | + return nil, xerr.NewErrMsgErr("获取快讯异常", err) | ||
| 50 | + } | ||
| 51 | + resp = &types.MiniUserNewsResposne{ | ||
| 52 | + List: make([]types.UserNewsItem, 0), | ||
| 53 | + } | ||
| 54 | + articleIds := domain.Values(articles, func(item *domain.Article) int64 { | ||
| 55 | + return item.Id | ||
| 56 | + }) | ||
| 57 | + if len(articleIds) > 0 { | ||
| 58 | + resp.LastArticleId = articleIds[len(articleIds)-1] | ||
| 59 | + _, readArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithFindOnly().WithKV("articleIds", articleIds)) | ||
| 60 | + } | ||
| 61 | + readArticlesMap := lo.KeyBy(readArticles, func(item *domain.UserReadArticle) int64 { | ||
| 62 | + return item.ArticleId | ||
| 63 | + }) | ||
| 64 | + lo.ForEach(articles, func(item *domain.Article, index int) { | ||
| 65 | + newsItem := types.UserNewsItem{ | ||
| 66 | + NewsId: item.Id, | ||
| 67 | + Type: "article", | ||
| 68 | + Title: item.Title, | ||
| 69 | + Summary: item.Summary, | ||
| 70 | + Time: item.CreatedAt, | ||
| 71 | + Images: make([]string, 0), | ||
| 72 | + ReadFlag: false, | ||
| 73 | + } | ||
| 74 | + if author, _ := domain.LazyLoad(userMap, l.ctx, conn, item.AuthorId, l.svcCtx.UserRepository.FindOne); author != nil { | ||
| 75 | + newsItem.Author = types.UserItem{ | ||
| 76 | + Id: author.Id, | ||
| 77 | + Name: author.Name, | ||
| 78 | + Avatar: lo.ToPtr(author.Avatar), | ||
| 79 | + } | ||
| 80 | + } | ||
| 81 | + for _, img := range item.Images { | ||
| 82 | + newsItem.Images = append(newsItem.Images, img.Url) | ||
| 83 | + } | ||
| 84 | + if _, ok := readArticlesMap[item.Id]; ok { | ||
| 85 | + newsItem.ReadFlag = true | ||
| 86 | + } | ||
| 87 | + resp.List = append(resp.List, newsItem) | ||
| 88 | + }) | ||
| 89 | + return | ||
| 90 | +} |
| @@ -39,15 +39,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * | @@ -39,15 +39,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * | ||
| 39 | if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil { | 39 | if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil { |
| 40 | return nil, xerr.NewErrMsgErr("用户不存在", err) | 40 | return nil, xerr.NewErrMsgErr("用户不存在", err) |
| 41 | } | 41 | } |
| 42 | - var ( | ||
| 43 | - users = user.Following | ||
| 44 | - ) | ||
| 45 | - if req.AuthorId > 0 { | ||
| 46 | - users = []int64{req.AuthorId} | ||
| 47 | - } else { | ||
| 48 | - users = append(users, user.Id) | ||
| 49 | - } | ||
| 50 | - if _, articles, err = l.svcCtx.ArticleRepository.FindAuthorsLatestArticle(l.ctx, conn, user.CompanyId, users, user.Id, req.LastArticleId, req.Size); err != nil { | 42 | + if _, articles, err = l.svcCtx.ArticleRepository.FindLatestAccessibleArticle(l.ctx, conn, user.CompanyId, user.Id, req.LastArticleId, req.Size); err != nil { |
| 51 | return nil, xerr.NewErrMsgErr("获取快讯异常", err) | 43 | return nil, xerr.NewErrMsgErr("获取快讯异常", err) |
| 52 | } | 44 | } |
| 53 | resp = &types.MiniUserNewsResposne{ | 45 | resp = &types.MiniUserNewsResposne{ |
| @@ -58,7 +50,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * | @@ -58,7 +50,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * | ||
| 58 | }) | 50 | }) |
| 59 | if len(articleIds) > 0 { | 51 | if len(articleIds) > 0 { |
| 60 | resp.LastArticleId = articleIds[len(articleIds)-1] | 52 | resp.LastArticleId = articleIds[len(articleIds)-1] |
| 61 | - _, readArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithKV("articleIds", articleIds)) | 53 | + _, readArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithFindOnly().WithKV("articleIds", articleIds)) |
| 62 | } | 54 | } |
| 63 | readArticlesMap := lo.KeyBy(readArticles, func(item *domain.UserReadArticle) int64 { | 55 | readArticlesMap := lo.KeyBy(readArticles, func(item *domain.UserReadArticle) int64 { |
| 64 | return item.ArticleId | 56 | return item.ArticleId |
| @@ -34,6 +34,7 @@ type MiniCreateArticleCommentRequest struct { | @@ -34,6 +34,7 @@ type MiniCreateArticleCommentRequest struct { | ||
| 34 | 34 | ||
| 35 | type CommentAtWho struct { | 35 | type CommentAtWho struct { |
| 36 | Id int64 `json:"id"` | 36 | Id int64 `json:"id"` |
| 37 | + Avatar string `json:"avatar,optional"` // 人员头像URL | ||
| 37 | Name string `json:"name,optional"` | 38 | Name string `json:"name,optional"` |
| 38 | FirstLetter string `json:"firstLetter,optional"` | 39 | FirstLetter string `json:"firstLetter,optional"` |
| 39 | } | 40 | } |
| @@ -268,6 +269,7 @@ type SystemEditCommentRequest struct { | @@ -268,6 +269,7 @@ type SystemEditCommentRequest struct { | ||
| 268 | CompanyId int64 `json:",optional"` | 269 | CompanyId int64 `json:",optional"` |
| 269 | Id int64 `json:"id"` | 270 | Id int64 `json:"id"` |
| 270 | Show int `json:"show"` //[1 显示评论] [2: 隐藏评论] | 271 | Show int `json:"show"` //[1 显示评论] [2: 隐藏评论] |
| 272 | + Content string `json:"content,optional"` | ||
| 271 | CountAdminLove int `json:"countAdminLove,optional"` | 273 | CountAdminLove int `json:"countAdminLove,optional"` |
| 272 | } | 274 | } |
| 273 | 275 | ||
| @@ -1315,6 +1317,7 @@ type MiniSearchArticleResponse struct { | @@ -1315,6 +1317,7 @@ type MiniSearchArticleResponse struct { | ||
| 1315 | type MiniSearchArticleItem struct { | 1317 | type MiniSearchArticleItem struct { |
| 1316 | ArticleId int64 `json:"articleId"` | 1318 | ArticleId int64 `json:"articleId"` |
| 1317 | Title string `json:"title"` | 1319 | Title string `json:"title"` |
| 1320 | + AuthorId int64 `json:"authorId"` | ||
| 1318 | Author string `json:"author"` // 发布人 | 1321 | Author string `json:"author"` // 发布人 |
| 1319 | Avatar string `json:"avatar"` // 发布人的头像 | 1322 | Avatar string `json:"avatar"` // 发布人的头像 |
| 1320 | Images []string `json:"images"` | 1323 | Images []string `json:"images"` |
| @@ -164,6 +164,47 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction. | @@ -164,6 +164,47 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction. | ||
| 164 | return total, dms, nil | 164 | return total, dms, nil |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | +// FindLatestAccessibleArticle 最新可访问的文章 | ||
| 168 | +func (repository *ArticleRepository) FindLatestAccessibleArticle(ctx context.Context, conn transaction.Conn, | ||
| 169 | + companyId int64, whoRead int64, lastId int64, limit int) (int64, []*domain.Article, error) { | ||
| 170 | + var ( | ||
| 171 | + tx = conn.DB() | ||
| 172 | + ms []*models.Article | ||
| 173 | + dms = make([]*domain.Article, 0) | ||
| 174 | + total int64 | ||
| 175 | + ) | ||
| 176 | + queryFunc := func() (interface{}, error) { | ||
| 177 | + tx = tx.Model(&ms). | ||
| 178 | + Where("company_id=?", companyId). | ||
| 179 | + Where(fmt.Sprintf("author_id = %d or target_user=0 or who_read @>'[%d]'", whoRead, whoRead)). | ||
| 180 | + Where("show = 1") | ||
| 181 | + if lastId > 0 { | ||
| 182 | + tx.Where("id < ?", lastId) | ||
| 183 | + } | ||
| 184 | + tx.Order("id desc") | ||
| 185 | + if limit > 0 { | ||
| 186 | + tx.Limit(limit) | ||
| 187 | + } | ||
| 188 | + if total, tx = transaction.PaginationAndCount(ctx, tx, domain.NewQueryOptions().WithFindOnly(), &ms); tx.Error != nil { | ||
| 189 | + return dms, tx.Error | ||
| 190 | + } | ||
| 191 | + return dms, nil | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + if _, err := repository.Query(queryFunc); err != nil { | ||
| 195 | + return 0, nil, err | ||
| 196 | + } | ||
| 197 | + | ||
| 198 | + for _, item := range ms { | ||
| 199 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
| 200 | + return 0, dms, err | ||
| 201 | + } else { | ||
| 202 | + dms = append(dms, dm) | ||
| 203 | + } | ||
| 204 | + } | ||
| 205 | + return total, dms, nil | ||
| 206 | +} | ||
| 207 | + | ||
| 167 | // FindAuthorsLatestArticle 作者最新的文章 | 208 | // FindAuthorsLatestArticle 作者最新的文章 |
| 168 | func (repository *ArticleRepository) FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn, | 209 | func (repository *ArticleRepository) FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn, |
| 169 | companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*domain.Article, error) { | 210 | companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*domain.Article, error) { |
| @@ -2,6 +2,7 @@ package domain | @@ -2,6 +2,7 @@ package domain | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "context" | 4 | "context" |
| 5 | + "strings" | ||
| 5 | 6 | ||
| 6 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction" | 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction" |
| 7 | ) | 8 | ) |
| @@ -43,6 +44,7 @@ type ArticleRepository interface { | @@ -43,6 +44,7 @@ type ArticleRepository interface { | ||
| 43 | FindAuthorsLatestFirstArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error) | 44 | FindAuthorsLatestFirstArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error) |
| 44 | FindAuthorsLatestFirstUnreadArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error) | 45 | FindAuthorsLatestFirstUnreadArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error) |
| 45 | FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*Article, error) | 46 | FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*Article, error) |
| 47 | + FindLatestAccessibleArticle(ctx context.Context, conn transaction.Conn, companyId int64, whoRead int64, lastId int64, limit int) (int64, []*Article, error) | ||
| 46 | IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //点赞数量变动 | 48 | IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //点赞数量变动 |
| 47 | IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //评论数量变动 | 49 | IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //评论数量变动 |
| 48 | IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //浏览数量变动 | 50 | IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //浏览数量变动 |
| @@ -118,6 +120,7 @@ func (m *Article) MakeBackup(operator UserSimple, section []*ArticleSection) *Ar | @@ -118,6 +120,7 @@ func (m *Article) MakeBackup(operator UserSimple, section []*ArticleSection) *Ar | ||
| 118 | WhoReview: m.WhoReview, | 120 | WhoReview: m.WhoReview, |
| 119 | Tags: m.Tags, | 121 | Tags: m.Tags, |
| 120 | MatchUrl: map[string]string{}, | 122 | MatchUrl: map[string]string{}, |
| 123 | + Location: m.Location, | ||
| 121 | } | 124 | } |
| 122 | copy(b.Videos, m.Videos) | 125 | copy(b.Videos, m.Videos) |
| 123 | copy(b.Images, m.Images) | 126 | copy(b.Images, m.Images) |
| @@ -126,3 +129,30 @@ func (m *Article) MakeBackup(operator UserSimple, section []*ArticleSection) *Ar | @@ -126,3 +129,30 @@ func (m *Article) MakeBackup(operator UserSimple, section []*ArticleSection) *Ar | ||
| 126 | } | 129 | } |
| 127 | return &b | 130 | return &b |
| 128 | } | 131 | } |
| 132 | + | ||
| 133 | +func (m *Article) SetSummary(sectionList []ArticleSection) { | ||
| 134 | + if len(sectionList) == 0 { | ||
| 135 | + return | ||
| 136 | + } | ||
| 137 | + //设置内容概要 | ||
| 138 | + | ||
| 139 | + // 截取内容 50个字 | ||
| 140 | + runeNumber := 0 //字数 | ||
| 141 | + stringIndex := 0 //字符串长度 | ||
| 142 | + content := "" | ||
| 143 | + for i := range sectionList { | ||
| 144 | + str := strings.TrimSpace(sectionList[i].Content) | ||
| 145 | + if len(str) > 0 { | ||
| 146 | + content = str | ||
| 147 | + break | ||
| 148 | + } | ||
| 149 | + } | ||
| 150 | + for i := range content { | ||
| 151 | + if runeNumber > 50 { | ||
| 152 | + break | ||
| 153 | + } | ||
| 154 | + runeNumber += 1 | ||
| 155 | + stringIndex = i | ||
| 156 | + } | ||
| 157 | + m.Summary = content[0:stringIndex] | ||
| 158 | +} |
| @@ -61,7 +61,7 @@ type ArticleCommentShow struct { | @@ -61,7 +61,7 @@ type ArticleCommentShow struct { | ||
| 61 | CountReply int // 回复数量 | 61 | CountReply int // 回复数量 |
| 62 | CountUserLove int // 用户点赞数量 | 62 | CountUserLove int // 用户点赞数量 |
| 63 | CountAdminLove int // 运营点赞数量 | 63 | CountAdminLove int // 运营点赞数量 |
| 64 | - Show int // 评论的展示状态(0显示、1不显示) | 64 | + Show int // 评论的展示状态(1显示、2不显示) |
| 65 | CreatedAt int64 // 评论的创建时间 | 65 | CreatedAt int64 // 评论的创建时间 |
| 66 | } | 66 | } |
| 67 | 67 | ||
| @@ -81,3 +81,14 @@ type ArticleCommentRepository interface { | @@ -81,3 +81,14 @@ type ArticleCommentRepository interface { | ||
| 81 | CustomSearchBy(ctx context.Context, conn transaction.Conn, companyId int64, page int, size int, | 81 | CustomSearchBy(ctx context.Context, conn transaction.Conn, companyId int64, page int, size int, |
| 82 | topId int64, articleTitle string, contentLike string, fromUserId int64, show int, createdAtRange [2]int64) (int, []*ArticleCommentShow, error) | 82 | topId int64, articleTitle string, contentLike string, fromUserId int64, show int, createdAtRange [2]int64) (int, []*ArticleCommentShow, error) |
| 83 | } | 83 | } |
| 84 | + | ||
| 85 | +// 运营点数 填写的最大值 | ||
| 86 | +func (m *ArticleComment) MaxCountAdminLove(articleWhoRead int) int { | ||
| 87 | + // 帖子的可见人数/3向上取整 | ||
| 88 | + x := articleWhoRead / 3 // 取商 | ||
| 89 | + y := articleWhoRead % 3 // 取余 | ||
| 90 | + if y > 0 { | ||
| 91 | + x = x + 1 | ||
| 92 | + } | ||
| 93 | + return x | ||
| 94 | +} |
deploy/k8s/test/.gitkeep
0 → 100644
deploy/k8s/test/install.sh
0 → 100644
| 1 | +#!/bin/bash | ||
| 2 | +export PATH=/root/local/bin:$PATH | ||
| 3 | +kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
| 4 | +if [ "$?" == "1" ];then | ||
| 5 | + kubectl create -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml --record | ||
| 6 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
| 7 | + if [ "$?" == "0" ];then | ||
| 8 | + echo "sumifcc-discuss service install success!" | ||
| 9 | + else | ||
| 10 | + echo "sumifcc-discuss service install fail!" | ||
| 11 | + fi | ||
| 12 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
| 13 | + if [ "$?" == "0" ];then | ||
| 14 | + echo "sumifcc-discuss deployment install success!" | ||
| 15 | + else | ||
| 16 | + echo "sumifcc-discuss deployment install fail!" | ||
| 17 | + fi | ||
| 18 | +else | ||
| 19 | + kubectl delete -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml | ||
| 20 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
| 21 | + while [ "$?" == "0" ] | ||
| 22 | + do | ||
| 23 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
| 24 | + done | ||
| 25 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
| 26 | + while [ "$?" == "0" ] | ||
| 27 | + do | ||
| 28 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
| 29 | + done | ||
| 30 | + kubectl create -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml --record | ||
| 31 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
| 32 | + if [ "$?" == "0" ];then | ||
| 33 | + echo "sumifcc-discuss service update success!" | ||
| 34 | + else | ||
| 35 | + echo "sumifcc-discuss service update fail!" | ||
| 36 | + fi | ||
| 37 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
| 38 | + if [ "$?" == "0" ];then | ||
| 39 | + echo "sumifcc-discuss deployment update success!" | ||
| 40 | + else | ||
| 41 | + echo "sumifcc-discuss deployment update fail!" | ||
| 42 | + fi | ||
| 43 | +fi |
deploy/k8s/test/sumifcc-discuss.yaml
0 → 100644
| 1 | +apiVersion: v1 | ||
| 2 | +kind: Service | ||
| 3 | +metadata: | ||
| 4 | + name: sumifcc-discuss | ||
| 5 | + namespace: mmm-suplus-test | ||
| 6 | + labels: | ||
| 7 | + k8s-app: sumifcc-discuss | ||
| 8 | +spec: | ||
| 9 | + ports: | ||
| 10 | + - name: "http" | ||
| 11 | + port: 80 | ||
| 12 | + targetPort: 8081 | ||
| 13 | + - name: "https" | ||
| 14 | + port: 443 | ||
| 15 | + targetPort: 443 | ||
| 16 | + selector: | ||
| 17 | + k8s-app: sumifcc-discuss | ||
| 18 | +--- | ||
| 19 | +apiVersion: extensions/v1beta1 | ||
| 20 | +kind: Deployment | ||
| 21 | +metadata: | ||
| 22 | + name: sumifcc-discuss | ||
| 23 | + namespace: mmm-suplus-test | ||
| 24 | + labels: | ||
| 25 | + k8s-app: sumifcc-discuss | ||
| 26 | +spec: | ||
| 27 | + replicas: 1 | ||
| 28 | + template: | ||
| 29 | + metadata: | ||
| 30 | + labels: | ||
| 31 | + k8s-app: sumifcc-discuss | ||
| 32 | + spec: | ||
| 33 | + affinity: | ||
| 34 | + nodeAffinity: | ||
| 35 | + preferredDuringSchedulingIgnoredDuringExecution: | ||
| 36 | + - preference: {} | ||
| 37 | + weight: 100 | ||
| 38 | + requiredDuringSchedulingIgnoredDuringExecution: | ||
| 39 | + nodeSelectorTerms: | ||
| 40 | + - matchExpressions: | ||
| 41 | + - key: kubernetes.io/hostname | ||
| 42 | + operator: In | ||
| 43 | + values: | ||
| 44 | + - cn-hangzhou.i-bp1djh1xn7taumbue1ze | ||
| 45 | + | ||
| 46 | + containers: | ||
| 47 | + - name: sumifcc-discuss | ||
| 48 | + image: 192.168.0.243:5000/mmm/sumifcc-discuss:dev | ||
| 49 | + imagePullPolicy: Always | ||
| 50 | + ports: | ||
| 51 | + - containerPort: 8081 | ||
| 52 | + - containerPort: 443 | ||
| 53 | + volumeMounts: | ||
| 54 | + - mountPath: /opt/logs | ||
| 55 | + name: accesslogs | ||
| 56 | + env: | ||
| 57 | + - name: LOG_LEVEL | ||
| 58 | + value: "debug" | ||
| 59 | + - name: LOG_FILE | ||
| 60 | + value: "true" | ||
| 61 | + - name: REDIS_HOST | ||
| 62 | + valueFrom: | ||
| 63 | + configMapKeyRef: | ||
| 64 | + name: suplus-config | ||
| 65 | + key: redis.ip | ||
| 66 | + - name: REDIS_PORT | ||
| 67 | + valueFrom: | ||
| 68 | + configMapKeyRef: | ||
| 69 | + name: suplus-config | ||
| 70 | + key: redis.port | ||
| 71 | + volumes: | ||
| 72 | + - name: accesslogs | ||
| 73 | + emptyDir: {} |
sql/all_table.sql
0 → 100644
| 1 | +-- public.article definition | ||
| 2 | +-- Drop table | ||
| 3 | +-- DROP TABLE public.article; | ||
| 4 | +CREATE TABLE public.article( | ||
| 5 | + id bigserial NOT NULL, -- ID | ||
| 6 | + company_id int8 NULL, -- 公司ID | ||
| 7 | + created_at int8 NULL, -- 创建时间 | ||
| 8 | + updated_at int8 NULL, -- 更新时间 | ||
| 9 | + deleted_at int8 NULL, -- 删除时间 | ||
| 10 | + is_del int8 NULL, -- 是否删除 | ||
| 11 | + "version" int8 NULL DEFAULT 0, -- 版本 | ||
| 12 | + author_id int8 NULL DEFAULT 0, -- 发布人 | ||
| 13 | + author jsonb NULL DEFAULT '{}' ::jsonb, -- 发布人对象 | ||
| 14 | + title text NULL, -- 文章标题 | ||
| 15 | + images jsonb NULL DEFAULT '[]' ::jsonb, -- 图片 | ||
| 16 | + who_read jsonb NULL DEFAULT '[]' ::jsonb, -- 谁可以看 | ||
| 17 | + who_review jsonb NULL DEFAULT '[]' ::jsonb, -- 评论人 | ||
| 18 | + "location" jsonb NULL DEFAULT '{}' ::jsonb, -- 坐标 | ||
| 19 | + target_user int8 NULL DEFAULT 0, -- 分发方式 0 分发给所有人 1 分发给指定的人 | ||
| 20 | + count_love int8 NULL DEFAULT 0, -- 点赞数量 | ||
| 21 | + count_comment int8 NULL DEFAULT 0, -- 评论数量 | ||
| 22 | + "show" int8 NULL DEFAULT 1, -- 评论的展示状态(1显示、2不显示) | ||
| 23 | + tags jsonb NULL DEFAULT '[]' ::jsonb, -- 标签 | ||
| 24 | + count_read int8 NULL DEFAULT 0, -- 已读数量 | ||
| 25 | + summary text NULL, | ||
| 26 | + match_url jsonb NULL DEFAULT '{}' ::jsonb, | ||
| 27 | + videos jsonb NULL DEFAULT '[]' ::jsonb, | ||
| 28 | + CONSTRAINT article_pkey PRIMARY KEY (id) | ||
| 29 | +); | ||
| 30 | + | ||
| 31 | +CREATE INDEX article_company_id_idx ON public.article USING btree(company_id); | ||
| 32 | + | ||
| 33 | +-- Column comments | ||
| 34 | +COMMENT ON COLUMN public.article.id IS 'ID'; | ||
| 35 | + | ||
| 36 | +COMMENT ON COLUMN public.article.company_id IS '公司ID'; | ||
| 37 | + | ||
| 38 | +COMMENT ON COLUMN public.article.created_at IS '创建时间'; | ||
| 39 | + | ||
| 40 | +COMMENT ON COLUMN public.article.updated_at IS '更新时间'; | ||
| 41 | + | ||
| 42 | +COMMENT ON COLUMN public.article.deleted_at IS '删除时间'; | ||
| 43 | + | ||
| 44 | +COMMENT ON COLUMN public.article.is_del IS '是否删除'; | ||
| 45 | + | ||
| 46 | +COMMENT ON COLUMN public.article. "version" IS '版本'; | ||
| 47 | + | ||
| 48 | +COMMENT ON COLUMN public.article.author_id IS '发布人'; | ||
| 49 | + | ||
| 50 | +COMMENT ON COLUMN public.article.author IS '发布人对象'; | ||
| 51 | + | ||
| 52 | +COMMENT ON COLUMN public.article.title IS '文章标题'; | ||
| 53 | + | ||
| 54 | +COMMENT ON COLUMN public.article.images IS '图片'; | ||
| 55 | + | ||
| 56 | +COMMENT ON COLUMN public.article.who_read IS '谁可以看'; | ||
| 57 | + | ||
| 58 | +COMMENT ON COLUMN public.article.who_review IS '评论人'; | ||
| 59 | + | ||
| 60 | +COMMENT ON COLUMN public.article. "location" IS '坐标'; | ||
| 61 | + | ||
| 62 | +COMMENT ON COLUMN public.article.target_user IS '分发方式 0 分发给所有人 1 分发给指定的人'; | ||
| 63 | + | ||
| 64 | +COMMENT ON COLUMN public.article.count_love IS '点赞数量'; | ||
| 65 | + | ||
| 66 | +COMMENT ON COLUMN public.article.count_comment IS '评论数量'; | ||
| 67 | + | ||
| 68 | +COMMENT ON COLUMN public.article. "show" IS '评论的展示状态(1显示、2不显示)'; | ||
| 69 | + | ||
| 70 | +COMMENT ON COLUMN public.article.tags IS '标签'; | ||
| 71 | + | ||
| 72 | +COMMENT ON COLUMN public.article.count_read IS '已读数量'; | ||
| 73 | + | ||
| 74 | +-- public.article_and_tag definition | ||
| 75 | +-- Drop table | ||
| 76 | +-- DROP TABLE public.article_and_tag; | ||
| 77 | +CREATE TABLE public.article_and_tag( | ||
| 78 | + id bigserial NOT NULL, | ||
| 79 | + company_id int8 NULL, | ||
| 80 | + created_at int8 NULL, | ||
| 81 | + updated_at int8 NULL, | ||
| 82 | + article_id int8 NULL, | ||
| 83 | + tag_id int8 NULL, | ||
| 84 | + CONSTRAINT article_and_tag_pkey PRIMARY KEY (id) | ||
| 85 | +); | ||
| 86 | + | ||
| 87 | +CREATE INDEX article_and_tag_company_id_idx ON public.article_and_tag USING btree(company_id); | ||
| 88 | + | ||
| 89 | +-- public.article_backup definition | ||
| 90 | +-- Drop table | ||
| 91 | +-- DROP TABLE public.article_backup; | ||
| 92 | +CREATE TABLE public.article_backup( | ||
| 93 | + id bigserial NOT NULL, -- ID | ||
| 94 | + company_id int8 NULL, -- 公司ID | ||
| 95 | + created_at int8 NULL, -- 创建时间 | ||
| 96 | + updated_at int8 NULL, -- 更新时间 | ||
| 97 | + deleted_at int8 NULL, -- 删除时间 | ||
| 98 | + is_del int8 NULL, -- 是否删除 | ||
| 99 | + "version" int8 NULL, -- 版本 | ||
| 100 | + "operator" jsonb NULL, -- 操作人 | ||
| 101 | + title text NULL, -- 标题 | ||
| 102 | + "section" jsonb NULL, -- 分段内容 | ||
| 103 | + images jsonb NULL, -- 图片 | ||
| 104 | + "action" text NULL, -- 操作 | ||
| 105 | + who_read jsonb NULL, -- 谁可以看 | ||
| 106 | + who_review jsonb NULL, -- 评论人 | ||
| 107 | + tags jsonb NULL, -- 标签 | ||
| 108 | + target_user int8 NULL, -- 分发方式 0 分发给所有人 1 分发给指定的人 | ||
| 109 | + article_id int8 NULL, | ||
| 110 | + "location" jsonb NULL, | ||
| 111 | + match_url jsonb NULL DEFAULT '{}' ::jsonb, | ||
| 112 | + videos jsonb NULL DEFAULT '[]' ::jsonb, | ||
| 113 | + CONSTRAINT article_backup_pkey PRIMARY KEY (id) | ||
| 114 | +); | ||
| 115 | + | ||
| 116 | +CREATE INDEX article_backup_company_id_idx ON public.article_backup USING btree(company_id); | ||
| 117 | + | ||
| 118 | +-- Column comments | ||
| 119 | +COMMENT ON COLUMN public.article_backup.id IS 'ID'; | ||
| 120 | + | ||
| 121 | +COMMENT ON COLUMN public.article_backup.company_id IS '公司ID'; | ||
| 122 | + | ||
| 123 | +COMMENT ON COLUMN public.article_backup.created_at IS '创建时间'; | ||
| 124 | + | ||
| 125 | +COMMENT ON COLUMN public.article_backup.updated_at IS '更新时间'; | ||
| 126 | + | ||
| 127 | +COMMENT ON COLUMN public.article_backup.deleted_at IS '删除时间'; | ||
| 128 | + | ||
| 129 | +COMMENT ON COLUMN public.article_backup.is_del IS '是否删除'; | ||
| 130 | + | ||
| 131 | +COMMENT ON COLUMN public.article_backup. "version" IS '版本'; | ||
| 132 | + | ||
| 133 | +COMMENT ON COLUMN public.article_backup. "operator" IS '操作人'; | ||
| 134 | + | ||
| 135 | +COMMENT ON COLUMN public.article_backup.title IS '标题'; | ||
| 136 | + | ||
| 137 | +COMMENT ON COLUMN public.article_backup. "section" IS '分段内容'; | ||
| 138 | + | ||
| 139 | +COMMENT ON COLUMN public.article_backup.images IS '图片'; | ||
| 140 | + | ||
| 141 | +COMMENT ON COLUMN public.article_backup. "action" IS '操作'; | ||
| 142 | + | ||
| 143 | +COMMENT ON COLUMN public.article_backup.who_read IS '谁可以看'; | ||
| 144 | + | ||
| 145 | +COMMENT ON COLUMN public.article_backup.who_review IS '评论人'; | ||
| 146 | + | ||
| 147 | +COMMENT ON COLUMN public.article_backup.tags IS '标签'; | ||
| 148 | + | ||
| 149 | +COMMENT ON COLUMN public.article_backup.target_user IS '分发方式 0 分发给所有人 1 分发给指定的人'; | ||
| 150 | + | ||
| 151 | +-- public.article_comment definition | ||
| 152 | +-- Drop table | ||
| 153 | +-- DROP TABLE public.article_comment; | ||
| 154 | +CREATE TABLE public.article_comment( | ||
| 155 | + id bigserial NOT NULL, -- ID | ||
| 156 | + company_id int8 NULL, -- 公司ID | ||
| 157 | + created_at int8 NULL, -- 创建时间 | ||
| 158 | + updated_at int8 NULL, -- 更新时间 | ||
| 159 | + is_del int8 NULL, -- 是否删除 | ||
| 160 | + deleted_at int8 NULL, -- 删除时间 | ||
| 161 | + "version" int8 NULL, -- 版本 | ||
| 162 | + pid int8 NULL DEFAULT 0, -- 对哪个评论进行回复 | ||
| 163 | + top_id int8 NULL DEFAULT 0, -- 归属于最上级的哪个评论 | ||
| 164 | + article_id int8 NULL DEFAULT 0, -- 文章id | ||
| 165 | + section_id int8 NULL DEFAULT 0, -- 文本段落内容id | ||
| 166 | + section_content text NULL, -- 引用的文章内容文本 | ||
| 167 | + from_user_id int8 NULL DEFAULT 0, -- 谁填写的评论 | ||
| 168 | + from_user jsonb NULL DEFAULT '{}' ::jsonb, -- 谁填写的评论对象 | ||
| 169 | + to_user_id int8 NULL DEFAULT 0, -- 回复谁的评论 | ||
| 170 | + to_user jsonb NULL DEFAULT '{}' ::jsonb, -- 回复谁的评论对象 | ||
| 171 | + "content" text NULL, -- 评论内容 | ||
| 172 | + count_reply int8 NULL DEFAULT 0, -- 回复数量 | ||
| 173 | + count_user_love int8 NULL DEFAULT 0, -- 用户点赞数量 | ||
| 174 | + count_admin_love int8 NULL DEFAULT 0, -- 运营点赞数量 | ||
| 175 | + "show" int8 NULL DEFAULT 1, -- 评论的展示状态(1显示、2不显示) | ||
| 176 | + at_who jsonb NULL DEFAULT '[]' ::jsonb, -- 填写评论时@的人 | ||
| 177 | + match_url jsonb NULL DEFAULT '{}' ::jsonb, -- 评论内容中出现的url. | ||
| 178 | + CONSTRAINT article_comment_pkey PRIMARY KEY (id) | ||
| 179 | +); | ||
| 180 | + | ||
| 181 | +CREATE INDEX article_comment_company_id_idx ON public.article_comment USING btree(company_id); | ||
| 182 | + | ||
| 183 | +-- Column comments | ||
| 184 | +COMMENT ON COLUMN public.article_comment.id IS 'ID'; | ||
| 185 | + | ||
| 186 | +COMMENT ON COLUMN public.article_comment.company_id IS '公司ID'; | ||
| 187 | + | ||
| 188 | +COMMENT ON COLUMN public.article_comment.created_at IS '创建时间'; | ||
| 189 | + | ||
| 190 | +COMMENT ON COLUMN public.article_comment.updated_at IS '更新时间'; | ||
| 191 | + | ||
| 192 | +COMMENT ON COLUMN public.article_comment.is_del IS '是否删除'; | ||
| 193 | + | ||
| 194 | +COMMENT ON COLUMN public.article_comment.deleted_at IS '删除时间'; | ||
| 195 | + | ||
| 196 | +COMMENT ON COLUMN public.article_comment. "version" IS '版本'; | ||
| 197 | + | ||
| 198 | +COMMENT ON COLUMN public.article_comment.pid IS '对哪个评论进行回复'; | ||
| 199 | + | ||
| 200 | +COMMENT ON COLUMN public.article_comment.top_id IS '归属于最上级的哪个评论'; | ||
| 201 | + | ||
| 202 | +COMMENT ON COLUMN public.article_comment.article_id IS '文章id'; | ||
| 203 | + | ||
| 204 | +COMMENT ON COLUMN public.article_comment.section_id IS '文本段落内容id'; | ||
| 205 | + | ||
| 206 | +COMMENT ON COLUMN public.article_comment.section_content IS '引用的文章内容文本'; | ||
| 207 | + | ||
| 208 | +COMMENT ON COLUMN public.article_comment.from_user_id IS '谁填写的评论'; | ||
| 209 | + | ||
| 210 | +COMMENT ON COLUMN public.article_comment.from_user IS '谁填写的评论对象'; | ||
| 211 | + | ||
| 212 | +COMMENT ON COLUMN public.article_comment.to_user_id IS '回复谁的评论'; | ||
| 213 | + | ||
| 214 | +COMMENT ON COLUMN public.article_comment.to_user IS '回复谁的评论对象'; | ||
| 215 | + | ||
| 216 | +COMMENT ON COLUMN public.article_comment. "content" IS '评论内容'; | ||
| 217 | + | ||
| 218 | +COMMENT ON COLUMN public.article_comment.count_reply IS '回复数量'; | ||
| 219 | + | ||
| 220 | +COMMENT ON COLUMN public.article_comment.count_user_love IS '用户点赞数量'; | ||
| 221 | + | ||
| 222 | +COMMENT ON COLUMN public.article_comment.count_admin_love IS '运营点赞数量'; | ||
| 223 | + | ||
| 224 | +COMMENT ON COLUMN public.article_comment. "show" IS '评论的展示状态(1显示、2不显示)'; | ||
| 225 | + | ||
| 226 | +COMMENT ON COLUMN public.article_comment.at_who IS '填写评论时@的人'; | ||
| 227 | + | ||
| 228 | +COMMENT ON COLUMN public.article_comment.match_url IS '评论内容中出现的url.'; | ||
| 229 | + | ||
| 230 | +-- public.article_draft definition | ||
| 231 | +-- Drop table | ||
| 232 | +-- DROP TABLE public.article_draft; | ||
| 233 | +CREATE TABLE public.article_draft( | ||
| 234 | + id bigserial NOT NULL, -- ID | ||
| 235 | + company_id int8 NULL, -- 公司ID | ||
| 236 | + created_at int8 NULL, -- 创建时间 | ||
| 237 | + updated_at int8 NULL, -- 更新时间 | ||
| 238 | + is_del int8 NULL, -- 是否删除 | ||
| 239 | + deleted_at int8 NULL, -- 删除时间 | ||
| 240 | + "version" int8 NULL, -- 版本 | ||
| 241 | + "template" int8 NULL, -- 填写内容时用的样板0、无 1、演绎式 2、归纳式 | ||
| 242 | + "content" jsonb NULL, -- 文章内容 | ||
| 243 | + author_id int8 NULL, -- 发布人 | ||
| 244 | + title text NULL, -- 文章标题 | ||
| 245 | + images jsonb NULL, -- 图片 | ||
| 246 | + who_read jsonb NULL, -- 谁可以看 | ||
| 247 | + who_review jsonb NULL, -- 评论人 | ||
| 248 | + "location" jsonb NULL, -- 坐标 | ||
| 249 | + match_url jsonb NULL DEFAULT '{}' ::jsonb, | ||
| 250 | + CONSTRAINT article_draft_pkey PRIMARY KEY (id) | ||
| 251 | +); | ||
| 252 | + | ||
| 253 | +CREATE INDEX article_draft_company_id_idx ON public.article_draft USING btree(company_id); | ||
| 254 | + | ||
| 255 | +-- Column comments | ||
| 256 | +COMMENT ON COLUMN public.article_draft.id IS 'ID'; | ||
| 257 | + | ||
| 258 | +COMMENT ON COLUMN public.article_draft.company_id IS '公司ID'; | ||
| 259 | + | ||
| 260 | +COMMENT ON COLUMN public.article_draft.created_at IS '创建时间'; | ||
| 261 | + | ||
| 262 | +COMMENT ON COLUMN public.article_draft.updated_at IS '更新时间'; | ||
| 263 | + | ||
| 264 | +COMMENT ON COLUMN public.article_draft.is_del IS '是否删除'; | ||
| 265 | + | ||
| 266 | +COMMENT ON COLUMN public.article_draft.deleted_at IS '删除时间'; | ||
| 267 | + | ||
| 268 | +COMMENT ON COLUMN public.article_draft. "version" IS '版本'; | ||
| 269 | + | ||
| 270 | +COMMENT ON COLUMN public.article_draft. "template" IS '填写内容时用的样板0、无 1、演绎式 2、归纳式'; | ||
| 271 | + | ||
| 272 | +COMMENT ON COLUMN public.article_draft. "content" IS '文章内容'; | ||
| 273 | + | ||
| 274 | +COMMENT ON COLUMN public.article_draft.author_id IS '发布人'; | ||
| 275 | + | ||
| 276 | +COMMENT ON COLUMN public.article_draft.title IS '文章标题'; | ||
| 277 | + | ||
| 278 | +COMMENT ON COLUMN public.article_draft.images IS '图片'; | ||
| 279 | + | ||
| 280 | +COMMENT ON COLUMN public.article_draft.who_read IS '谁可以看'; | ||
| 281 | + | ||
| 282 | +COMMENT ON COLUMN public.article_draft.who_review IS '评论人'; | ||
| 283 | + | ||
| 284 | +COMMENT ON COLUMN public.article_draft. "location" IS '坐标'; | ||
| 285 | + | ||
| 286 | +-- public.article_section definition | ||
| 287 | +-- Drop table | ||
| 288 | +-- DROP TABLE public.article_section; | ||
| 289 | +CREATE TABLE public.article_section( | ||
| 290 | + id bigserial NOT NULL, -- ID | ||
| 291 | + company_id int8 NULL, -- 公司ID | ||
| 292 | + created_at int8 NULL, -- 创建时间 | ||
| 293 | + updated_at int8 NULL, -- 更新时间 | ||
| 294 | + deleted_at int8 NULL, -- 删除时间 | ||
| 295 | + is_del int8 NULL, -- 是否删除 | ||
| 296 | + "version" int8 NULL, -- 版本 | ||
| 297 | + article_id int8 NULL, -- 文章id | ||
| 298 | + "content" text NULL, -- 文本内容 | ||
| 299 | + sort_by int8 NULL, -- 排序 | ||
| 300 | + total_comment int8 NULL, -- 评论的数量 | ||
| 301 | + CONSTRAINT article_section_pkey PRIMARY KEY (id) | ||
| 302 | +); | ||
| 303 | + | ||
| 304 | +CREATE INDEX article_section_article_id_idx ON public.article_section USING btree(article_id); | ||
| 305 | + | ||
| 306 | +CREATE INDEX article_section_company_id_idx ON public.article_section USING btree(company_id); | ||
| 307 | + | ||
| 308 | +-- Column comments | ||
| 309 | +COMMENT ON COLUMN public.article_section.id IS 'ID'; | ||
| 310 | + | ||
| 311 | +COMMENT ON COLUMN public.article_section.company_id IS '公司ID'; | ||
| 312 | + | ||
| 313 | +COMMENT ON COLUMN public.article_section.created_at IS '创建时间'; | ||
| 314 | + | ||
| 315 | +COMMENT ON COLUMN public.article_section.updated_at IS '更新时间'; | ||
| 316 | + | ||
| 317 | +COMMENT ON COLUMN public.article_section.deleted_at IS '删除时间'; | ||
| 318 | + | ||
| 319 | +COMMENT ON COLUMN public.article_section.is_del IS '是否删除'; | ||
| 320 | + | ||
| 321 | +COMMENT ON COLUMN public.article_section. "version" IS '版本'; | ||
| 322 | + | ||
| 323 | +COMMENT ON COLUMN public.article_section.article_id IS '文章id'; | ||
| 324 | + | ||
| 325 | +COMMENT ON COLUMN public.article_section. "content" IS '文本内容'; | ||
| 326 | + | ||
| 327 | +COMMENT ON COLUMN public.article_section.sort_by IS '排序'; | ||
| 328 | + | ||
| 329 | +COMMENT ON COLUMN public.article_section.total_comment IS '评论的数量'; | ||
| 330 | + | ||
| 331 | +-- public.article_tag definition | ||
| 332 | +-- Drop table | ||
| 333 | +-- DROP TABLE public.article_tag; | ||
| 334 | +CREATE TABLE public.article_tag( | ||
| 335 | + id bigserial NOT NULL, -- ID | ||
| 336 | + company_id int8 NULL, -- 公司ID | ||
| 337 | + created_at int8 NULL, -- 创建时间 | ||
| 338 | + updated_at int8 NULL, -- 更新时间 | ||
| 339 | + deleted_at int8 NULL, -- 删除时间 | ||
| 340 | + is_del int8 NULL DEFAULT 0, -- 是否删除 | ||
| 341 | + "version" int8 NULL, -- 版本 | ||
| 342 | + image jsonb NULL, -- 图片 | ||
| 343 | + "name" text NULL, -- 标签名称 | ||
| 344 | + category text NULL, -- 标签分类 | ||
| 345 | + remark text NULL, -- 备注 | ||
| 346 | + sort_by int8 NULL DEFAULT 0, | ||
| 347 | + other text NULL, | ||
| 348 | + CONSTRAINT article_tag_pkey PRIMARY KEY (id) | ||
| 349 | +); | ||
| 350 | + | ||
| 351 | +CREATE INDEX article_tag_company_id_idx ON public.article_tag USING btree(company_id); | ||
| 352 | + | ||
| 353 | +-- Column comments | ||
| 354 | +COMMENT ON COLUMN public.article_tag.id IS 'ID'; | ||
| 355 | + | ||
| 356 | +COMMENT ON COLUMN public.article_tag.company_id IS '公司ID'; | ||
| 357 | + | ||
| 358 | +COMMENT ON COLUMN public.article_tag.created_at IS '创建时间'; | ||
| 359 | + | ||
| 360 | +COMMENT ON COLUMN public.article_tag.updated_at IS '更新时间'; | ||
| 361 | + | ||
| 362 | +COMMENT ON COLUMN public.article_tag.deleted_at IS '删除时间'; | ||
| 363 | + | ||
| 364 | +COMMENT ON COLUMN public.article_tag.is_del IS '是否删除'; | ||
| 365 | + | ||
| 366 | +COMMENT ON COLUMN public.article_tag. "version" IS '版本'; | ||
| 367 | + | ||
| 368 | +COMMENT ON COLUMN public.article_tag.image IS '图片'; | ||
| 369 | + | ||
| 370 | +COMMENT ON COLUMN public.article_tag. "name" IS '标签名称'; | ||
| 371 | + | ||
| 372 | +COMMENT ON COLUMN public.article_tag.category IS '标签分类'; | ||
| 373 | + | ||
| 374 | +COMMENT ON COLUMN public.article_tag.remark IS '备注'; | ||
| 375 | + | ||
| 376 | +-- public.company definition | ||
| 377 | +-- Drop table | ||
| 378 | +-- DROP TABLE public.company; | ||
| 379 | +CREATE TABLE public.company( | ||
| 380 | + id bigserial NOT NULL, -- ID | ||
| 381 | + "name" text NULL, -- 名称 | ||
| 382 | + code text NULL, -- 编码(搜索使用,4位字母数字) | ||
| 383 | + logo text NULL, -- 公司LOGO | ||
| 384 | + created_at int8 NULL, -- 创建时间 | ||
| 385 | + updated_at int8 NULL, -- 更新时间 | ||
| 386 | + deleted_at int8 NULL, -- 删除时间 | ||
| 387 | + "version" int8 NULL, -- 版本 | ||
| 388 | + CONSTRAINT company_pkey PRIMARY KEY (id), | ||
| 389 | + CONSTRAINT idx_company_code UNIQUE (code) | ||
| 390 | +); | ||
| 391 | + | ||
| 392 | +-- Column comments | ||
| 393 | +COMMENT ON COLUMN public.company.id IS 'ID'; | ||
| 394 | + | ||
| 395 | +COMMENT ON COLUMN public.company. "name" IS '名称'; | ||
| 396 | + | ||
| 397 | +COMMENT ON COLUMN public.company.code IS '编码(搜索使用,4位字母数字)'; | ||
| 398 | + | ||
| 399 | +COMMENT ON COLUMN public.company.logo IS '公司LOGO'; | ||
| 400 | + | ||
| 401 | +COMMENT ON COLUMN public.company.created_at IS '创建时间'; | ||
| 402 | + | ||
| 403 | +COMMENT ON COLUMN public.company.updated_at IS '更新时间'; | ||
| 404 | + | ||
| 405 | +COMMENT ON COLUMN public.company.deleted_at IS '删除时间'; | ||
| 406 | + | ||
| 407 | +COMMENT ON COLUMN public.company. "version" IS '版本'; | ||
| 408 | + | ||
| 409 | +-- public.department definition | ||
| 410 | +-- Drop table | ||
| 411 | +-- DROP TABLE public.department; | ||
| 412 | +CREATE TABLE public.department( | ||
| 413 | + id bigserial NOT NULL, | ||
| 414 | + company_id int8 NULL, | ||
| 415 | + parent_id int8 NULL, | ||
| 416 | + "name" text NULL, | ||
| 417 | + created_at int8 NULL, | ||
| 418 | + updated_at int8 NULL, | ||
| 419 | + deleted_at int8 NULL, | ||
| 420 | + "version" int8 NULL, | ||
| 421 | + is_del int8 NULL, | ||
| 422 | + CONSTRAINT department_pkey PRIMARY KEY (id) | ||
| 423 | +); | ||
| 424 | + | ||
| 425 | +-- public.message_business definition | ||
| 426 | +-- Drop table | ||
| 427 | +-- DROP TABLE public.message_business; | ||
| 428 | +CREATE TABLE public.message_business( | ||
| 429 | + id bigserial NOT NULL, | ||
| 430 | + "type" int8 NULL, | ||
| 431 | + opt_type int8 NULL, | ||
| 432 | + company_id int8 NULL, | ||
| 433 | + user_id int8 NULL, | ||
| 434 | + recipient_id int8 NULL, | ||
| 435 | + article_id int8 NULL, | ||
| 436 | + comment_id int8 NULL, | ||
| 437 | + comment_parent_id int8 NULL, | ||
| 438 | + created_at int8 NULL, | ||
| 439 | + updated_at int8 NULL, | ||
| 440 | + deleted_at int8 NULL, | ||
| 441 | + "version" int8 NULL, | ||
| 442 | + is_del int8 NULL, | ||
| 443 | + CONSTRAINT message_business_pkey PRIMARY KEY (id) | ||
| 444 | +); | ||
| 445 | + | ||
| 446 | +-- public.message_system definition | ||
| 447 | +-- Drop table | ||
| 448 | +-- DROP TABLE public.message_system; | ||
| 449 | +CREATE TABLE public.message_system( | ||
| 450 | + id bigserial NOT NULL, | ||
| 451 | + company_id int8 NULL, -- 公司ID | ||
| 452 | + recipient_id int8 NULL, -- 接收者ID | ||
| 453 | + "type" int8 NULL, -- 系统分类(0待定、1业务正常通知、2业务异常通知) | ||
| 454 | + title text NULL, -- 标题 | ||
| 455 | + "content" text NULL, -- 内容 | ||
| 456 | + created_at int8 NULL, -- 创建时间 | ||
| 457 | + updated_at int8 NULL, -- 更新时间 | ||
| 458 | + deleted_at int8 NULL, -- 删除时间 | ||
| 459 | + "version" int8 NULL, -- 版本 | ||
| 460 | + is_del int8 NULL, -- 是否删除 | ||
| 461 | + CONSTRAINT message_system_pkey PRIMARY KEY (id) | ||
| 462 | +); | ||
| 463 | + | ||
| 464 | +-- Column comments | ||
| 465 | +COMMENT ON COLUMN public.message_system.company_id IS '公司ID'; | ||
| 466 | + | ||
| 467 | +COMMENT ON COLUMN public.message_system.recipient_id IS '接收者ID'; | ||
| 468 | + | ||
| 469 | +COMMENT ON COLUMN public.message_system. "type" IS '系统分类(0待定、1业务正常通知、2业务异常通知)'; | ||
| 470 | + | ||
| 471 | +COMMENT ON COLUMN public.message_system.title IS '标题'; | ||
| 472 | + | ||
| 473 | +COMMENT ON COLUMN public.message_system. "content" IS '内容'; | ||
| 474 | + | ||
| 475 | +COMMENT ON COLUMN public.message_system.created_at IS '创建时间'; | ||
| 476 | + | ||
| 477 | +COMMENT ON COLUMN public.message_system.updated_at IS '更新时间'; | ||
| 478 | + | ||
| 479 | +COMMENT ON COLUMN public.message_system.deleted_at IS '删除时间'; | ||
| 480 | + | ||
| 481 | +COMMENT ON COLUMN public.message_system. "version" IS '版本'; | ||
| 482 | + | ||
| 483 | +COMMENT ON COLUMN public.message_system.is_del IS '是否删除'; | ||
| 484 | + | ||
| 485 | +-- public."role" definition | ||
| 486 | +-- Drop table | ||
| 487 | +-- DROP TABLE public."role"; | ||
| 488 | +CREATE TABLE public."role"( | ||
| 489 | + id bigserial NOT NULL, -- ID | ||
| 490 | + "name" text NULL, -- 角色名称 | ||
| 491 | + auths jsonb NULL, -- 角色权限列表 | ||
| 492 | + remark text NULL, -- 备注 | ||
| 493 | + users jsonb NULL, -- 绑定的用户 | ||
| 494 | + created_at int8 NULL, -- 创建时间 | ||
| 495 | + updated_at int8 NULL, -- 更新时间 | ||
| 496 | + deleted_at int8 NULL, -- 删除时间 | ||
| 497 | + "version" int8 NULL, -- 版本 | ||
| 498 | + is_del int8 NULL, -- 是否删除 | ||
| 499 | + company_id int8 NULL, -- 公司ID | ||
| 500 | + CONSTRAINT role_pkey PRIMARY KEY (id) | ||
| 501 | +); | ||
| 502 | + | ||
| 503 | +CREATE INDEX idx_role_company_id ON public.role USING btree(company_id); | ||
| 504 | + | ||
| 505 | +-- Column comments | ||
| 506 | +COMMENT ON COLUMN public."role".id IS 'ID'; | ||
| 507 | + | ||
| 508 | +COMMENT ON COLUMN public."role"."name" IS '角色名称'; | ||
| 509 | + | ||
| 510 | +COMMENT ON COLUMN public."role".auths IS '角色权限列表'; | ||
| 511 | + | ||
| 512 | +COMMENT ON COLUMN public."role".remark IS '备注'; | ||
| 513 | + | ||
| 514 | +COMMENT ON COLUMN public."role".users IS '绑定的用户'; | ||
| 515 | + | ||
| 516 | +COMMENT ON COLUMN public."role".created_at IS '创建时间'; | ||
| 517 | + | ||
| 518 | +COMMENT ON COLUMN public."role".updated_at IS '更新时间'; | ||
| 519 | + | ||
| 520 | +COMMENT ON COLUMN public."role".deleted_at IS '删除时间'; | ||
| 521 | + | ||
| 522 | +COMMENT ON COLUMN public."role"."version" IS '版本'; | ||
| 523 | + | ||
| 524 | +COMMENT ON COLUMN public."role".is_del IS '是否删除'; | ||
| 525 | + | ||
| 526 | +COMMENT ON COLUMN public."role".company_id IS '公司ID'; | ||
| 527 | + | ||
| 528 | +-- public."user" definition | ||
| 529 | +-- Drop table | ||
| 530 | +-- DROP TABLE public."user"; | ||
| 531 | +CREATE TABLE public."user"( | ||
| 532 | + id bigserial NOT NULL, -- 唯一标识 | ||
| 533 | + company_id int8 NULL, -- 公司ID | ||
| 534 | + roles jsonb NULL, -- 角色 | ||
| 535 | + flag int8 NULL, -- 标识 1:管理员 2:普通用户 (有绑定角色是管理员) | ||
| 536 | + "name" text NULL, -- 名称 | ||
| 537 | + avatar text NULL, -- 头像 | ||
| 538 | + phone text NULL, -- 手机号 唯一 | ||
| 539 | + "position" text NULL, -- 职位 | ||
| 540 | + "enable" int8 NULL, -- 启用状态 1:启用 2:禁用 | ||
| 541 | + audit_status int8 NULL, -- 审核状态 0:待审核 1:审核通过 2:拒绝 | ||
| 542 | + follower jsonb NULL, -- 关注我的人 (冗余) | ||
| 543 | + "following" jsonb NULL, -- 我关注的人 (冗余) | ||
| 544 | + created_at int8 NULL, -- 创建时间 | ||
| 545 | + updated_at int8 NULL, -- 更新时间 | ||
| 546 | + deleted_at int8 NULL, -- 删除时间 | ||
| 547 | + "version" int8 NULL, -- 版本 | ||
| 548 | + is_del int8 NULL, -- 是否删除 | ||
| 549 | + departments jsonb NULL, -- 所属部门 | ||
| 550 | + account_from text NULL, -- 账号来源 后台新增、扫码注册 | ||
| 551 | + pin_yin_name text NULL, -- 拼音 | ||
| 552 | + audit_at int8 NULL, | ||
| 553 | + CONSTRAINT user_pkey PRIMARY KEY (id) | ||
| 554 | +); | ||
| 555 | + | ||
| 556 | +CREATE INDEX idx_user_company_id ON public."user" USING btree(company_id); | ||
| 557 | + | ||
| 558 | +CREATE INDEX idx_user_phone ON public."user" USING btree(phone); | ||
| 559 | + | ||
| 560 | +-- Column comments | ||
| 561 | +COMMENT ON COLUMN public."user".id IS '唯一标识'; | ||
| 562 | + | ||
| 563 | +COMMENT ON COLUMN public."user".company_id IS '公司ID'; | ||
| 564 | + | ||
| 565 | +COMMENT ON COLUMN public."user".roles IS '角色'; | ||
| 566 | + | ||
| 567 | +COMMENT ON COLUMN public."user".flag IS '标识 1:管理员 2:普通用户 (有绑定角色是管理员)'; | ||
| 568 | + | ||
| 569 | +COMMENT ON COLUMN public."user"."name" IS '名称'; | ||
| 570 | + | ||
| 571 | +COMMENT ON COLUMN public."user".avatar IS '头像'; | ||
| 572 | + | ||
| 573 | +COMMENT ON COLUMN public."user".phone IS '手机号 唯一'; | ||
| 574 | + | ||
| 575 | +COMMENT ON COLUMN public."user"."position" IS '职位'; | ||
| 576 | + | ||
| 577 | +COMMENT ON COLUMN public."user"."enable" IS '启用状态 1:启用 2:禁用'; | ||
| 578 | + | ||
| 579 | +COMMENT ON COLUMN public."user".audit_status IS '审核状态 0:待审核 1:审核通过 2:拒绝'; | ||
| 580 | + | ||
| 581 | +COMMENT ON COLUMN public."user".follower IS '关注我的人 (冗余)'; | ||
| 582 | + | ||
| 583 | +COMMENT ON COLUMN public."user"."following" IS '我关注的人 (冗余)'; | ||
| 584 | + | ||
| 585 | +COMMENT ON COLUMN public."user".created_at IS '创建时间'; | ||
| 586 | + | ||
| 587 | +COMMENT ON COLUMN public."user".updated_at IS '更新时间'; | ||
| 588 | + | ||
| 589 | +COMMENT ON COLUMN public."user".deleted_at IS '删除时间'; | ||
| 590 | + | ||
| 591 | +COMMENT ON COLUMN public."user"."version" IS '版本'; | ||
| 592 | + | ||
| 593 | +COMMENT ON COLUMN public."user".is_del IS '是否删除'; | ||
| 594 | + | ||
| 595 | +COMMENT ON COLUMN public."user".departments IS '所属部门'; | ||
| 596 | + | ||
| 597 | +COMMENT ON COLUMN public."user".account_from IS '账号来源 后台新增、扫码注册'; | ||
| 598 | + | ||
| 599 | +COMMENT ON COLUMN public."user".pin_yin_name IS '拼音'; | ||
| 600 | + | ||
| 601 | +-- public.user_follow definition | ||
| 602 | +-- Drop table | ||
| 603 | +-- DROP TABLE public.user_follow; | ||
| 604 | +CREATE TABLE public.user_follow( | ||
| 605 | + id bigserial NOT NULL, | ||
| 606 | + created_at int8 NULL, | ||
| 607 | + updated_at int8 NULL, | ||
| 608 | + deleted_at int8 NULL, | ||
| 609 | + "version" int8 NULL, | ||
| 610 | + from_user_id int8 NULL, | ||
| 611 | + to_user_id int8 NULL, | ||
| 612 | + last_read_at int8 NULL, | ||
| 613 | + CONSTRAINT user_follow_pkey PRIMARY KEY (id) | ||
| 614 | +); | ||
| 615 | + | ||
| 616 | +CREATE INDEX idx_user_follow_from_user_id ON public.user_follow USING btree(from_user_id); | ||
| 617 | + | ||
| 618 | +-- public.user_love_flag definition | ||
| 619 | +-- Drop table | ||
| 620 | +-- DROP TABLE public.user_love_flag; | ||
| 621 | +CREATE TABLE public.user_love_flag( | ||
| 622 | + id bigserial NOT NULL, | ||
| 623 | + article_id int8 NULL, -- 点赞文章时,文章id | ||
| 624 | + comment_id int8 NULL, -- 点赞评论时,填评论id | ||
| 625 | + user_id int8 NULL, -- 用户ID,谁点赞 | ||
| 626 | + created_at int8 NULL, -- 创建时间 | ||
| 627 | + updated_at int8 NULL, -- 更新时间 | ||
| 628 | + deleted_at int8 NULL, -- 删除时间 | ||
| 629 | + "version" int8 NULL, -- 版本 | ||
| 630 | + is_del int8 NULL, -- 是否删除 | ||
| 631 | + article_author int8 NULL, -- 文章作者id | ||
| 632 | + comment_author int8 NULL, -- 填写评论的人员id | ||
| 633 | + to_user_id int8 NULL, -- 点赞的接受人 | ||
| 634 | + company_id int8 NULL DEFAULT 0, | ||
| 635 | + CONSTRAINT user_love_flag_pkey PRIMARY KEY (id) | ||
| 636 | +); | ||
| 637 | + | ||
| 638 | +CREATE INDEX user_love_flag_comment_id_idx ON public.user_love_flag USING btree(comment_id); | ||
| 639 | + | ||
| 640 | +CREATE INDEX user_love_flag_user_id_idx ON public.user_love_flag USING btree(user_id); | ||
| 641 | + | ||
| 642 | +-- Column comments | ||
| 643 | +COMMENT ON COLUMN public.user_love_flag.article_id IS '点赞文章时,文章id'; | ||
| 644 | + | ||
| 645 | +COMMENT ON COLUMN public.user_love_flag.comment_id IS '点赞评论时,填评论id'; | ||
| 646 | + | ||
| 647 | +COMMENT ON COLUMN public.user_love_flag.user_id IS '用户ID,谁点赞'; | ||
| 648 | + | ||
| 649 | +COMMENT ON COLUMN public.user_love_flag.created_at IS '创建时间'; | ||
| 650 | + | ||
| 651 | +COMMENT ON COLUMN public.user_love_flag.updated_at IS '更新时间'; | ||
| 652 | + | ||
| 653 | +COMMENT ON COLUMN public.user_love_flag.deleted_at IS '删除时间'; | ||
| 654 | + | ||
| 655 | +COMMENT ON COLUMN public.user_love_flag. "version" IS '版本'; | ||
| 656 | + | ||
| 657 | +COMMENT ON COLUMN public.user_love_flag.is_del IS '是否删除'; | ||
| 658 | + | ||
| 659 | +COMMENT ON COLUMN public.user_love_flag.article_author IS '文章作者id'; | ||
| 660 | + | ||
| 661 | +COMMENT ON COLUMN public.user_love_flag.comment_author IS '填写评论的人员id'; | ||
| 662 | + | ||
| 663 | +COMMENT ON COLUMN public.user_love_flag.to_user_id IS '点赞的接受人'; | ||
| 664 | + | ||
| 665 | +-- public.user_read_article definition | ||
| 666 | +-- Drop table | ||
| 667 | +-- DROP TABLE public.user_read_article; | ||
| 668 | +CREATE TABLE public.user_read_article( | ||
| 669 | + id bigserial NOT NULL, | ||
| 670 | + created_at int8 NULL, | ||
| 671 | + updated_at int8 NULL, | ||
| 672 | + deleted_at int8 NULL, | ||
| 673 | + "version" int8 NULL, | ||
| 674 | + company_id int8 NULL, | ||
| 675 | + user_id int8 NULL, | ||
| 676 | + article_id int8 NULL, | ||
| 677 | + title text NULL, | ||
| 678 | + author jsonb NULL DEFAULT '{}' ::jsonb, | ||
| 679 | + is_del int8 NULL DEFAULT 0, | ||
| 680 | + CONSTRAINT user_read_article_pkey PRIMARY KEY (id) | ||
| 681 | +); | ||
| 682 | + | ||
| 683 | +CREATE INDEX user_read_article_company_id_idx ON public.user_read_article USING btree(company_id); | ||
| 684 | + | ||
| 685 | +CREATE INDEX user_read_article_user_id_idx ON public.user_read_article USING btree(user_id); | ||
| 686 | + | ||
| 687 | +-- public.user_role definition | ||
| 688 | +-- Drop table | ||
| 689 | +-- DROP TABLE public.user_role; | ||
| 690 | +CREATE TABLE public.user_role( | ||
| 691 | + id bigserial NOT NULL, | ||
| 692 | + company_id int8 NULL, | ||
| 693 | + user_id int8 NULL, | ||
| 694 | + role_id int8 NULL, | ||
| 695 | + created_at int8 NULL, | ||
| 696 | + updated_at int8 NULL, | ||
| 697 | + deleted_at int8 NULL, | ||
| 698 | + "version" int8 NULL, | ||
| 699 | + CONSTRAINT user_role_pkey PRIMARY KEY (id) | ||
| 700 | +); | ||
| 701 | + | ||
| 702 | +-- public.user_simples definition | ||
| 703 | +-- Drop table | ||
| 704 | +-- DROP TABLE public.user_simples; | ||
| 705 | +CREATE TABLE public.user_simples( | ||
| 706 | + id bigserial NOT NULL, | ||
| 707 | + "name" text NULL, | ||
| 708 | + avatar text NULL, | ||
| 709 | + "group" text NULL, | ||
| 710 | + "position" text NULL, | ||
| 711 | + CONSTRAINT user_simples_pkey PRIMARY KEY (id) | ||
| 712 | +); | ||
| 713 | + |
-
请 注册 或 登录 后发表评论