Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+459
View File
@@ -0,0 +1,459 @@
package infmtctrl
import (
"encoding/json"
"sort"
"time"
"91porn-server/common"
"91porn-server/common/constant"
"91porn-server/common/stderr"
"91porn-server/models/commod"
"91porn-server/models/l/operatorlgmod"
"91porn-server/models/v/noticefmtmod"
"91porn-server/web/service/infmtser"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type Sender = noticefmtmod.Sender
type Receiver = noticefmtmod.Receiver
type NoticeType = noticefmtmod.NoticeType
type UIDSlice = noticefmtmod.UIDSlice
type TimeUnit = noticefmtmod.TimeUnit
type TimeSlice = noticefmtmod.TimeSlice
type ObjectID = primitive.ObjectID
type RegularNotice = noticefmtmod.RegularNotice
type PlanNotice = noticefmtmod.PlanNotice
type SpecifyNotice = noticefmtmod.SpecifyNotice
type MailNotice = noticefmtmod.MailNotice
type AfterRegistNotice = noticefmtmod.AfterRegistNotice
// NoticeList doc
// @Summary 通知列表
// @Description 通知列表
// @Tags web-Notice
// @Accept mpfd,json
// @Produce json,html
// @Param noticeCode query string false "通知码"
// @Param title query string false "标题"
// @Param noticeType query string false "通知类型"
// @Param sender query string false "发送者"
// @Param receiver query string false "接受者"
// @Param enable query bool false "开关"
// @Param pageNumber query int true "当前页"
// @Param pageSize query int true "每页条数"
// @Success 200 {string} json "{"msg": "操作成功", "date": { "total":10, "list":[] }}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /web/infmt/notice/list [get]
func NoticeList(c *gin.Context) {
type Query struct {
NoticeCode *string `form:"noticeCode" json:"noticeCode" binding:""` //通知码 唯一标记不同的通知计划,可代替_id,方便复制数据
Title *string `form:"title" json:"title" binding:""` //标题
NoticeType *NoticeType `form:"noticeType" json:"noticeType" binding:""` //通知类型
Sender *Sender `form:"sender" json:"sender" binding:""` //发送者
Receiver *Receiver `form:"receiver" json:"receiver" binding:""` //接受者
Enable *bool `form:"enable" json:"enable" binding:""` //开关
}
var arg struct {
commod.Page
Query
}
if err := c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "infmtctrl NoticeList arg error "+err.Error())
return
}
titleMatch := infmtser.TitleMatch{Title: arg.Title}
noticeCodeMatch := infmtser.NoticeCodeMatch{NoticeCode: arg.NoticeCode}
noticeTypeMatch := infmtser.NoticeTypeMatch{NoticeType: arg.NoticeType}
senderMatch := infmtser.SenderMatch{Sender: arg.Sender}
receiverMatch := infmtser.ReceiverMatch{Receiver: arg.Receiver}
enableMatch := infmtser.EnableMatch{Enable: arg.Enable}
skip := int64((arg.PageNumber - 1) * arg.PageSize)
limit := int64(arg.PageSize)
page, err := infmtser.NoticePages(skip, limit, titleMatch, noticeCodeMatch, noticeTypeMatch, senderMatch, receiverMatch, enableMatch)
if err != nil {
common.ServeJSON(c, stderr.Failure, "web infmtctrl NoticeList error: "+err.Error())
return
}
common.ServeJSON(c, stderr.Success, page)
}
// NoticeUpdate doc
// @Summary 编辑通知
// @Description 编辑通知
// @Tags web-Notice
// @Accept mpfd,json
// @Produce json,html
// @Param ID formData string true "id"
// @Param title query string false "标题"
// @Param sender query string false "发送者"
// @Param receiver query string false "接受者"
// @Param enable query bool false "开关"
// @Param uidList query array false "用户列表"
// @Param content query string false "内容"
// @Param remark query string false "备注"
// @Param noticeType query string false "通知类型"
// @Param startAt query string false "开始时间"
// @Param timeUnit query string false "单位 分钟/小时/天/周"
// @Param timeCount query int false "量"
// @Param endAt query string false "结束时间"
// @Param planCount query int false "执行次数"
// @Param specifyTimeList query array false "指定执行时间数组"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /web/infmt/notice/update [post]
func NoticeUpdate(c *gin.Context) {
manager, err := common.GetAdminAct(c)
if err != nil {
common.ServeJSON(c, stderr.AdminIDErr, err.Error())
return
}
type NoticeFMT struct {
StartAt *time.Time `form:"startAt" json:"startAt" binding:""` //开始时间
TimeUnit *TimeUnit `form:"timeUnit" json:"timeUnit" binding:""` //单位 分钟/小时/天/周
TimeCount *int64 `form:"timeCount" json:"timeCount" binding:""` //量
EndAt *time.Time `form:"endAt" json:"endAt" binding:""` //结束时间
PlanCount *int64 `form:"planCount" json:"planCount" binding:""` //执行次数
SpecifyTimeList TimeSlice `form:"specifyTimeList" json:"specifyTimeList" binding:""` //指定执行时间数组
}
type Update struct {
Title *string `form:"title" json:"title" binding:""` //标题
Sender *Sender `form:"sender" json:"sender" binding:""` //发送者
Receiver *Receiver `form:"receiver" json:"receiver" binding:""` //接受者
Enable *bool `form:"enable" json:"enable" binding:""` //开关
UIDList UIDSlice `form:"uidList" json:"uidList" binding:""` //用户列表
Content *string `form:"content" json:"content" binding:""` //内容
Remark *string `form:"remark" json:"remark" binding:""` //备注
NoticeType *NoticeType `form:"noticeType" json:"noticeType" binding:""` //通知类型
NoticeFMT
}
var arg struct {
ID ObjectID `form:"id" json:"id" binding:"required"`
Update
}
if err = c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "web infmtctrl NoticeUpdate arg error "+err.Error())
return
}
updateDoc := noticefmtmod.UpdateDoc{
Sender: arg.Sender,
Receiver: arg.Receiver,
UIDList: arg.UIDList,
Title: arg.Title,
Content: arg.Content,
Enable: arg.Enable,
Remark: arg.Remark,
NoticeType: arg.NoticeType,
}
if arg.NoticeType != nil {
switch *arg.NoticeType {
case noticefmtmod.RegularNoticeType:
updateDoc.RegularNotice = RegularNotice{
StartAt: arg.StartAt,
TimeUnit: arg.TimeUnit,
TimeCount: arg.TimeCount,
}
case noticefmtmod.PlanNoticeType:
updateDoc.PlanNotice = PlanNotice{
StartAt: arg.StartAt,
EndAt: arg.EndAt,
PlanCount: arg.PlanCount,
}
case noticefmtmod.SpecifyNoticeType:
updateDoc.SpecifyNotice = SpecifyNotice{
SpecifyTimeList: arg.SpecifyTimeList,
}
case noticefmtmod.AfterRegistNoticeType:
updateDoc.AfterRegistNotice = AfterRegistNotice{
TimeUnit: arg.TimeUnit,
TimeCount: arg.TimeCount,
}
}
}
if err = noticefmtmod.UpdateOne(arg.ID, updateDoc); err != nil {
common.ServeJSON(c, stderr.ErrDbUpdateError, "web infmtctrl NoticeUpdate error: "+err.Error())
return
}
log, _ := json.Marshal(arg)
_ = operatorlgmod.RecordOperation(manager, constant.UserManageList, constant.Modify, string(log), c.Request.URL.RequestURI())
common.ServeJSON(c, stderr.Success, "")
}
// NoticeAdd doc
// @Summary 添加通知
// @Description 添加通知
// @Tags web-Notice
// @Accept mpfd,json
// @Produce json,html
// @Param noticeType query string true "通知类型"
// @Param title query string true "标题"
// @Param sender query string true "发送者"
// @Param receiver query string true "接受者"
// @Param enable query bool true "开关"
// @Param uidList query array false "用户列表"
// @Param content query string false "内容"
// @Param remark query string false "备注"
// @Param startAt query string false "开始时间"
// @Param timeUnit query string false "单位 分钟/小时/天/周"
// @Param timeCount query int false "量"
// @Param endAt query string false "结束时间"
// @Param planCount query int false "执行次数"
// @Param specifyTimeList query array false "指定执行时间数组"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /web/infmt/notice/add [post]
func NoticeAdd(c *gin.Context) {
manager, err := common.GetAdminAct(c)
if err != nil {
common.ServeJSON(c, stderr.AdminIDErr, err.Error())
return
}
type NoticeFMT struct {
StartAt *time.Time `form:"startAt" json:"startAt" binding:""` //开始时间
TimeUnit *TimeUnit `form:"timeUnit" json:"timeUnit" binding:""` //单位 分钟/小时/天/周
TimeCount *int64 `form:"timeCount" json:"timeCount" binding:""` //量
EndAt *time.Time `form:"endAt" json:"endAt" binding:""` //结束时间
PlanCount *int64 `form:"planCount" json:"planCount" binding:""` //执行次数
SpecifyTimeList TimeSlice `form:"specifyTimeList" json:"specifyTimeList" binding:""` //指定执行时间数组
}
type Insert struct {
NoticeType NoticeType `form:"noticeType" json:"noticeType" binding:"required"` //通知类型
Title string `form:"title" json:"title" binding:"required"` //标题
Sender Sender `form:"sender" json:"sender" binding:"required"` //发送者
Receiver Receiver `form:"receiver" json:"receiver" binding:"required"` //接受者
Enable *bool `form:"enable" json:"enable" binding:"required"` //开关
UIDList UIDSlice `form:"uidList" json:"uidList" binding:""` //用户列表
Content *string `form:"content" json:"content" binding:""` //内容
Remark *string `form:"remark" json:"remark" binding:""` //备注
NoticeFMT
}
var arg struct {
Insert
}
if err = c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "web infmtctrl NoticeAdd arg error "+err.Error())
return
}
insertDoc := noticefmtmod.InsertDoc{
Sender: arg.Sender,
Receiver: arg.Receiver,
UIDList: arg.UIDList,
Title: arg.Title,
NoticeType: arg.NoticeType,
Enable: *arg.Enable,
}
insertDoc.NoticeCode = common.UUID()
if arg.Content != nil {
insertDoc.Content = *arg.Content
}
if arg.Remark != nil {
insertDoc.Remark = *arg.Remark
}
switch arg.NoticeType {
case noticefmtmod.RegularNoticeType:
insertDoc.RegularNotice = RegularNotice{
StartAt: arg.StartAt,
TimeUnit: arg.TimeUnit,
TimeCount: arg.TimeCount,
}
case noticefmtmod.PlanNoticeType:
insertDoc.PlanNotice = PlanNotice{
StartAt: arg.StartAt,
EndAt: arg.EndAt,
PlanCount: arg.PlanCount,
}
case noticefmtmod.SpecifyNoticeType:
insertDoc.SpecifyNotice = SpecifyNotice{
SpecifyTimeList: arg.SpecifyTimeList,
}
case noticefmtmod.AfterRegistNoticeType:
insertDoc.AfterRegistNotice = AfterRegistNotice{
TimeUnit: arg.TimeUnit,
TimeCount: arg.TimeCount,
}
}
sort.Sort(insertDoc.UIDList)
if err = noticefmtmod.InsertOne(insertDoc); err != nil {
common.ServeJSON(c, stderr.ErrDbInsertError, "web infmtctrl NoticeAdd InsertOne error: "+err.Error())
return
}
log, _ := json.Marshal(arg)
_ = operatorlgmod.RecordOperation(manager, constant.UserManageList, constant.Add, string(log), c.Request.URL.RequestURI())
common.ServeJSON(c, stderr.Success, "")
}
// NoticeDel doc
// @Summary 删除通知
// @Description 删除通知
// @Tags web-Notice
// @Accept mpfd,json
// @Produce json,html
// @Param ID formData string true "id"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /web/infmt/notice/delete [delete]
func NoticeDel(c *gin.Context) {
manager, err := common.GetAdminAct(c)
if err != nil {
common.ServeJSON(c, stderr.AdminIDErr, err.Error())
return
}
var arg struct {
ID ObjectID `form:"id" json:"id" binding:"required"`
}
if err = c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "web infmtctrl NoticeDel arg error "+err.Error())
return
}
if err = noticefmtmod.DeleteOne(arg.ID); err != nil {
common.ServeJSON(c, stderr.ErrDbDeleteError, "web infmtctrl NoticeDel DeleteOne error: "+err.Error())
return
}
log, _ := json.Marshal(arg)
_ = operatorlgmod.RecordOperation(manager, constant.UserManageList, constant.Delete, string(log), c.Request.URL.RequestURI())
common.ServeJSON(c, stderr.Success, "")
}
// MailList doc
// @Summary 邮件通知列表
// @Description 邮件通知列表
// @Tags web-Mail
// @Accept mpfd,json
// @Produce json,html
// @Param noticeCode query string false "通知码"
// @Param title query string false "标题"
// @Param receiver query string false "接受者"
// @Param pageNumber query int true "当前页"
// @Param pageSize query int true "每页条数"
// @Success 200 {string} json "{"msg": "操作成功", "date": { "total":10, "list":[] }}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /web/infmt/mail/list [get]
func MailList(c *gin.Context) {
type Query struct {
NoticeCode *string `form:"noticeCode" json:"noticeCode" binding:""` //通知码 唯一标记不同的通知计划,可代替_id,方便复制数据
Title *string `form:"title" json:"title" binding:""` //标题
Receiver *Receiver `form:"receiver" json:"receiver" binding:""` //接受者
}
var arg struct {
commod.Page
Query
}
if err := c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "infmtctrl MailList arg error "+err.Error())
return
}
titleMatch := infmtser.TitleMatch{Title: arg.Title}
noticeCodeMatch := infmtser.NoticeCodeMatch{NoticeCode: arg.NoticeCode}
receiverMatch := infmtser.ReceiverMatch{Receiver: arg.Receiver}
skip := int64((arg.PageNumber - 1) * arg.PageSize)
limit := int64(arg.PageSize)
page, err := infmtser.MailPages(skip, limit, titleMatch, noticeCodeMatch, receiverMatch)
if err != nil {
common.ServeJSON(c, stderr.Failure, "web infmtctrl MailList error: "+err.Error())
return
}
common.ServeJSON(c, stderr.Success, page)
}
// MailAdd doc
// @Summary 添加邮件
// @Description 添加邮件
// @Tags web-Mail
// @Accept mpfd,json
// @Produce json,html
// @Param title query string true "标题"
// @Param receiver query string true "接受者"
// @Param content query string true "内容"
// @Param uidList query array false "用户列表"
// @Param remark query string false "备注"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /web/infmt/mail/add [post]
func MailAdd(c *gin.Context) {
manager, err := common.GetAdminAct(c)
if err != nil {
common.ServeJSON(c, stderr.AdminIDErr, err.Error())
return
}
type Insert struct {
Title string `form:"title" json:"title" binding:"required"` //标题
Receiver Receiver `form:"receiver" json:"receiver" binding:"required"` //接受者
Content string `form:"content" json:"content" binding:"required"` //内容
UIDList UIDSlice `form:"uidList" json:"uidList" binding:""` //用户列表
Remark *string `form:"remark" json:"remark" binding:""` //备注
}
var arg struct {
Insert
}
if err = c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "web infmtctrl NoticeAdd arg error "+err.Error())
return
}
sendAt := time.Now()
insertDoc := noticefmtmod.InsertDoc{
NoticeCode: common.UUID(),
NoticeType: noticefmtmod.MailNoticeType,
Sender: noticefmtmod.System,
Enable: true,
Receiver: arg.Receiver,
UIDList: arg.UIDList,
Title: arg.Title,
Content: arg.Content,
MailNotice: MailNotice{SendAt: &sendAt},
}
if arg.Remark != nil {
insertDoc.Remark = *arg.Remark
}
if err = noticefmtmod.InsertOne(insertDoc); err != nil {
common.ServeJSON(c, stderr.ErrDbInsertError, "web infmtctrl MailAdd InsertOne error: "+err.Error())
return
}
log, _ := json.Marshal(arg)
_ = operatorlgmod.RecordOperation(manager, constant.UserManageList, constant.Add, string(log), c.Request.URL.RequestURI())
common.ServeJSON(c, stderr.Success, "")
}
// MailDel doc
// @Summary 删除邮件通知
// @Description 删除邮件通知
// @Tags web-Mail
// @Accept mpfd,json
// @Produce json,html
// @Param ID formData string true "id"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /web/infmt/mail/delete [delete]
func MailDel(c *gin.Context) {
manager, err := common.GetAdminAct(c)
if err != nil {
common.ServeJSON(c, stderr.AdminIDErr, err.Error())
return
}
var arg struct {
ID ObjectID `form:"id" json:"id" binding:"required"`
}
if err = c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "web infmtctrl MailDel arg error "+err.Error())
return
}
if err = noticefmtmod.DeleteOne(arg.ID); err != nil {
common.ServeJSON(c, stderr.ErrDbDeleteError, "web infmtctrl MailDel DeleteOne error: "+err.Error())
return
}
log, _ := json.Marshal(arg)
_ = operatorlgmod.RecordOperation(manager, constant.UserManageList, constant.Delete, string(log), c.Request.URL.RequestURI())
common.ServeJSON(c, stderr.Success, "")
}