sync: 同步 v1.0.4 并脱敏配置与镜像

This commit is contained in:
MiFaZhan
2026-10-29 14:36:49 +08:00
parent 743e8e6e6e
commit 2206a393f7
516 changed files with 18119 additions and 2253 deletions
+143 -27
View File
@@ -1,7 +1,7 @@
// Package gen
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package common
@@ -11,6 +11,7 @@ import (
"fmt"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/contexts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/exportcenter"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/websocket"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/xgorm/handler"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/xgorm/hook"
@@ -18,13 +19,11 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/convert"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/excel"
"strings"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
)
@@ -123,31 +122,32 @@ func (s *sCommonTMessageLog) List(ctx context.Context, in *model.TMessageLogList
return
}
// Export 导出消息日志
// Export 导出消息日志(异步:提交任务后到下载中心取文件)
func (s *sCommonTMessageLog) Export(ctx context.Context, in *model.TMessageLogListParam) (err error) {
list, totalCount, err := s.List(ctx, in)
if err != nil {
return
}
// 字段的排序是依据tags的字段顺序,如果你不想使用默认的排序方式,可以直接定义 tags = []string{"字段名称", "字段名称2", ...}
tags, err := convert.GetEntityDescTags(model.TMessageLogExportModel{})
if err != nil {
return
}
var (
fileName = "导出消息日志-" + gctx.CtxId(ctx)
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, (totalCount+in.PageSize-1)/in.PageSize, in.Page, len(list))
exports []model.TMessageLogExportModel
)
if err = gconv.Scan(list, &exports); err != nil {
return
}
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
return
_, err = exportcenter.Submit(ctx, &exportcenter.Request{
BizKey: "tMessageLog",
BizName: "消息日志",
PermCode: "cpm:common:tMessageLog:export",
QueryParam: in,
Tags: func() ([]string, error) {
return convert.GetEntityDescTags(model.TMessageLogListModel{})
},
Fetch: func(ctx context.Context, page, pageSize int) (rows []interface{}, total int, err error) {
query := *in
query.Page = page
query.PageSize = pageSize
list, count, err := s.List(ctx, &query)
if err != nil {
return nil, 0, err
}
rows = make([]interface{}, 0, len(list))
for _, item := range list {
rows = append(rows, item)
}
return rows, count, nil
},
})
return err
}
// Edit 修改/新增消息日志
@@ -321,3 +321,119 @@ func (s *sCommonTMessageLog) View(ctx context.Context, in *model.TMessageLogView
return
}
// 未读通知的默认与最大返回条数,避免一次拉取过多消息。
const (
messageUnreadDefaultLimit = 50
messageUnreadMaxLimit = 200
)
// unreadQuery 构造当前用户未读消息查询。
// 以用户消息表为准:只查本人的未读记录,关联消息日志排除已撤回消息,
// 消息日志已删除(关联为空)时也不提醒。
// 这里不按 send_user_type 过滤:收件人 user_id 全部来自 sys_user 单表,
// 该字段只表示消息面向哪个控制台,按其过滤会漏掉真正发给本人的消息。
func (s *sCommonTMessageLog) unreadQuery(ctx context.Context, userId int64) *gdb.Model {
var (
userTable = dao.TUserMessage.Table()
logTable = dao.TMessageLog.Table()
userColumns = dao.TUserMessage.Columns()
logColumns = dao.TMessageLog.Columns()
)
return dao.TUserMessage.Ctx(ctx).
LeftJoin(logTable+" ON "+logTable+"."+logColumns.MessageLogId+" = "+userTable+"."+userColumns.MessageLogId).
Where(userTable+"."+userColumns.UserId, userId).
Where(userTable+"."+userColumns.IsRead, 0).
Where(logTable+"."+logColumns.IsRecall, 0)
}
// UnreadList 获取当前登录用户的未读消息通知。
// 这是右上角消息提醒的数据来源:登录、刷新、断线重连后都必须重新拉取,
// 否则离线期间的消息会因错过 websocket 推送而不再出现提醒。
func (s *sCommonTMessageLog) UnreadList(ctx context.Context, in *model.TMessageLogUnreadListParam) (list []*model.TMessageLogUnreadListModel, totalCount int, err error) {
userId := contexts.GetUserId(ctx)
if userId <= 0 {
err = gerror.New("未获取到当前登录用户信息")
return
}
limit := messageUnreadDefaultLimit
if in != nil && in.Limit > 0 {
limit = in.Limit
}
if limit > messageUnreadMaxLimit {
limit = messageUnreadMaxLimit
}
var (
userTable = dao.TUserMessage.Table()
logTable = dao.TMessageLog.Table()
userColumn = dao.TUserMessage.Columns()
logColumn = dao.TMessageLog.Columns()
)
if err = s.unreadQuery(ctx, userId).
Fields(userTable + "." + userColumn.MessageLogId + "," +
logTable + "." + logColumn.MessageType + "," +
logTable + "." + logColumn.SendUserType + "," +
logTable + "." + logColumn.MessageTitle + "," +
logTable + "." + logColumn.MessageContent + "," +
logTable + "." + logColumn.MessageLink + "," +
logTable + "." + logColumn.SendTime + "," +
userTable + "." + userColumn.IsRead).
OrderDesc(userTable + "." + userColumn.MessageId).
Limit(limit).
Scan(&list); err != nil {
err = gerror.Wrap(err, "获取未读消息失败,请稍后重试!")
return
}
if list == nil {
list = []*model.TMessageLogUnreadListModel{}
}
// 总数不受列表条数上限影响,用于判断是否还有更多未读。
if totalCount, err = s.unreadQuery(ctx, userId).Count(); err != nil {
err = gerror.Wrap(err, "获取未读消息数量失败,请稍后重试!")
}
return
}
// Read 标记当前登录用户的指定消息为已读。
// 只允许操作本人的用户消息记录,避免越权修改他人已读状态。
func (s *sCommonTMessageLog) Read(ctx context.Context, in *model.TMessageLogReadParam) (err error) {
userId := contexts.GetUserId(ctx)
if userId <= 0 {
return gerror.New("未获取到当前登录用户信息")
}
if in == nil || in.MessageLogId <= 0 {
return gerror.New("消息ID不能为空")
}
if _, err = dao.TUserMessage.Ctx(ctx).Where(g.Map{
dao.TUserMessage.Columns().MessageLogId: in.MessageLogId,
dao.TUserMessage.Columns().UserId: userId,
}).Data(g.Map{
dao.TUserMessage.Columns().IsRead: 1,
dao.TUserMessage.Columns().UpdatedBy: userId,
dao.TUserMessage.Columns().UpdatedAt: gtime.Now(),
}).Update(); err != nil {
err = gerror.Wrap(err, "标记消息已读失败,请稍后重试!")
}
return
}
// ReadAll 标记当前登录用户的全部未读消息为已读。
func (s *sCommonTMessageLog) ReadAll(ctx context.Context, in *model.TMessageLogReadAllParam) (err error) {
userId := contexts.GetUserId(ctx)
if userId <= 0 {
return gerror.New("未获取到当前登录用户信息")
}
if _, err = dao.TUserMessage.Ctx(ctx).
Where(dao.TUserMessage.Columns().UserId, userId).
Where(dao.TUserMessage.Columns().IsRead, 0).
Data(g.Map{
dao.TUserMessage.Columns().IsRead: 1,
dao.TUserMessage.Columns().UpdatedBy: userId,
dao.TUserMessage.Columns().UpdatedAt: gtime.Now(),
}).Update(); err != nil {
err = gerror.Wrap(err, "标记全部消息已读失败,请稍后重试!")
}
return
}