作者 郑周

Merge remote-tracking branch 'origin/dev' into dev

... ... @@ -18,9 +18,17 @@ service Core {
@handler commonSmsCode
post /common/sms/code (CommonSmsCodeRequest) returns (CommonSmsCodeResposne)
@doc "微信二维码"
@handler miniQrcodeInvite
post /mini/qrcode (MiniQrCodeRequest)
@doc "日志查询"
@handler commonGetLog
get /log/:module
@doc "清理缓存"
@handler commonGetClearCache
get /clear
}
// 短信验证码
... ... @@ -31,4 +39,12 @@ type(
CommonSmsCodeResposne{
}
)
type(
MiniQrCodeRequest{
Page string `json:"page"` // 微信页面入口
Path string `json:"path"` //
Scene string `json:"scene"` // 参数
}
)
\ No newline at end of file
... ...
... ... @@ -34,6 +34,9 @@ service Core {
@doc "用户信息"
@handler miniUserInfo
post /mini/user/info (MiniUserInfoRequest) returns (MiniUserInfoResponse)
@doc "编辑用户信息"
@handler miniEditUserInfo
post /mini/user/info/edit (MiniEditUserInfoRequest) returns (MiniEditUserInfoResponse)
@doc "用户统计"
@handler miniUserStatistics
post /mini/user/statistics (UserStatisticsRequest) returns (UserStatisticsResponse)
... ... @@ -79,6 +82,15 @@ service Core {
}
type(
MiniEditUserInfoRequest{
Avatar *string `json:"avatar"`
}
MiniEditUserInfoResponse{
}
)
type(
MiniUserLoginRequest {
LoginType string `json:"loginType"` // 登录类型 wechat-login whchat-phone-login phone-password-login phone-smscode-login
WechatAuthCode string `json:"wechatAuthcode,optional"` // 微信登录 授权码
... ... @@ -342,9 +354,10 @@ type(
ItemFlag int `json:"itemFlag"` //0:默认查询所有 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳
}
UserStatisticsResponse{
TotalArticle int `json:"totalArticle"`
TotalComment int `json:"totalComment"`
TotalLoved int `json:"totalLoved"`
TotalArticle int `json:"totalArticle"` // 累计发布文章
TotalComment int `json:"totalComment"` // 累计发布评论
TotalLoved int `json:"totalLoved"` // 累计赞别人
TotalBeLoved int `json:"totalBeLoved"` // 累计收到的赞
}
StatisticsItem{
ItemFlag int `json:"itemFlag"` // 1:他的帖子 2:他的评论/回复 4:他收到的赞 8:TA的圆桌讨论 16:被采纳
... ...
package common
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/common"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
)
func CommonGetClearCacheHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
l := common.NewCommonGetClearCacheLogic(r.Context(), svcCtx)
err := l.CommonGetClearCache()
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.Ok(w)
}
}
}
... ...
package common
import (
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/common"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func MiniQrcodeInviteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.MiniQrCodeRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := common.NewMiniQrcodeInviteLogic(r.Context(), svcCtx)
resp, err := l.MiniQrcodeInvite(&req)
if err != nil {
result.HttpResult(r, w, resp, err)
}
w.Header().Set("Content-Disposition", "attachment; filename="+"qrcode.png")
w.Header().Set("Content-Type", "application/octet-stream")
w.Write(resp)
}
}
... ...
... ... @@ -27,10 +27,20 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Handler: common.CommonSmsCodeHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/mini/qrcode",
Handler: common.MiniQrcodeInviteHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/log/:module",
Handler: common.CommonGetLogHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/clear",
Handler: common.CommonGetClearCacheHandler(serverCtx),
},
},
rest.WithPrefix("/v1"),
)
... ... @@ -212,6 +222,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
},
{
Method: http.MethodPost,
Path: "/mini/user/info/edit",
Handler: user.MiniEditUserInfoHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/mini/user/statistics",
Handler: user.MiniUserStatisticsHandler(serverCtx),
},
... ...
package user
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/user"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
)
func MiniEditUserInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.MiniEditUserInfoRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := user.NewMiniEditUserInfoLogic(r.Context(), svcCtx)
resp, err := l.MiniEditUserInfo(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
... ...
... ... @@ -154,7 +154,7 @@ func (l *MiniCreateArticleLogic) MiniCreateArticle(req *types.MiniArticleCreateR
WhoRead: whoRead,
WhoReview: whoReview,
Location: domain.Location{
Longitude: req.Location.Latitude,
Longitude: req.Location.Longitude,
Latitude: req.Location.Latitude,
Descript: req.Location.Descript,
},
... ...
package common
import (
"context"
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"strings"
"github.com/zeromicro/go-zero/core/logx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
)
type CommonGetClearCacheLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewCommonGetClearCacheLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CommonGetClearCacheLogic {
return &CommonGetClearCacheLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *CommonGetClearCacheLogic) CommonGetClearCache() error {
var (
appName = l.svcCtx.Config.Name
success int
)
if strings.TrimSpace(appName) == "" {
return nil
}
keyPattern := fmt.Sprintf("%s*", appName)
list, err := l.svcCtx.Redis.Keys(keyPattern)
if err != nil {
return xerr.NewErrMsg(err.Error())
}
for _, key := range list {
if _, err = l.svcCtx.Redis.Del(key); err == nil {
success++
}
}
logx.Infof("清理缓存:%d/%d", success, len(list))
return nil
}
... ...
package common
import (
"context"
"github.com/samber/lo"
"github.com/silenceper/wechat/v2/miniprogram/qrcode"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type MiniQrcodeInviteLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewMiniQrcodeInviteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniQrcodeInviteLogic {
return &MiniQrcodeInviteLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *MiniQrcodeInviteLogic) MiniQrcodeInvite(req *types.MiniQrCodeRequest) (resp []byte, err error) {
q := l.svcCtx.MiniProgram.GetQRCode()
var data []byte
data, err = q.GetWXACodeUnlimit(qrcode.QRCoder{
Page: req.Page,
Path: req.Page,
Scene: req.Scene,
CheckPath: lo.ToPtr(false),
EnvVersion: "release",
})
if err != nil {
return nil, xerr.NewErr(err)
}
return data, nil
}
... ...
... ... @@ -57,6 +57,6 @@ func NewCompany(item *domain.Company) types.Company {
Id: item.Id,
Name: item.Name,
Code: item.Code,
Logo: item.Logo,
Logo: lo.Ternary(item.Logo != "", item.Logo, domain.DefaultCompanyLog),
}
}
... ...
package user
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"github.com/zeromicro/go-zero/core/logx"
)
type MiniEditUserInfoLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewMiniEditUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniEditUserInfoLogic {
return &MiniEditUserInfoLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *MiniEditUserInfoLogic) MiniEditUserInfo(req *types.MiniEditUserInfoRequest) (resp *types.MiniEditUserInfoResponse, err error) {
var (
conn = l.svcCtx.DefaultDBConn()
user *domain.User
userToken = contextdata.GetUserTokenFromCtx(l.ctx)
)
user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId)
if err != nil {
return nil, err
}
if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
user.Avatar = *req.Avatar
if user, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, user); err != nil {
return err
}
return nil
}, true); err != nil {
return nil, xerr.NewErrMsgErr("更新头像失败", err)
}
resp = &types.MiniEditUserInfoResponse{}
return
}
... ...
... ... @@ -52,6 +52,9 @@ func (l *SystemUserAccountSaveLogic) SystemUserAccountSave(req *types.SystemUser
if err != nil {
return nil, xerr.NewErrMsgErr("申请失败", err)
}
if user != nil {
return nil, xerr.NewErrMsgErr("用户手机号已存在", err)
}
if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
user = &domain.User{
CompanyId: company.Id,
... ...
... ... @@ -87,8 +87,12 @@ func (l *SystemUserInfoLogic) SystemUserInfo(req *types.SystemUserInfoRequest) (
company.Logo = response.CurrentCompany.Logo
changed = true
}
if company.Logo == "" {
company.Logo = domain.DefaultCompanyLog
changed = true
}
if changed {
if company, err = l.svcCtx.CompanyRepository.UpdateWithVersion(l.ctx, conn, company); err != nil {
if company, err = l.svcCtx.CompanyRepository.Update(l.ctx, conn, company); err != nil {
return nil, xerr.NewErrMsgErr("获取用户资料失败", err)
}
}
... ...
... ... @@ -35,6 +35,7 @@ func (l *SystemUserStatisticsLogic) SystemUserStatistics(req *types.UserStatisti
TotalArticle: s.TotalArticle,
TotalComment: s.TotalComment,
TotalLoved: s.TotalLoved,
TotalBeLoved: s.TotalBeLoved,
}
return
}
... ... @@ -57,8 +58,13 @@ func StatisticsItems(ctx context.Context, svcCtx *svc.ServiceContext, companyId,
}
if (itemFlag & TotalLoved) > 0 {
var total int64
total, _, _ = svcCtx.UserLoveFlagRepository.Find(ctx, conn, domain.IndexCompanyId(companyId)().WithCountOnly().MustWithKV("userId", userId))
s.TotalComment = int(total)
total, _, _ = svcCtx.UserLoveFlagRepository.Find(ctx, conn, domain.IndexCompanyId(0)().WithCountOnly().MustWithKV("userId", userId))
s.TotalLoved = int(total)
}
if (itemFlag & TotalBeLoved) > 0 {
var total int64
total, _, _ = svcCtx.UserLoveFlagRepository.Find(ctx, conn, domain.IndexCompanyId(0)().WithCountOnly().MustWithKV("toUserId", userId))
s.TotalBeLoved = int(total)
}
return
}
... ... @@ -67,12 +73,14 @@ type Statistics struct {
TotalArticle int `json:"totalArticle"`
TotalComment int `json:"totalComment"`
TotalLoved int `json:"totalLoved"`
TotalBeLoved int `json:"totalBeLoved"`
}
const (
TotalArticle = 1
TotalComment = 2
TotalLoved = 4
TotalArticle = 1 // 累计发布文章
TotalComment = 2 // 累计发布评论
TotalLoved = 4 // 累计赞别人
TotalBeLoved = 8 // 累计收到的赞
)
func NewStatisticsItem(itemFlag int, value float64) types.StatisticsItem {
... ...
package svc
import (
"github.com/silenceper/wechat/v2"
minicache "github.com/silenceper/wechat/v2/cache"
"github.com/silenceper/wechat/v2/miniprogram"
miniConfig "github.com/silenceper/wechat/v2/miniprogram/config"
"github.com/zeromicro/go-zero/core/stores/redis"
"github.com/zeromicro/go-zero/rest"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/config"
... ... @@ -44,6 +48,8 @@ type ServiceContext struct {
ApiAuthService authlib.ApiAuthService
SmsService smslib.SMSService
MiniProgram *miniprogram.MiniProgram
LoginStatusCheck rest.Middleware
LogRequest rest.Middleware
}
... ... @@ -57,6 +63,11 @@ func NewServiceContext(c config.Config) *ServiceContext {
apiAuth := authlib.ApiAuthService{
Service: gateway.NewService(c.ApiAuth.Name, c.ApiAuth.Host, c.ApiAuth.Timeout),
}
miniProgram := wechat.NewWechat().GetMiniProgram(&miniConfig.Config{
AppID: c.Wechat.AppID,
AppSecret: c.Wechat.AppSecret,
Cache: minicache.NewMemory(),
})
return &ServiceContext{
Config: c,
DB: db,
... ... @@ -65,6 +76,7 @@ func NewServiceContext(c config.Config) *ServiceContext {
SmsService: smslib.SMSService{Service: gateway.NewService("短信服务", "https://sms.fjmaimaimai.com:9897", time.Second*5)},
LoginStatusCheck: middleware.NewLoginStatusCheckMiddleware(apiAuth).Handle,
LogRequest: middleware.NewLogRequestMiddleware(c.LogRequest).Handle,
MiniProgram: miniProgram,
ArticleBackupRepository: repository.NewArticleBackupRepository(cache.NewCachedRepository(mlCache)),
ArticleCommentRepository: repository.NewArticleCommentRepository(cache.NewCachedRepository(mlCache)),
... ...
... ... @@ -8,6 +8,11 @@ type CommonSmsCodeRequest struct {
type CommonSmsCodeResposne struct {
}
type MiniQrCodeRequest struct {
Page string `json:"page"` // 微信页面入口
Scene string `json:"scene"` // 参数
}
type CommentAuthor struct {
Id int64 `json:"id"` // 人员id
Name string `json:"name"` // 人员的名字
... ... @@ -411,6 +416,13 @@ type TagOptionValue struct {
Value int64 `json:"value"` // 标签ID
}
type MiniEditUserInfoRequest struct {
Avatar *string `json:"avatar"`
}
type MiniEditUserInfoResponse struct {
}
type MiniUserLoginRequest struct {
LoginType string `json:"loginType"` // 登录类型 wechat-login whchat-phone-login phone-password-login phone-smscode-login
WechatAuthCode string `json:"wechatAuthcode,optional"` // 微信登录 授权码
... ... @@ -637,9 +649,10 @@ type UserStatisticsRequest struct {
}
type UserStatisticsResponse struct {
TotalArticle int `json:"totalArticle"`
TotalComment int `json:"totalComment"`
TotalLoved int `json:"totalLoved"`
TotalArticle int `json:"totalArticle"` // 累计发布文章
TotalComment int `json:"totalComment"` // 累计发布评论
TotalLoved int `json:"totalLoved"` // 累计赞别人
TotalBeLoved int `json:"totalBeLoved"` // 累计收到的赞
}
type StatisticsItem struct {
... ...
... ... @@ -33,3 +33,5 @@ func (m *Company) Identify() interface{} {
}
return m.Id
}
var DefaultCompanyLog = "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20231114/object/1699934114_3r7QHThtbWfEDWh7CAHSzzWytFPzsjF6.png"
... ...