作者 tangxvhui
正在显示 45 个修改的文件 包含 736 行增加105 行删除
@@ -14,13 +14,29 @@ info( @@ -14,13 +14,29 @@ info(
14 group: common 14 group: common
15 ) 15 )
16 service Core { 16 service Core {
  17 + @doc "日志查询"
  18 + @handler commonGetLog
  19 + get /log/:module
  20 +}
  21 +
  22 +// 通用接口
  23 +@server(
  24 + prefix: v1
  25 + middleware: LogRequest
  26 + group: common
  27 +)
  28 +service Core {
17 @doc "短信验证码" 29 @doc "短信验证码"
18 @handler commonSmsCode 30 @handler commonSmsCode
19 post /common/sms/code (CommonSmsCodeRequest) returns (CommonSmsCodeResposne) 31 post /common/sms/code (CommonSmsCodeRequest) returns (CommonSmsCodeResposne)
20 32
21 - @doc "日志查询"  
22 - @handler commonGetLog  
23 - get /log/:module 33 + @doc "微信二维码"
  34 + @handler miniQrcodeInvite
  35 + post /mini/qrcode (MiniQrCodeRequest)
  36 +
  37 + @doc "清理缓存"
  38 + @handler commonGetClearCache
  39 + get /clear
24 } 40 }
25 41
26 // 短信验证码 42 // 短信验证码
@@ -32,3 +48,10 @@ type( @@ -32,3 +48,10 @@ type(
32 48
33 } 49 }
34 ) 50 )
  51 +
  52 +type(
  53 + MiniQrCodeRequest{
  54 + Page string `json:"page"` // 微信页面入口
  55 + Scene string `json:"scene"` // 参数
  56 + }
  57 +)
@@ -52,19 +52,20 @@ type ( @@ -52,19 +52,20 @@ type (
52 MessageBusinessItem { 52 MessageBusinessItem {
53 Id int64 `json:"id"` 53 Id int64 `json:"id"`
54 Type int `json:"type"` // 分类 (1回复 2点赞 3被采纳) 54 Type int `json:"type"` // 分类 (1回复 2点赞 3被采纳)
55 - OptType int `json:"optType"` // 操作类型(1针对文章、2针对评论、3针对圆桌) 55 + OptType int `json:"optType"` // 操作类型(1针对文章或段落、2针对评论、3针对圆桌)
56 CompanyId int64 `json:"companyId"` // 操作人公司ID 56 CompanyId int64 `json:"companyId"` // 操作人公司ID
57 UserId int64 `json:"userId"` // 操作人用户ID 57 UserId int64 `json:"userId"` // 操作人用户ID
58 RecipientId int64 `json:"recipientId"` // 接收者ID 58 RecipientId int64 `json:"recipientId"` // 接收者ID
59 ArticleId int64 `json:"articleId"` // 文章ID 59 ArticleId int64 `json:"articleId"` // 文章ID
60 - CommentId int64 `json:"commentId"` // 评论ID  
61 - DiscussionId int64 `json:"discussionId"` // 圆桌ID  
62 - DiscussionOpinionId int64 `json:"discussionOpinionId"` // 观点ID  
63 - Content string `json:"content"` // 消息内容 60 +// CommentId int64 `json:"commentId"` // 评论ID
  61 +// DiscussionId int64 `json:"discussionId"` // 圆桌ID
  62 +// DiscussionOpinionId int64 `json:"discussionOpinionId"` // 观点ID
  63 +// Content string `json:"content"` // 消息内容
64 CreatedAt int64 `json:"createdAt"` // 创建时间 64 CreatedAt int64 `json:"createdAt"` // 创建时间
65 User *SimpleUser `json:"user"` // 操作人 65 User *SimpleUser `json:"user"` // 操作人
66 Article *SimpleArticle `json:"article"` // 文章 66 Article *SimpleArticle `json:"article"` // 文章
67 - Comment *SimpleComment `json:"comment"` // 评论(不一定是自己,可能是被人@到) 67 + Comment *SimpleComment `json:"comment"` // 评论
  68 + CommentParent *SimpleComment `json:"commentParent"` // 被回复的评论
68 } 69 }
69 70
70 SimpleUser { 71 SimpleUser {
@@ -30,6 +30,9 @@ service Core { @@ -30,6 +30,9 @@ service Core {
30 @doc "角色列表搜索" 30 @doc "角色列表搜索"
31 @handler systemSearchRole 31 @handler systemSearchRole
32 post /system/role/search (RoleSearchRequest) returns (RoleSearchResponse) 32 post /system/role/search (RoleSearchRequest) returns (RoleSearchResponse)
  33 + @doc "角色权限列表"
  34 + @handler systemGetRoleAuths
  35 + get /system/role/auths
33 } 36 }
34 37
35 type ( 38 type (
@@ -34,6 +34,9 @@ service Core { @@ -34,6 +34,9 @@ service Core {
34 @doc "用户信息" 34 @doc "用户信息"
35 @handler miniUserInfo 35 @handler miniUserInfo
36 post /mini/user/info (MiniUserInfoRequest) returns (MiniUserInfoResponse) 36 post /mini/user/info (MiniUserInfoRequest) returns (MiniUserInfoResponse)
  37 + @doc "编辑用户信息"
  38 + @handler miniEditUserInfo
  39 + post /mini/user/info/edit (MiniEditUserInfoRequest) returns (MiniEditUserInfoResponse)
37 @doc "用户统计" 40 @doc "用户统计"
38 @handler miniUserStatistics 41 @handler miniUserStatistics
39 post /mini/user/statistics (UserStatisticsRequest) returns (UserStatisticsResponse) 42 post /mini/user/statistics (UserStatisticsRequest) returns (UserStatisticsResponse)
@@ -79,6 +82,15 @@ service Core { @@ -79,6 +82,15 @@ service Core {
79 } 82 }
80 83
81 type( 84 type(
  85 + MiniEditUserInfoRequest{
  86 + Avatar *string `json:"avatar"`
  87 + }
  88 + MiniEditUserInfoResponse{
  89 +
  90 + }
  91 +)
  92 +
  93 +type(
82 MiniUserLoginRequest { 94 MiniUserLoginRequest {
83 LoginType string `json:"loginType"` // 登录类型 wechat-login whchat-phone-login phone-password-login phone-smscode-login 95 LoginType string `json:"loginType"` // 登录类型 wechat-login whchat-phone-login phone-password-login phone-smscode-login
84 WechatAuthCode string `json:"wechatAuthcode,optional"` // 微信登录 授权码 96 WechatAuthCode string `json:"wechatAuthcode,optional"` // 微信登录 授权码
@@ -248,12 +260,13 @@ type ( @@ -248,12 +260,13 @@ type (
248 SimpleComment { 260 SimpleComment {
249 Id int64 `json:"id"` 261 Id int64 `json:"id"`
250 Content string `json:"content"` // 评论内容 262 Content string `json:"content"` // 评论内容
251 - CountLove int `json:"countLove"` // 点赞数量  
252 - CountComment int `json:"countComment"` // 评论数量  
253 Show int `json:"show"` // 评论的展示状态(0显示、1不显示) 263 Show int `json:"show"` // 评论的展示状态(0显示、1不显示)
  264 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
  265 + MatchUrl map[string]string `json:"matchUrl"` // 评论内容中的url文本
  266 + CountReply int `json:"countReply"` // 用户回复数量
  267 + CountUserLove int `json:"countUserLove"` // 用户点赞数量
254 } 268 }
255 269
256 -  
257 MiniBeLikedRequest{ 270 MiniBeLikedRequest{
258 Page int `json:"page"` 271 Page int `json:"page"`
259 Size int `json:"size"` 272 Size int `json:"size"`
@@ -340,9 +353,10 @@ type( @@ -340,9 +353,10 @@ type(
340 ItemFlag int `json:"itemFlag"` //0:默认查询所有 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳 353 ItemFlag int `json:"itemFlag"` //0:默认查询所有 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳
341 } 354 }
342 UserStatisticsResponse{ 355 UserStatisticsResponse{
343 - TotalArticle int `json:"totalArticle"`  
344 - TotalComment int `json:"totalComment"`  
345 - TotalLoved int `json:"totalLoved"` 356 + TotalArticle int `json:"totalArticle"` // 累计发布文章
  357 + TotalComment int `json:"totalComment"` // 累计发布评论
  358 + TotalLoved int `json:"totalLoved"` // 累计赞别人
  359 + TotalBeLoved int `json:"totalBeLoved"` // 累计收到的赞
346 } 360 }
347 StatisticsItem{ 361 StatisticsItem{
348 ItemFlag int `json:"itemFlag"` // 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳 362 ItemFlag int `json:"itemFlag"` // 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳
  1 +package common
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/common"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  9 +)
  10 +
  11 +func CommonGetClearCacheHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  12 + return func(w http.ResponseWriter, r *http.Request) {
  13 + l := common.NewCommonGetClearCacheLogic(r.Context(), svcCtx)
  14 + err := l.CommonGetClearCache()
  15 + if err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + } else {
  18 + httpx.Ok(w)
  19 + }
  20 + }
  21 +}
  1 +package common
  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/common"
  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 MiniQrcodeInviteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.MiniQrCodeRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := common.NewMiniQrcodeInviteLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniQrcodeInvite(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package role
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/role"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  9 +)
  10 +
  11 +func SystemGetRoleAuthsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  12 + return func(w http.ResponseWriter, r *http.Request) {
  13 + l := role.NewSystemGetRoleAuthsLogic(r.Context(), svcCtx)
  14 + resp, err := l.SystemGetRoleAuths()
  15 + result.HttpResult(r, w, resp, err)
  16 + }
  17 +}
@@ -22,16 +22,35 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -22,16 +22,35 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
22 server.AddRoutes( 22 server.AddRoutes(
23 []rest.Route{ 23 []rest.Route{
24 { 24 {
  25 + Method: http.MethodGet,
  26 + Path: "/log/:module",
  27 + Handler: common.CommonGetLogHandler(serverCtx),
  28 + },
  29 + },
  30 + rest.WithPrefix("/v1"),
  31 + )
  32 +
  33 + server.AddRoutes(
  34 + rest.WithMiddlewares(
  35 + []rest.Middleware{serverCtx.LogRequest},
  36 + []rest.Route{
  37 + {
25 Method: http.MethodPost, 38 Method: http.MethodPost,
26 Path: "/common/sms/code", 39 Path: "/common/sms/code",
27 Handler: common.CommonSmsCodeHandler(serverCtx), 40 Handler: common.CommonSmsCodeHandler(serverCtx),
28 }, 41 },
29 { 42 {
30 - Method: http.MethodGet,  
31 - Path: "/log/:module",  
32 - Handler: common.CommonGetLogHandler(serverCtx), 43 + Method: http.MethodPost,
  44 + Path: "/mini/qrcode",
  45 + Handler: common.MiniQrcodeInviteHandler(serverCtx),
33 }, 46 },
  47 + {
  48 + Method: http.MethodGet,
  49 + Path: "/clear",
  50 + Handler: common.CommonGetClearCacheHandler(serverCtx),
34 }, 51 },
  52 + }...,
  53 + ),
35 rest.WithPrefix("/v1"), 54 rest.WithPrefix("/v1"),
36 ) 55 )
37 56
@@ -212,6 +231,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -212,6 +231,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
212 }, 231 },
213 { 232 {
214 Method: http.MethodPost, 233 Method: http.MethodPost,
  234 + Path: "/mini/user/info/edit",
  235 + Handler: user.MiniEditUserInfoHandler(serverCtx),
  236 + },
  237 + {
  238 + Method: http.MethodPost,
215 Path: "/mini/user/statistics", 239 Path: "/mini/user/statistics",
216 Handler: user.MiniUserStatisticsHandler(serverCtx), 240 Handler: user.MiniUserStatisticsHandler(serverCtx),
217 }, 241 },
@@ -569,6 +593,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -569,6 +593,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
569 Path: "/system/role/search", 593 Path: "/system/role/search",
570 Handler: role.SystemSearchRoleHandler(serverCtx), 594 Handler: role.SystemSearchRoleHandler(serverCtx),
571 }, 595 },
  596 + {
  597 + Method: http.MethodGet,
  598 + Path: "/system/role/auths",
  599 + Handler: role.SystemGetRoleAuthsHandler(serverCtx),
  600 + },
572 }..., 601 }...,
573 ), 602 ),
574 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 603 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  1 +package user
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/user"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 +)
  11 +
  12 +func MiniEditUserInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.MiniEditUserInfoRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := user.NewMiniEditUserInfoLogic(r.Context(), svcCtx)
  21 + resp, err := l.MiniEditUserInfo(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
@@ -357,7 +357,7 @@ func (l *MiniSetUserLikeLogic) setUserLikeComment(req *types.MiniSetUserLikeRequ @@ -357,7 +357,7 @@ func (l *MiniSetUserLikeLogic) setUserLikeComment(req *types.MiniSetUserLikeRequ
357 357
358 // 创建点赞消息 358 // 创建点赞消息
359 var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx) 359 var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx)
360 - err = messageLogic.LikeComment(c, commentInfo.ArticleId, commentInfo.Id, commentInfo.FromUserId) 360 + err = messageLogic.LikeComment(c, commentInfo.ArticleId, commentInfo.Id, commentInfo.Pid, commentInfo.FromUserId)
361 if err != nil { 361 if err != nil {
362 return err 362 return err
363 } 363 }
@@ -205,9 +205,9 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini @@ -205,9 +205,9 @@ func (l *MiniCreateArticleCommentLogic) MiniCreateArticleComment(req *types.Mini
205 atAllIds = append(atAllIds, atWhoIds...) 205 atAllIds = append(atAllIds, atWhoIds...)
206 var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx) 206 var messageLogic = message.NewMiniBusinessLogic(l.ctx, l.svcCtx)
207 if pComment != nil { 207 if pComment != nil {
208 - err = messageLogic.CommentReply(c, pComment.ArticleId, pComment.SectionId, pComment.Id, req.Content, atAllIds) // 对评论回复 208 + err = messageLogic.CommentReply(c, req.ArtitcleId, newComment.Id, pComment.Id, atAllIds) // 对评论回复
209 } else { 209 } else {
210 - err = messageLogic.CommentArticle(c, req.ArtitcleId, req.SectionId, req.Content, atAllIds) // 对文章回复 210 + err = messageLogic.CommentArticle(c, req.ArtitcleId, newComment.Id, atAllIds) // 对文章回复
211 } 211 }
212 if err != nil { 212 if err != nil {
213 return err 213 return err
  1 +package common
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  7 + "strings"
  8 +
  9 + "github.com/zeromicro/go-zero/core/logx"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  11 +)
  12 +
  13 +type CommonGetClearCacheLogic struct {
  14 + logx.Logger
  15 + ctx context.Context
  16 + svcCtx *svc.ServiceContext
  17 +}
  18 +
  19 +func NewCommonGetClearCacheLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CommonGetClearCacheLogic {
  20 + return &CommonGetClearCacheLogic{
  21 + Logger: logx.WithContext(ctx),
  22 + ctx: ctx,
  23 + svcCtx: svcCtx,
  24 + }
  25 +}
  26 +
  27 +func (l *CommonGetClearCacheLogic) CommonGetClearCache() error {
  28 + var (
  29 + appName = l.svcCtx.Config.Name
  30 + success int
  31 + )
  32 + if strings.TrimSpace(appName) == "" {
  33 + return nil
  34 + }
  35 + keyPattern := fmt.Sprintf("%s*", appName)
  36 + list, err := l.svcCtx.Redis.Keys(keyPattern)
  37 + if err != nil {
  38 + return xerr.NewErrMsg(err.Error())
  39 + }
  40 + for _, key := range list {
  41 + if _, err = l.svcCtx.Redis.Del(key); err == nil {
  42 + success++
  43 + }
  44 + }
  45 + logx.Infof("清理缓存:%d/%d", success, len(list))
  46 + return nil
  47 +}
  1 +package common
  2 +
  3 +import (
  4 + "context"
  5 + "encoding/json"
  6 + "fmt"
  7 + "github.com/samber/lo"
  8 + "github.com/silenceper/wechat/v2/miniprogram/qrcode"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/openlib"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/tool"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  12 +
  13 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  14 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  15 +
  16 + "github.com/zeromicro/go-zero/core/logx"
  17 +)
  18 +
  19 +type MiniQrcodeInviteLogic struct {
  20 + logx.Logger
  21 + ctx context.Context
  22 + svcCtx *svc.ServiceContext
  23 +}
  24 +
  25 +func NewMiniQrcodeInviteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniQrcodeInviteLogic {
  26 + return &MiniQrcodeInviteLogic{
  27 + Logger: logx.WithContext(ctx),
  28 + ctx: ctx,
  29 + svcCtx: svcCtx,
  30 + }
  31 +}
  32 +
  33 +func (l *MiniQrcodeInviteLogic) MiniQrcodeInvite(req *types.MiniQrCodeRequest) (resp interface{}, err error) {
  34 + var (
  35 + q = l.svcCtx.MiniProgram.GetQRCode()
  36 + cacheData = fmt.Sprintf("%s?%s", req.Page, req.Scene)
  37 + cacheKey = fmt.Sprintf("%s:qrcode:%s", l.svcCtx.Config.Name, tool.Md5ByString(cacheData))
  38 + ok bool
  39 + qrcodeCache QrcodeCache
  40 + )
  41 + // 从缓存获取
  42 + if ok, err = l.svcCtx.Redis.ExistsCtx(l.ctx, cacheKey); ok && err == nil {
  43 + tmpCacheData, _ := l.svcCtx.Redis.Get(cacheKey)
  44 + if err = json.Unmarshal([]byte(tmpCacheData), &qrcodeCache); err == nil {
  45 + if qrcodeCache.CacheData == cacheData {
  46 + return MiniQrCodeResponse{
  47 + Path: qrcodeCache.QrcodeUrl,
  48 + }, nil
  49 + }
  50 + }
  51 + }
  52 +
  53 + var data []byte
  54 + data, err = q.GetWXACodeUnlimit(qrcode.QRCoder{
  55 + Page: req.Page,
  56 + Path: req.Page,
  57 + Scene: req.Scene,
  58 + CheckPath: lo.ToPtr(false),
  59 + EnvVersion: "release",
  60 + })
  61 + if err != nil {
  62 + return nil, xerr.NewErr(err)
  63 + }
  64 + var result *openlib.DataPutFile
  65 + result, err = l.svcCtx.OpenApiService.PutFile(l.ctx, openlib.RequestPutFile{
  66 + File: data,
  67 + })
  68 + if err != nil {
  69 + return nil, xerr.NewErr(err)
  70 + }
  71 + if result == nil || len(*result) == 0 || (*result)[0].Path == "" {
  72 + return nil, xerr.NewErr(fmt.Errorf("上传失败"))
  73 + }
  74 +
  75 + // 设置缓存
  76 + jsonData, err := json.Marshal(QrcodeCache{
  77 + CacheData: cacheData,
  78 + QrcodeUrl: (*result)[0].Path,
  79 + })
  80 + l.svcCtx.Redis.Set(cacheKey, string(jsonData))
  81 +
  82 + return MiniQrCodeResponse{
  83 + Path: (*result)[0].Path,
  84 + }, err
  85 +}
  86 +
  87 +type MiniQrCodeResponse struct {
  88 + Path string `json:"path"`
  89 +}
  90 +
  91 +type QrcodeCache struct {
  92 + CacheData string
  93 + QrcodeUrl string
  94 +}
@@ -57,6 +57,6 @@ func NewCompany(item *domain.Company) types.Company { @@ -57,6 +57,6 @@ func NewCompany(item *domain.Company) types.Company {
57 Id: item.Id, 57 Id: item.Id,
58 Name: item.Name, 58 Name: item.Name,
59 Code: item.Code, 59 Code: item.Code,
60 - Logo: item.Logo, 60 + Logo: lo.Ternary(item.Logo != "", item.Logo, domain.DefaultCompanyLog),
61 } 61 }
62 } 62 }
@@ -50,8 +50,7 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma @@ -50,8 +50,7 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
50 var userIdMap = map[int64]*domain.User{} 50 var userIdMap = map[int64]*domain.User{}
51 var articleIdMap = map[int64]*domain.Article{} 51 var articleIdMap = map[int64]*domain.Article{}
52 var commentIdMap = map[int64]*domain.ArticleComment{} 52 var commentIdMap = map[int64]*domain.ArticleComment{}
53 - //var discussionIdMap = map[int64]int{}  
54 - //var discussionOpinionIdMap = map[int64]int{} 53 +
55 for _, item := range list { 54 for _, item := range list {
56 if item.CompanyId != 0 { 55 if item.CompanyId != 0 {
57 companyIdMap[item.CompanyId] = nil 56 companyIdMap[item.CompanyId] = nil
@@ -65,19 +64,15 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma @@ -65,19 +64,15 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
65 if item.CommentId != 0 { 64 if item.CommentId != 0 {
66 commentIdMap[item.CommentId] = nil 65 commentIdMap[item.CommentId] = nil
67 } 66 }
68 - //if item.DiscussionId != 0 {  
69 - // discussionIdMap[item.DiscussionId] = 0  
70 - //}  
71 - //if item.DiscussionOpinionId != 0 {  
72 - // discussionOpinionIdMap[item.DiscussionOpinionId] = 0  
73 - //} 67 + if item.CommentParentId != 0 {
  68 + commentIdMap[item.CommentParentId] = nil
  69 + }
74 } 70 }
75 var companyIds = make([]int64, 0) // 公司ID 71 var companyIds = make([]int64, 0) // 公司ID
76 var userIds = make([]int64, 0) // 用户ID 72 var userIds = make([]int64, 0) // 用户ID
77 var articleIds = make([]int64, 0) // 文章ID 73 var articleIds = make([]int64, 0) // 文章ID
78 - var commentIds = make([]int64, 0) // 评论ID  
79 - //var discussionIds = make([]int64, 0) // 讨论ID 暂时搁置  
80 - //var discussionOpinionIds = make([]int64, 0) // 观点ID 74 + var commentIds = make([]int64, 0) // 评论ID(包含回复的评论)
  75 +
81 for k, _ := range companyIdMap { 76 for k, _ := range companyIdMap {
82 companyIds = append(companyIds, k) 77 companyIds = append(companyIds, k)
83 } 78 }
@@ -90,12 +85,6 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma @@ -90,12 +85,6 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
90 for k, _ := range commentIdMap { 85 for k, _ := range commentIdMap {
91 commentIds = append(commentIds, k) 86 commentIds = append(commentIds, k)
92 } 87 }
93 - //for k, _ := range discussionIdMap {  
94 - // discussionIds = append(discussionIds, k)  
95 - //}  
96 - //for k, _ := range discussionOpinionIdMap {  
97 - // discussionOpinionIds = append(discussionOpinionIds, k)  
98 - //}  
99 88
100 // 获取公司 89 // 获取公司
101 if len(companyIds) > 0 { 90 if len(companyIds) > 0 {
@@ -166,13 +155,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma @@ -166,13 +155,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
166 UserId: item.UserId, 155 UserId: item.UserId,
167 RecipientId: item.RecipientId, 156 RecipientId: item.RecipientId,
168 ArticleId: item.ArticleId, 157 ArticleId: item.ArticleId,
169 - CommentId: item.CommentId,  
170 - //DiscussionId: item.DiscussionId,  
171 - //DiscussionOpinionId: item.DiscussionOpinionId,  
172 - Content: item.Content,  
173 CreatedAt: item.CreatedAt, 158 CreatedAt: item.CreatedAt,
174 } 159 }
175 160
  161 + // 发布者
176 if v, ok := userIdMap[item.UserId]; ok && v != nil { 162 if v, ok := userIdMap[item.UserId]; ok && v != nil {
177 to.User = &types.SimpleUser{ 163 to.User = &types.SimpleUser{
178 Id: v.Id, 164 Id: v.Id,
@@ -187,6 +173,7 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma @@ -187,6 +173,7 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
187 } 173 }
188 } 174 }
189 175
  176 + // 文章
190 if v, ok := articleIdMap[item.ArticleId]; ok && v != nil { 177 if v, ok := articleIdMap[item.ArticleId]; ok && v != nil {
191 to.Article = &types.SimpleArticle{ 178 to.Article = &types.SimpleArticle{
192 Id: v.Id, 179 Id: v.Id,
@@ -197,13 +184,41 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma @@ -197,13 +184,41 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
197 } 184 }
198 } 185 }
199 186
  187 + // 评论
200 if v, ok := commentIdMap[item.CommentId]; ok && v != nil { 188 if v, ok := commentIdMap[item.CommentId]; ok && v != nil {
201 to.Comment = &types.SimpleComment{ 189 to.Comment = &types.SimpleComment{
202 Id: v.Id, 190 Id: v.Id,
203 Content: v.Content, 191 Content: v.Content,
204 - CountLove: v.CountUserLove,  
205 - CountComment: v.CountReply,  
206 Show: int(v.Show), 192 Show: int(v.Show),
  193 + CountReply: v.CountReply,
  194 + CountUserLove: v.CountUserLove,
  195 + MatchUrl: v.MatchUrl,
  196 + }
  197 + to.Comment.AtWho = make([]types.CommentAtWho, 0)
  198 + for _, who := range v.AtWho {
  199 + to.Comment.AtWho = append(to.Comment.AtWho, types.CommentAtWho{
  200 + Id: who.Id,
  201 + Name: who.Name,
  202 + })
  203 + }
  204 + }
  205 +
  206 + // 被回复的评论
  207 + if v, ok := commentIdMap[item.CommentParentId]; ok && v != nil {
  208 + to.CommentParent = &types.SimpleComment{
  209 + Id: v.Id,
  210 + Content: v.Content,
  211 + Show: int(v.Show),
  212 + CountReply: v.CountReply,
  213 + CountUserLove: v.CountUserLove,
  214 + MatchUrl: v.MatchUrl,
  215 + }
  216 + to.CommentParent.AtWho = make([]types.CommentAtWho, 0)
  217 + for _, who := range v.AtWho {
  218 + to.CommentParent.AtWho = append(to.CommentParent.AtWho, types.CommentAtWho{
  219 + Id: who.Id,
  220 + Name: who.Name,
  221 + })
207 } 222 }
208 } 223 }
209 224
@@ -213,23 +228,23 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma @@ -213,23 +228,23 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
213 } 228 }
214 229
215 // CommentArticle 评论文章 230 // CommentArticle 评论文章
216 -func (l *MiniBusinessLogic) CommentArticle(conn transaction.Conn, articleId int64, sectionId int64, content string, at []int64) (err error) {  
217 - return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeArticle, articleId, sectionId, 0, content, at) 231 +func (l *MiniBusinessLogic) CommentArticle(conn transaction.Conn, articleId int64, commentId int64, at []int64) (err error) {
  232 + return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeArticle, articleId, commentId, 0, at)
218 } 233 }
219 234
220 // CommentReply 评论回复 235 // CommentReply 评论回复
221 -func (l *MiniBusinessLogic) CommentReply(conn transaction.Conn, articleId int64, sectionId int64, commentId int64, content string, at []int64) (err error) {  
222 - return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeComment, articleId, sectionId, commentId, content, at) 236 +func (l *MiniBusinessLogic) CommentReply(conn transaction.Conn, articleId int64, commentId int64, commentParentId int64, at []int64) (err error) {
  237 + return l.createMessage(conn, domain.MsgTypeReply, domain.OptTypeComment, articleId, commentId, commentParentId, at)
223 } 238 }
224 239
225 // LikeArticle 点赞文章 240 // LikeArticle 点赞文章
226 func (l *MiniBusinessLogic) LikeArticle(conn transaction.Conn, articleId int64, at int64) (err error) { 241 func (l *MiniBusinessLogic) LikeArticle(conn transaction.Conn, articleId int64, at int64) (err error) {
227 - return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeArticle, articleId, 0, 0, "", []int64{at}) 242 + return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeArticle, articleId, 0, 0, []int64{at})
228 } 243 }
229 244
230 // LikeComment 点赞评论 245 // LikeComment 点赞评论
231 -func (l *MiniBusinessLogic) LikeComment(conn transaction.Conn, articleId int64, commentId int64, at int64) (err error) {  
232 - return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeComment, articleId, 0, commentId, "", []int64{at}) 246 +func (l *MiniBusinessLogic) LikeComment(conn transaction.Conn, articleId int64, commentId int64, commentParentId int64, at int64) (err error) {
  247 + return l.createMessage(conn, domain.MsgTypeLike, domain.OptTypeComment, articleId, commentId, commentParentId, []int64{at})
233 } 248 }
234 249
235 // UnLikeArticle 取消点赞文章 250 // UnLikeArticle 取消点赞文章
@@ -247,9 +262,8 @@ func (l *MiniBusinessLogic) createMessage( @@ -247,9 +262,8 @@ func (l *MiniBusinessLogic) createMessage(
247 msgType domain.MsgBusinessType, 262 msgType domain.MsgBusinessType,
248 optType domain.MsgBusinessOpt, 263 optType domain.MsgBusinessOpt,
249 articleId int64, 264 articleId int64,
250 - sectionId int64,  
251 commentId int64, 265 commentId int64,
252 - content string, 266 + commentParentId int64,
253 at []int64) (err error) { 267 at []int64) (err error) {
254 268
255 var userToken = contextdata.GetUserTokenFromCtx(l.ctx) 269 var userToken = contextdata.GetUserTokenFromCtx(l.ctx)
@@ -262,9 +276,8 @@ func (l *MiniBusinessLogic) createMessage( @@ -262,9 +276,8 @@ func (l *MiniBusinessLogic) createMessage(
262 UserId: userToken.UserId, 276 UserId: userToken.UserId,
263 RecipientId: at[i], 277 RecipientId: at[i],
264 ArticleId: articleId, 278 ArticleId: articleId,
265 - SectionId: sectionId,  
266 CommentId: commentId, 279 CommentId: commentId,
267 - Content: content, 280 + CommentParentId: commentParentId,
268 } 281 }
269 msg, err = l.svcCtx.MessageBusinessRepository.Insert(l.ctx, conn, msg) 282 msg, err = l.svcCtx.MessageBusinessRepository.Insert(l.ctx, conn, msg)
270 if err != nil { 283 if err != nil {
  1 +package role
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 +
  7 + "github.com/zeromicro/go-zero/core/logx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  9 +)
  10 +
  11 +type SystemGetRoleAuthsLogic struct {
  12 + logx.Logger
  13 + ctx context.Context
  14 + svcCtx *svc.ServiceContext
  15 +}
  16 +
  17 +func NewSystemGetRoleAuthsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemGetRoleAuthsLogic {
  18 + return &SystemGetRoleAuthsLogic{
  19 + Logger: logx.WithContext(ctx),
  20 + ctx: ctx,
  21 + svcCtx: svcCtx,
  22 + }
  23 +}
  24 +
  25 +func (l *SystemGetRoleAuthsLogic) SystemGetRoleAuths() (interface{}, error) {
  26 + return map[string]interface{}{
  27 + "list": domain.Auths,
  28 + }, nil
  29 +}
  1 +package user
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  7 + "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/pkg/contextdata"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type MiniEditUserInfoLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewMiniEditUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniEditUserInfoLogic {
  22 + return &MiniEditUserInfoLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *MiniEditUserInfoLogic) MiniEditUserInfo(req *types.MiniEditUserInfoRequest) (resp *types.MiniEditUserInfoResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + user *domain.User
  33 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  34 + )
  35 + user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId)
  36 + if err != nil {
  37 + return nil, err
  38 + }
  39 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  40 + user.Avatar = *req.Avatar
  41 + if user, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, user); err != nil {
  42 + return err
  43 + }
  44 + return nil
  45 + }, true); err != nil {
  46 + return nil, xerr.NewErrMsgErr("更新头像失败", err)
  47 + }
  48 + resp = &types.MiniEditUserInfoResponse{}
  49 + return
  50 +}
@@ -109,9 +109,17 @@ func (l *MiniMyBeLikedLogic) NewItemSimple(love *domain.UserLoveFlag, company *d @@ -109,9 +109,17 @@ func (l *MiniMyBeLikedLogic) NewItemSimple(love *domain.UserLoveFlag, company *d
109 item.Comment = &types.SimpleComment{ 109 item.Comment = &types.SimpleComment{
110 Id: comment.Id, 110 Id: comment.Id,
111 Content: comment.Content, 111 Content: comment.Content,
112 - CountLove: comment.CountUserLove,  
113 - CountComment: comment.CountReply,  
114 Show: int(comment.Show), 112 Show: int(comment.Show),
  113 + CountReply: comment.CountReply,
  114 + CountUserLove: comment.CountUserLove,
  115 + MatchUrl: comment.MatchUrl,
  116 + }
  117 + item.Comment.AtWho = make([]types.CommentAtWho, 0)
  118 + for _, who := range comment.AtWho {
  119 + item.Comment.AtWho = append(item.Comment.AtWho, types.CommentAtWho{
  120 + Id: who.Id,
  121 + Name: who.Name,
  122 + })
115 } 123 }
116 } 124 }
117 125
@@ -109,9 +109,17 @@ func (l *MiniMyLikeLogic) NewItemSimple(love *domain.UserLoveFlag, company *doma @@ -109,9 +109,17 @@ func (l *MiniMyLikeLogic) NewItemSimple(love *domain.UserLoveFlag, company *doma
109 item.Comment = &types.SimpleComment{ 109 item.Comment = &types.SimpleComment{
110 Id: comment.Id, 110 Id: comment.Id,
111 Content: comment.Content, 111 Content: comment.Content,
112 - CountLove: comment.CountUserLove,  
113 - CountComment: comment.CountReply,  
114 Show: int(comment.Show), 112 Show: int(comment.Show),
  113 + CountReply: comment.CountReply,
  114 + CountUserLove: comment.CountUserLove,
  115 + MatchUrl: comment.MatchUrl,
  116 + }
  117 + item.Comment.AtWho = make([]types.CommentAtWho, 0)
  118 + for _, who := range comment.AtWho {
  119 + item.Comment.AtWho = append(item.Comment.AtWho, types.CommentAtWho{
  120 + Id: who.Id,
  121 + Name: who.Name,
  122 + })
115 } 123 }
116 } 124 }
117 125
@@ -52,6 +52,9 @@ func (l *SystemUserAccountSaveLogic) SystemUserAccountSave(req *types.SystemUser @@ -52,6 +52,9 @@ func (l *SystemUserAccountSaveLogic) SystemUserAccountSave(req *types.SystemUser
52 if err != nil { 52 if err != nil {
53 return nil, xerr.NewErrMsgErr("申请失败", err) 53 return nil, xerr.NewErrMsgErr("申请失败", err)
54 } 54 }
  55 + if user != nil {
  56 + return nil, xerr.NewErrMsgErr("用户手机号已存在", err)
  57 + }
55 if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { 58 if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
56 user = &domain.User{ 59 user = &domain.User{
57 CompanyId: company.Id, 60 CompanyId: company.Id,
@@ -87,8 +87,12 @@ func (l *SystemUserInfoLogic) SystemUserInfo(req *types.SystemUserInfoRequest) ( @@ -87,8 +87,12 @@ func (l *SystemUserInfoLogic) SystemUserInfo(req *types.SystemUserInfoRequest) (
87 company.Logo = response.CurrentCompany.Logo 87 company.Logo = response.CurrentCompany.Logo
88 changed = true 88 changed = true
89 } 89 }
  90 + if company.Logo == "" {
  91 + company.Logo = domain.DefaultCompanyLog
  92 + changed = true
  93 + }
90 if changed { 94 if changed {
91 - if company, err = l.svcCtx.CompanyRepository.UpdateWithVersion(l.ctx, conn, company); err != nil { 95 + if company, err = l.svcCtx.CompanyRepository.Update(l.ctx, conn, company); err != nil {
92 return nil, xerr.NewErrMsgErr("获取用户资料失败", err) 96 return nil, xerr.NewErrMsgErr("获取用户资料失败", err)
93 } 97 }
94 } 98 }
@@ -112,55 +116,55 @@ func (l *SystemUserInfoLogic) initSystemData(companyId int64) error { @@ -112,55 +116,55 @@ func (l *SystemUserInfoLogic) initSystemData(companyId int64) error {
112 if cnt == 0 { 116 if cnt == 0 {
113 articleTags := []*domain.ArticleTag{ 117 articleTags := []*domain.ArticleTag{
114 { 118 {
115 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 119 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_imp_01.png", Width: 0, Height: 0},
116 Name: "紧急重要", Category: "紧急重要", Remark: "优先解决", SortBy: 1, 120 Name: "紧急重要", Category: "紧急重要", Remark: "优先解决", SortBy: 1,
117 }, 121 },
118 { 122 {
119 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 123 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_imp_04.png", Width: 0, Height: 0},
120 Name: "不紧急不重要", Category: "紧急重要", Remark: "给别人做", SortBy: 2, 124 Name: "不紧急不重要", Category: "紧急重要", Remark: "给别人做", SortBy: 2,
121 }, 125 },
122 { 126 {
123 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 127 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_imp_03.png", Width: 0, Height: 0},
124 Name: "紧急不重要", Category: "紧急重要", Remark: "有空再做", SortBy: 3, 128 Name: "紧急不重要", Category: "紧急重要", Remark: "有空再做", SortBy: 3,
125 }, 129 },
126 { 130 {
127 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 131 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_imp_02.png", Width: 0, Height: 0},
128 Name: "不紧急重要", Category: "紧急重要", Remark: "制定计划去做", SortBy: 4, 132 Name: "不紧急重要", Category: "紧急重要", Remark: "制定计划去做", SortBy: 4,
129 }, 133 },
130 { 134 {
131 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 135 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_03.png", Width: 0, Height: 0},
132 Name: "大机会高风险", Category: "机会风险", Remark: "谨慎考虑专项讨论", SortBy: 5, 136 Name: "大机会高风险", Category: "机会风险", Remark: "谨慎考虑专项讨论", SortBy: 5,
133 }, 137 },
134 { 138 {
135 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 139 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_02.png", Width: 0, Height: 0},
136 Name: "大机会中风险", Category: "机会风险", Remark: "加大关注值得尝试", SortBy: 6, 140 Name: "大机会中风险", Category: "机会风险", Remark: "加大关注值得尝试", SortBy: 6,
137 }, 141 },
138 { 142 {
139 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 143 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_01.png", Width: 0, Height: 0},
140 Name: "大机会低风险", Category: "机会风险", Remark: "全员投入抓紧落实", SortBy: 7, 144 Name: "大机会低风险", Category: "机会风险", Remark: "全员投入抓紧落实", SortBy: 7,
141 }, 145 },
142 { 146 {
143 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 147 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_04.png", Width: 0, Height: 0},
144 Name: "中机会高风险", Category: "机会风险", Remark: "专人跟踪成立项目", SortBy: 8, 148 Name: "中机会高风险", Category: "机会风险", Remark: "专人跟踪成立项目", SortBy: 8,
145 }, 149 },
146 { 150 {
147 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 151 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_05.png", Width: 0, Height: 0},
148 Name: "中机会中风险", Category: "机会风险", Remark: "讨论落实", SortBy: 9, 152 Name: "中机会中风险", Category: "机会风险", Remark: "讨论落实", SortBy: 9,
149 }, 153 },
150 { 154 {
151 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 155 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_06.png", Width: 0, Height: 0},
152 Name: "中机会低风险", Category: "机会风险", Remark: "解决问题多手准备", SortBy: 10, 156 Name: "中机会低风险", Category: "机会风险", Remark: "解决问题多手准备", SortBy: 10,
153 }, 157 },
154 { 158 {
155 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 159 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_07.png", Width: 0, Height: 0},
156 Name: "小机会高风险", Category: "机会风险", Remark: "有空看看", SortBy: 11, 160 Name: "小机会高风险", Category: "机会风险", Remark: "有空看看", SortBy: 11,
157 }, 161 },
158 { 162 {
159 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 163 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_08.png", Width: 0, Height: 0},
160 Name: "小机会中风险", Category: "机会风险", Remark: "持续监控做好控制", SortBy: 12, 164 Name: "小机会中风险", Category: "机会风险", Remark: "持续监控做好控制", SortBy: 12,
161 }, 165 },
162 { 166 {
163 - Id: 0, CompanyId: companyId, Image: domain.Image{Url: "", Width: 0, Height: 0}, 167 + Id: 0, CompanyId: companyId, Image: domain.Image{Url: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231115/object/index_chance_09.png", Width: 0, Height: 0},
164 Name: "小机会低风险", Category: "机会风险", Remark: "全员警戒马上解决", SortBy: 13, 168 Name: "小机会低风险", Category: "机会风险", Remark: "全员警戒马上解决", SortBy: 13,
165 }, 169 },
166 } 170 }
@@ -35,6 +35,7 @@ func (l *SystemUserStatisticsLogic) SystemUserStatistics(req *types.UserStatisti @@ -35,6 +35,7 @@ func (l *SystemUserStatisticsLogic) SystemUserStatistics(req *types.UserStatisti
35 TotalArticle: s.TotalArticle, 35 TotalArticle: s.TotalArticle,
36 TotalComment: s.TotalComment, 36 TotalComment: s.TotalComment,
37 TotalLoved: s.TotalLoved, 37 TotalLoved: s.TotalLoved,
  38 + TotalBeLoved: s.TotalBeLoved,
38 } 39 }
39 return 40 return
40 } 41 }
@@ -57,8 +58,13 @@ func StatisticsItems(ctx context.Context, svcCtx *svc.ServiceContext, companyId, @@ -57,8 +58,13 @@ func StatisticsItems(ctx context.Context, svcCtx *svc.ServiceContext, companyId,
57 } 58 }
58 if (itemFlag & TotalLoved) > 0 { 59 if (itemFlag & TotalLoved) > 0 {
59 var total int64 60 var total int64
60 - total, _, _ = svcCtx.UserLoveFlagRepository.Find(ctx, conn, domain.IndexCompanyId(companyId)().WithCountOnly().MustWithKV("userId", userId))  
61 - s.TotalComment = int(total) 61 + total, _, _ = svcCtx.UserLoveFlagRepository.Find(ctx, conn, domain.IndexCompanyId(0)().WithCountOnly().MustWithKV("userId", userId))
  62 + s.TotalLoved = int(total)
  63 + }
  64 + if (itemFlag & TotalBeLoved) > 0 {
  65 + var total int64
  66 + total, _, _ = svcCtx.UserLoveFlagRepository.Find(ctx, conn, domain.IndexCompanyId(0)().WithCountOnly().MustWithKV("toUserId", userId))
  67 + s.TotalBeLoved = int(total)
62 } 68 }
63 return 69 return
64 } 70 }
@@ -67,12 +73,14 @@ type Statistics struct { @@ -67,12 +73,14 @@ type Statistics struct {
67 TotalArticle int `json:"totalArticle"` 73 TotalArticle int `json:"totalArticle"`
68 TotalComment int `json:"totalComment"` 74 TotalComment int `json:"totalComment"`
69 TotalLoved int `json:"totalLoved"` 75 TotalLoved int `json:"totalLoved"`
  76 + TotalBeLoved int `json:"totalBeLoved"`
70 } 77 }
71 78
72 const ( 79 const (
73 - TotalArticle = 1  
74 - TotalComment = 2  
75 - TotalLoved = 4 80 + TotalArticle = 1 // 累计发布文章
  81 + TotalComment = 2 // 累计发布评论
  82 + TotalLoved = 4 // 累计赞别人
  83 + TotalBeLoved = 8 // 累计收到的赞
76 ) 84 )
77 85
78 func NewStatisticsItem(itemFlag int, value float64) types.StatisticsItem { 86 func NewStatisticsItem(itemFlag int, value float64) types.StatisticsItem {
1 package svc 1 package svc
2 2
3 import ( 3 import (
  4 + "github.com/silenceper/wechat/v2"
  5 + minicache "github.com/silenceper/wechat/v2/cache"
  6 + "github.com/silenceper/wechat/v2/miniprogram"
  7 + miniConfig "github.com/silenceper/wechat/v2/miniprogram/config"
4 "github.com/zeromicro/go-zero/core/stores/redis" 8 "github.com/zeromicro/go-zero/core/stores/redis"
5 "github.com/zeromicro/go-zero/rest" 9 "github.com/zeromicro/go-zero/rest"
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/config" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/config"
@@ -10,6 +14,7 @@ import ( @@ -10,6 +14,7 @@ import (
10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain" 14 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway" 15 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway"
12 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib" 16 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/authlib"
  17 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/openlib"
13 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/smslib" 18 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway/smslib"
14 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/cache" 19 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/cache"
15 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/database" 20 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/database"
@@ -43,6 +48,9 @@ type ServiceContext struct { @@ -43,6 +48,9 @@ type ServiceContext struct {
43 48
44 ApiAuthService authlib.ApiAuthService 49 ApiAuthService authlib.ApiAuthService
45 SmsService smslib.SMSService 50 SmsService smslib.SMSService
  51 + OpenApiService openlib.OpenApiService
  52 +
  53 + MiniProgram *miniprogram.MiniProgram
46 54
47 LoginStatusCheck rest.Middleware 55 LoginStatusCheck rest.Middleware
48 LogRequest rest.Middleware 56 LogRequest rest.Middleware
@@ -57,14 +65,21 @@ func NewServiceContext(c config.Config) *ServiceContext { @@ -57,14 +65,21 @@ func NewServiceContext(c config.Config) *ServiceContext {
57 apiAuth := authlib.ApiAuthService{ 65 apiAuth := authlib.ApiAuthService{
58 Service: gateway.NewService(c.ApiAuth.Name, c.ApiAuth.Host, c.ApiAuth.Timeout), 66 Service: gateway.NewService(c.ApiAuth.Name, c.ApiAuth.Host, c.ApiAuth.Timeout),
59 } 67 }
  68 + miniProgram := wechat.NewWechat().GetMiniProgram(&miniConfig.Config{
  69 + AppID: c.Wechat.AppID,
  70 + AppSecret: c.Wechat.AppSecret,
  71 + Cache: minicache.NewMemory(),
  72 + })
60 return &ServiceContext{ 73 return &ServiceContext{
61 Config: c, 74 Config: c,
62 DB: db, 75 DB: db,
63 Redis: redis, 76 Redis: redis,
64 ApiAuthService: apiAuth, 77 ApiAuthService: apiAuth,
65 SmsService: smslib.SMSService{Service: gateway.NewService("短信服务", "https://sms.fjmaimaimai.com:9897", time.Second*5)}, 78 SmsService: smslib.SMSService{Service: gateway.NewService("短信服务", "https://sms.fjmaimaimai.com:9897", time.Second*5)},
  79 + OpenApiService: openlib.OpenApiService{Service: gateway.NewService("开发接口服务", "https://mmm-open-api-test.fjmaimaimai.com", time.Second*5)},
66 LoginStatusCheck: middleware.NewLoginStatusCheckMiddleware(apiAuth).Handle, 80 LoginStatusCheck: middleware.NewLoginStatusCheckMiddleware(apiAuth).Handle,
67 LogRequest: middleware.NewLogRequestMiddleware(c.LogRequest).Handle, 81 LogRequest: middleware.NewLogRequestMiddleware(c.LogRequest).Handle,
  82 + MiniProgram: miniProgram,
68 83
69 ArticleBackupRepository: repository.NewArticleBackupRepository(cache.NewCachedRepository(mlCache)), 84 ArticleBackupRepository: repository.NewArticleBackupRepository(cache.NewCachedRepository(mlCache)),
70 ArticleCommentRepository: repository.NewArticleCommentRepository(cache.NewCachedRepository(mlCache)), 85 ArticleCommentRepository: repository.NewArticleCommentRepository(cache.NewCachedRepository(mlCache)),
@@ -8,6 +8,11 @@ type CommonSmsCodeRequest struct { @@ -8,6 +8,11 @@ type CommonSmsCodeRequest struct {
8 type CommonSmsCodeResposne struct { 8 type CommonSmsCodeResposne struct {
9 } 9 }
10 10
  11 +type MiniQrCodeRequest struct {
  12 + Page string `json:"page"` // 微信页面入口
  13 + Scene string `json:"scene"` // 参数
  14 +}
  15 +
11 type CommentAuthor struct { 16 type CommentAuthor struct {
12 Id int64 `json:"id"` // 人员id 17 Id int64 `json:"id"` // 人员id
13 Name string `json:"name"` // 人员的名字 18 Name string `json:"name"` // 人员的名字
@@ -283,19 +288,16 @@ type MessageBusinessResponse struct { @@ -283,19 +288,16 @@ type MessageBusinessResponse struct {
283 type MessageBusinessItem struct { 288 type MessageBusinessItem struct {
284 Id int64 `json:"id"` 289 Id int64 `json:"id"`
285 Type int `json:"type"` // 分类 (1回复 2点赞 3被采纳) 290 Type int `json:"type"` // 分类 (1回复 2点赞 3被采纳)
286 - OptType int `json:"optType"` // 操作类型(1针对文章、2针对评论、3针对圆桌) 291 + OptType int `json:"optType"` // 操作类型(1针对文章或段落、2针对评论、3针对圆桌)
287 CompanyId int64 `json:"companyId"` // 操作人公司ID 292 CompanyId int64 `json:"companyId"` // 操作人公司ID
288 UserId int64 `json:"userId"` // 操作人用户ID 293 UserId int64 `json:"userId"` // 操作人用户ID
289 RecipientId int64 `json:"recipientId"` // 接收者ID 294 RecipientId int64 `json:"recipientId"` // 接收者ID
290 ArticleId int64 `json:"articleId"` // 文章ID 295 ArticleId int64 `json:"articleId"` // 文章ID
291 - CommentId int64 `json:"commentId"` // 评论ID  
292 - DiscussionId int64 `json:"discussionId"` // 圆桌ID  
293 - DiscussionOpinionId int64 `json:"discussionOpinionId"` // 观点ID  
294 - Content string `json:"content"` // 消息内容  
295 CreatedAt int64 `json:"createdAt"` // 创建时间 296 CreatedAt int64 `json:"createdAt"` // 创建时间
296 User *SimpleUser `json:"user"` // 操作人 297 User *SimpleUser `json:"user"` // 操作人
297 Article *SimpleArticle `json:"article"` // 文章 298 Article *SimpleArticle `json:"article"` // 文章
298 - Comment *SimpleComment `json:"comment"` // 评论(不一定是自己,可能是被人@到) 299 + Comment *SimpleComment `json:"comment"` // 评论
  300 + CommentParent *SimpleComment `json:"commentParent"` // 被回复的评论
299 } 301 }
300 302
301 type SimpleUser struct { 303 type SimpleUser struct {
@@ -411,6 +413,13 @@ type TagOptionValue struct { @@ -411,6 +413,13 @@ type TagOptionValue struct {
411 Value int64 `json:"value"` // 标签ID 413 Value int64 `json:"value"` // 标签ID
412 } 414 }
413 415
  416 +type MiniEditUserInfoRequest struct {
  417 + Avatar *string `json:"avatar"`
  418 +}
  419 +
  420 +type MiniEditUserInfoResponse struct {
  421 +}
  422 +
414 type MiniUserLoginRequest struct { 423 type MiniUserLoginRequest struct {
415 LoginType string `json:"loginType"` // 登录类型 wechat-login whchat-phone-login phone-password-login phone-smscode-login 424 LoginType string `json:"loginType"` // 登录类型 wechat-login whchat-phone-login phone-password-login phone-smscode-login
416 WechatAuthCode string `json:"wechatAuthcode,optional"` // 微信登录 授权码 425 WechatAuthCode string `json:"wechatAuthcode,optional"` // 微信登录 授权码
@@ -591,9 +600,11 @@ type MyLikeItem struct { @@ -591,9 +600,11 @@ type MyLikeItem struct {
591 type SimpleComment struct { 600 type SimpleComment struct {
592 Id int64 `json:"id"` 601 Id int64 `json:"id"`
593 Content string `json:"content"` // 评论内容 602 Content string `json:"content"` // 评论内容
594 - CountLove int `json:"countLove"` // 点赞数量  
595 - CountComment int `json:"countComment"` // 评论数量  
596 Show int `json:"show"` // 评论的展示状态(0显示、1不显示) 603 Show int `json:"show"` // 评论的展示状态(0显示、1不显示)
  604 + AtWho []CommentAtWho `json:"atWho"` // 填写评论时@的人
  605 + MatchUrl map[string]string `json:"matchUrl"` // 评论内容中的url文本
  606 + CountReply int `json:"countReply"` // 用户回复数量
  607 + CountUserLove int `json:"countUserLove"` // 用户点赞数量
597 } 608 }
598 609
599 type MiniBeLikedRequest struct { 610 type MiniBeLikedRequest struct {
@@ -635,9 +646,10 @@ type UserStatisticsRequest struct { @@ -635,9 +646,10 @@ type UserStatisticsRequest struct {
635 } 646 }
636 647
637 type UserStatisticsResponse struct { 648 type UserStatisticsResponse struct {
638 - TotalArticle int `json:"totalArticle"`  
639 - TotalComment int `json:"totalComment"`  
640 - TotalLoved int `json:"totalLoved"` 649 + TotalArticle int `json:"totalArticle"` // 累计发布文章
  650 + TotalComment int `json:"totalComment"` // 累计发布评论
  651 + TotalLoved int `json:"totalLoved"` // 累计赞别人
  652 + TotalBeLoved int `json:"totalBeLoved"` // 累计收到的赞
641 } 653 }
642 654
643 type StatisticsItem struct { 655 type StatisticsItem struct {
@@ -16,10 +16,9 @@ type MessageBusiness struct { @@ -16,10 +16,9 @@ type MessageBusiness struct {
16 CompanyId int64 `json:"companyId"` // 操作人公司ID 16 CompanyId int64 `json:"companyId"` // 操作人公司ID
17 UserId int64 `json:"userId"` // 操作人用户ID 17 UserId int64 `json:"userId"` // 操作人用户ID
18 RecipientId int64 `json:"recipientId"` // 接收人用户ID 18 RecipientId int64 `json:"recipientId"` // 接收人用户ID
19 - ArticleId int64 `json:"articleId,omitempty"` // 文章ID  
20 - SectionId int64 `json:"sectionId,omitempty"` // 段落ID  
21 - CommentId int64 `json:"commentId,omitempty"` // 评论ID  
22 - Content string `json:"content,omitempty"` // 消息内容 19 + ArticleId int64 `json:"articleId"` // 文章ID
  20 + CommentId int64 `json:"commentId"` // 评论来源ID
  21 + CommentParentId int64 `json:"commentParentId"` // 评论上级ID
23 CreatedAt int64 `json:",omitempty"` 22 CreatedAt int64 `json:",omitempty"`
24 UpdatedAt int64 `json:",omitempty"` 23 UpdatedAt int64 `json:",omitempty"`
25 DeletedAt int64 `json:",omitempty"` 24 DeletedAt int64 `json:",omitempty"`
@@ -33,3 +33,5 @@ func (m *Company) Identify() interface{} { @@ -33,3 +33,5 @@ func (m *Company) Identify() interface{} {
33 } 33 }
34 return m.Id 34 return m.Id
35 } 35 }
  36 +
  37 +var DefaultCompanyLog = "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231114/object/1699934114_3r7QHThtbWfEDWh7CAHSzzWytFPzsjF6.png"
@@ -8,19 +8,20 @@ import ( @@ -8,19 +8,20 @@ import (
8 type MessageBusiness struct { 8 type MessageBusiness struct {
9 Id int64 // 唯一标识 9 Id int64 // 唯一标识
10 Type MsgBusinessType `json:"type"` // 分类 (1回复 2点赞 3被采纳) 10 Type MsgBusinessType `json:"type"` // 分类 (1回复 2点赞 3被采纳)
11 - OptType MsgBusinessOpt `json:"optType"` // 操作类型(1针对文章、2针对评论、3针对圆桌) 11 + OptType MsgBusinessOpt `json:"optType"` // 操作类型(1针对文章或段落、2针对评论、3针对圆桌)
12 CompanyId int64 `json:"companyId"` // 操作人公司ID 12 CompanyId int64 `json:"companyId"` // 操作人公司ID
13 UserId int64 `json:"userId"` // 操作人用户ID 13 UserId int64 `json:"userId"` // 操作人用户ID
14 RecipientId int64 `json:"recipientId"` // 接收人用户ID 14 RecipientId int64 `json:"recipientId"` // 接收人用户ID
15 ArticleId int64 `json:"articleId"` // 文章ID 15 ArticleId int64 `json:"articleId"` // 文章ID
16 - SectionId int64 `json:"sectionId"` // 段落ID  
17 - CommentId int64 `json:"commentId"` // 评论ID  
18 - Content string `json:"content"` // 消息内容 16 + CommentId int64 `json:"commentId"` // 评论来源ID
  17 + CommentParentId int64 `json:"commentParentId"` // 评论上级ID
19 CreatedAt int64 `json:",omitempty"` 18 CreatedAt int64 `json:",omitempty"`
20 UpdatedAt int64 `json:",omitempty"` 19 UpdatedAt int64 `json:",omitempty"`
21 DeletedAt int64 `json:",omitempty"` 20 DeletedAt int64 `json:",omitempty"`
22 Version int `json:",omitempty"` 21 Version int `json:",omitempty"`
23 22
  23 + //SectionId int64 `json:"sectionId"` // 段落ID
  24 + //Content string `json:"content"` // 消息内容
24 //DiscussionId int64 `json:"discussionId"` // 圆桌ID 25 //DiscussionId int64 `json:"discussionId"` // 圆桌ID
25 //DiscussionOpinionId int64 `json:"discussionOpinionId"` // 观点ID 26 //DiscussionOpinionId int64 `json:"discussionOpinionId"` // 观点ID
26 } 27 }
@@ -52,7 +52,7 @@ type Auth struct { @@ -52,7 +52,7 @@ type Auth struct {
52 } 52 }
53 53
54 var Auths = []Auth{ 54 var Auths = []Auth{
55 - NewAuth(1001, "邀请注册", "MINI_INVITE-REGISTRATION", 0), 55 + NewAuth(1001, "运营管理", "MINI_OPERATIONS-MANAGEMENT", 0),
56 NewAuth(1002, "帖子定性", "SYSTEM_POST-JUDGMENT", 0), 56 NewAuth(1002, "帖子定性", "SYSTEM_POST-JUDGMENT", 0),
57 //NewAuth(1003, "圆桌判定", "SYSTEM_STUDENT-MANAGE", 0), 57 //NewAuth(1003, "圆桌判定", "SYSTEM_STUDENT-MANAGE", 0),
58 //NewAuth(1004, "圆桌运营", "SYSTEM_FEEDBACK-MANAGE", 0), 58 //NewAuth(1004, "圆桌运营", "SYSTEM_FEEDBACK-MANAGE", 0),
@@ -15,8 +15,8 @@ type UserLoveFlag struct { @@ -15,8 +15,8 @@ type UserLoveFlag struct {
15 CommentId int64 `json:"commentId"` // 点赞评论时,填评论id 15 CommentId int64 `json:"commentId"` // 点赞评论时,填评论id
16 CommentAuthor int64 `json:"commentAuthor"` // 评论的填写人 16 CommentAuthor int64 `json:"commentAuthor"` // 评论的填写人
17 ToUserId int64 `json:"toUserId"` // 点赞的接受人 17 ToUserId int64 `json:"toUserId"` // 点赞的接受人
18 - UserId int64 `json:"userId"` // 点赞的人  
19 - CompanyId int64 `json:"companyId"` // 18 + UserId int64 `json:"userId"` // 点赞人
  19 + CompanyId int64 `json:"companyId"` // 点赞人的公司
20 CreatedAt int64 `json:"createdAt,omitempty"` 20 CreatedAt int64 `json:"createdAt,omitempty"`
21 UpdatedAt int64 `json:"updatedAt,omitempty"` 21 UpdatedAt int64 `json:"updatedAt,omitempty"`
22 DeletedAt int64 `json:"deletedAt,omitempty"` 22 DeletedAt int64 `json:"deletedAt,omitempty"`
@@ -14,7 +14,7 @@ import ( @@ -14,7 +14,7 @@ import (
14 14
15 type Service struct { 15 type Service struct {
16 Timeout time.Duration 16 Timeout time.Duration
17 - host string 17 + Host string
18 Interceptor func(msg string) 18 Interceptor func(msg string)
19 ServiceName string 19 ServiceName string
20 service httpc.Service 20 service httpc.Service
@@ -25,7 +25,7 @@ func NewService(name string, host string, timeout time.Duration, opts ...httpc.O @@ -25,7 +25,7 @@ func NewService(name string, host string, timeout time.Duration, opts ...httpc.O
25 //client.Timeout = timeout 25 //client.Timeout = timeout
26 26
27 service := Service{ 27 service := Service{
28 - host: host, 28 + Host: host,
29 service: httpc.NewServiceWithClient(name, client, opts...), 29 service: httpc.NewServiceWithClient(name, client, opts...),
30 } 30 }
31 return service 31 return service
@@ -37,7 +37,7 @@ func (gateway Service) Do(ctx context.Context, url string, method string, val in @@ -37,7 +37,7 @@ func (gateway Service) Do(ctx context.Context, url string, method string, val in
37 begin = time.Now() 37 begin = time.Now()
38 body []byte 38 body []byte
39 ) 39 )
40 - response, err := gateway.service.Do(ctx, method, gateway.host+url, val) 40 + response, err := gateway.service.Do(ctx, method, gateway.Host+url, val)
41 defer func() { 41 defer func() {
42 jsonParam, _ := json.Marshal(val) 42 jsonParam, _ := json.Marshal(val)
43 jsonData, _ := json.Marshal(result) 43 jsonData, _ := json.Marshal(result)
@@ -45,7 +45,7 @@ func (gateway Service) Do(ctx context.Context, url string, method string, val in @@ -45,7 +45,7 @@ func (gateway Service) Do(ctx context.Context, url string, method string, val in
45 result = err.Error() 45 result = err.Error()
46 } 46 }
47 if gateway.Interceptor != nil { 47 if gateway.Interceptor != nil {
48 - gateway.Interceptor(fmt.Sprintf("【网关】%v | %v%v | %v : %v \n-->> %v \n<<-- %v", time.Since(begin), gateway.host, url, strings.ToUpper(method), 48 + gateway.Interceptor(fmt.Sprintf("【网关】%v | %v%v | %v : %v \n-->> %v \n<<-- %v", time.Since(begin), gateway.Host, url, strings.ToUpper(method),
49 result, 49 result,
50 string(jsonParam), 50 string(jsonParam),
51 string(jsonData), 51 string(jsonData),
@@ -84,6 +84,62 @@ func (gateway Service) Do(ctx context.Context, url string, method string, val in @@ -84,6 +84,62 @@ func (gateway Service) Do(ctx context.Context, url string, method string, val in
84 return nil 84 return nil
85 } 85 }
86 86
  87 +func (gateway Service) HandlerResponse(ctx context.Context, request *http.Request, response *http.Response, val, result interface{}) error {
  88 + var (
  89 + baseResponse = Response{}
  90 + begin = time.Now()
  91 + body []byte
  92 + err error
  93 + )
  94 + defer func() {
  95 + jsonParam, _ := json.Marshal(val)
  96 + jsonData, _ := json.Marshal(result)
  97 + if err != nil {
  98 + result = err.Error()
  99 + }
  100 + if gateway.Interceptor != nil {
  101 + gateway.Interceptor(fmt.Sprintf("【网关】%v | %v%v | %v : %v \n-->> %v \n<<-- %v", time.Since(begin), gateway.Host, request.URL.Path, request.Method,
  102 + result,
  103 + string(jsonParam),
  104 + string(jsonData),
  105 + ))
  106 + }
  107 + }()
  108 + if err != nil {
  109 + return err
  110 + }
  111 + if response.StatusCode != http.StatusOK {
  112 + return HttpError{
  113 + Base: Response{
  114 + Code: response.StatusCode,
  115 + Msg: response.Status,
  116 + },
  117 + }
  118 + }
  119 + body, err = Bytes(response)
  120 + if err != nil {
  121 + return err
  122 + }
  123 + if err = json.Unmarshal(body, &baseResponse); err != nil {
  124 + return err
  125 + }
  126 + if baseResponse.Code != 0 {
  127 + return HttpError{
  128 + Base: Response{
  129 + Code: baseResponse.Code,
  130 + Msg: baseResponse.Msg,
  131 + },
  132 + }
  133 + }
  134 + if err = mapping.UnmarshalJsonBytes(baseResponse.Data, result); err != nil {
  135 + return err
  136 + }
  137 + return nil
  138 +}
  139 +
  140 +func (gateway Service) GetService() httpc.Service {
  141 + return gateway.service
  142 +}
87 func Bytes(resp *http.Response) ([]byte, error) { 143 func Bytes(resp *http.Response) ([]byte, error) {
88 var body []byte 144 var body []byte
89 if resp.Body == nil { 145 if resp.Body == nil {
  1 +package openlib
  2 +
  3 +import (
  4 + "bytes"
  5 + "context"
  6 + "encoding/json"
  7 + "github.com/zeromicro/go-zero/core/mapping"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/gateway"
  9 + "io"
  10 + "io/ioutil"
  11 + "mime/multipart"
  12 + "net/http"
  13 + "net/url"
  14 +)
  15 +
  16 +type OpenApiService struct {
  17 + gateway.Service
  18 +}
  19 +
  20 +func (svc *OpenApiService) PutFile(ctx context.Context, request RequestPutFile) (*DataPutFile, error) {
  21 + var result DataPutFile
  22 + r, _ := buildRequest(ctx, http.MethodPost, svc.Host+"/v1/vod/putObject", request)
  23 + response, err := svc.GetService().DoRequest(r)
  24 + if err != nil {
  25 + return nil, err
  26 + }
  27 + if err := svc.HandlerResponse(ctx, r, response, nil, &result); err != nil {
  28 + return nil, err
  29 + }
  30 + return &result, nil
  31 +}
  32 +
  33 +func buildRequest(ctx context.Context, method, tmpUrl string, data any) (*http.Request, error) {
  34 + u, err := url.Parse(tmpUrl)
  35 + if err != nil {
  36 + return nil, err
  37 + }
  38 +
  39 + var val map[string]map[string]any
  40 + if data != nil {
  41 + val, err = mapping.Marshal(data)
  42 + if err != nil {
  43 + return nil, err
  44 + }
  45 + }
  46 +
  47 + var reader io.Reader
  48 + jsonVars, hasJsonBody := val["json"]
  49 + if hasJsonBody {
  50 + var buf bytes.Buffer
  51 + enc := json.NewEncoder(&buf)
  52 + if err := enc.Encode(jsonVars); err != nil {
  53 + return nil, err
  54 + }
  55 +
  56 + reader = &buf
  57 + }
  58 +
  59 + req, err := http.NewRequestWithContext(ctx, method, u.String(), reader)
  60 + if err != nil {
  61 + return nil, err
  62 + }
  63 + fileVars, hasFile := val["file"]
  64 + if hasFile {
  65 + if err = fillFile(req, fileVars); err != nil {
  66 + return nil, err
  67 + }
  68 + }
  69 + if hasJsonBody {
  70 + req.Header.Set("Content-Type", "application/json; charset=utf-8")
  71 + }
  72 +
  73 + return req, nil
  74 +}
  75 +
  76 +func fillFile(req *http.Request, val map[string]any) error {
  77 + if len(val) == 0 {
  78 + return nil
  79 + }
  80 + pr, pw := io.Pipe()
  81 + bodyWriter := multipart.NewWriter(pw)
  82 + go func() {
  83 + for k, v := range val {
  84 + fileWriter, err := bodyWriter.CreateFormFile(k, k)
  85 + if err != nil {
  86 + return
  87 + }
  88 + //fh, err := os.Open(v.(string))
  89 + //if err != nil {
  90 + // return err
  91 + //}
  92 + fh := bytes.NewBuffer(v.([]byte))
  93 + // iocopy
  94 + _, err = io.Copy(fileWriter, fh)
  95 + if err != nil {
  96 + return
  97 + }
  98 + }
  99 + bodyWriter.Close()
  100 + pw.Close()
  101 + }()
  102 + req.Header.Set("Content-Type", bodyWriter.FormDataContentType())
  103 + req.Body = ioutil.NopCloser(pr)
  104 + req.Header.Set("Transfer-Encoding", "chunked")
  105 + return nil
  106 +}
  1 +package openlib
  2 +
  3 +type (
  4 + RequestPutFile struct {
  5 + File []byte `file:"file.png"`
  6 + }
  7 + DataPutFile []*DataUploadItem
  8 +
  9 + DataUploadItem struct {
  10 + Host string `json:"host"`
  11 + Key string `json:"key"`
  12 + Path string `json:"path"`
  13 + FileName string `json:"fileName"`
  14 + }
  15 +)