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
+325
View File
@@ -0,0 +1,325 @@
package aiplazaser
import (
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models/cache/aiplazadata"
"91porn-server/models/commod"
"91porn-server/models/v/aiUnDressmod"
"91porn-server/models/v/aichangefaceimgmod"
"91porn-server/models/v/aichangefacemod"
"91porn-server/models/v/aiimagetovideomod"
"91porn-server/models/v/aiplazamod"
"91porn-server/models/v/aitexttoimagemod"
"fmt"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/bson"
)
type AppQueryListReq struct {
Type *int `json:"type" form:"type"` // 1-ai图片换脸 2-ai视频换脸 3-ai脱衣 4-ai图生视频 5-ai绘画 不传则查看全部
SortType int `json:"sortType" form:"sortType"` // 1-推荐 2-最新上架 3-最多观看 4-最多收藏
commod.Page
}
type AppListRes struct {
Total int64 `json:"total"`
HasNext bool `json:"hasNext"`
List []*aiplazamod.AiPlazaInfo `json:"list"`
}
// GetList 获取列表
func (p *AppQueryListReq) GetList() AppListRes {
var res AppListRes
var err error
filter := bson.M{
"status": 1,
}
if p.Type != nil {
filter["type"] = p.Type
}
sort := bson.D{{"reviewAt", -1}}
switch p.SortType {
case 2:
// 最新上架
sort = bson.D{{"reviewAt", -1}}
case 3:
// 最多观看
sort = bson.D{{"viewCount", -1}, {"reviewAt", -1}}
case 4:
// 最多收藏
sort = bson.D{{"collectCount", -1}, {"reviewAt", -1}}
default: // 1
// 推荐
//filter["reviewAt"] = bson.M{"$gt": carbon.NewCarbon().StartOfDay().SubDays(30).StdTime()}
sort = bson.D{{"sortCode", -1}, {"reviewAt", -1}}
}
// 获取列表
var data []aiplazamod.AiPlaza
data, res.Total, res.HasNext, err = aiplazadata.GetListFromCache(filter, int64(p.Skip()), int64(p.Limit()), sort)
if err != nil {
log.Error("获取ai广场帖子列表数据错误", log.Any("Params", *p), log.E(err))
return res
}
res.List = aiplazadata.FormatAppDataList(data)
return res
}
type AppQueryInfoReq struct {
ID string `json:"id" form:"id"` // id
}
type AppQueryInfoResp struct {
Detail *aiplazamod.AiPlazaInfo
}
// GetInfo 获取详情
func (p *AppQueryInfoReq) GetInfo(uid uint64) (res AppQueryInfoResp, err error) {
oid, err := primitive.ObjectIDFromHex(p.ID)
if err != nil {
return res, err
}
var item aiplazamod.AiPlaza
item, err = aiplazadata.GetInfoFromCache(oid)
if err != nil {
log.Error("获取ai广场帖子详情数据错误", log.Any("ID", p.ID), log.E(err))
return
}
res.Detail = aiplazadata.FormatAppData(uid, item)
return
}
type ShareReq struct {
Type int `json:"type" form:"type" binding:"required"` // 1-ai图片换脸 2-ai视频换脸 3-ai脱衣 4-ai图生视频 5-ai绘画
OrderId primitive.ObjectID `json:"orderId" form:"orderId" binding:"required"`
Title string `json:"title" form:"title"`
}
// Create 发布数据
func (p *ShareReq) Create(uid uint64) error {
// 根据类型获取订单
switch p.Type {
case 1:
// ai图片换脸
return p.shareAiImageChangeFace(uid)
case 2:
// ai视频换脸
return p.shareAiVideoChangeFace(uid)
case 3:
// ai脱衣
return p.shareAiUndress(uid)
case 4:
// ai图生视频
return p.shareAiImageToVideo(uid)
case 5:
// ai绘画
return p.shareAiTextToImage(uid)
default:
// 其他类型的不处理
return nil
}
}
func (p *ShareReq) shareAiImageChangeFace(uid uint64) (err error) {
// ai图片换脸
aichangeFaceInfo, err := aichangefaceimgmod.FindByID(nil, p.OrderId)
if aichangeFaceInfo == nil && err != nil {
return stderr.ErrDbQueryError
}
if aichangeFaceInfo.UID != uid || aichangeFaceInfo.Status != aichangefaceimgmod.SUCCESS {
return stderr.ErrDbQueryError
}
// 修改状态
if err = aichangefaceimgmod.Update(nil, p.OrderId, bson.M{
"shareStatus": 1,
"shareTitle": p.Title,
}); err != nil {
return stderr.ErrDbUpdateError
}
// 新增一个分享
alPlaza := aiplazamod.AiPlaza{
Type: 1,
OrderId: aichangeFaceInfo.ID,
Template: aichangeFaceInfo.MId,
Uid: aichangeFaceInfo.UID,
Title: p.Title,
OriginalImage: aichangeFaceInfo.ModPic,
OriginalVideo: "",
OriginContent: "",
GenerateVideo: "",
Status: aiplazamod.DefaultStatus,
}
if len(aichangeFaceInfo.NewPic) > 0 {
alPlaza.GenerateImage = aichangeFaceInfo.NewPic[0]
}
_, err = aiplazamod.Insert(nil, alPlaza)
if err != nil {
log.Error("新增ai广场帖子失败", log.Any("alPlaza", alPlaza), log.E(err))
return
}
return
}
func (p *ShareReq) shareAiVideoChangeFace(uid uint64) (err error) {
//查询该笔订单是否存在
aichangeFaceInfo, err := aichangefacemod.FindByID(nil, p.OrderId)
if aichangeFaceInfo == nil && err != nil {
return stderr.ErrDbQueryError
}
if aichangeFaceInfo.Uid != uid || aichangeFaceInfo.Status != aichangefacemod.StatusComplete {
return stderr.ErrDbQueryError
}
if err = aichangefacemod.Update(nil, p.OrderId, bson.M{"$set": bson.M{
"shareStatus": 1,
"shareTitle": p.Title,
}}); err != nil {
return stderr.ErrDbUpdateError
}
// 新增一个分享
alPlaza := aiplazamod.AiPlaza{
Type: 2,
OrderId: aichangeFaceInfo.ID,
Template: aichangeFaceInfo.VidID.Hex(),
Uid: aichangeFaceInfo.Uid,
Title: p.Title,
OriginalImage: "",
OriginalVideo: aichangeFaceInfo.ModVideo,
OriginalVideoCover: aichangeFaceInfo.ModCover,
OriginContent: "",
GenerateVideo: aichangeFaceInfo.Url,
Status: aiplazamod.DefaultStatus,
}
if len(aichangeFaceInfo.Pic) > 0 {
alPlaza.GenerateVideoCover = aichangeFaceInfo.Pic[0]
}
_, err = aiplazamod.Insert(nil, alPlaza)
if err != nil {
log.Error("新增ai广场帖子失败", log.Any("alPlaza", alPlaza), log.E(err))
return
}
return
}
func (p *ShareReq) shareAiUndress(uid uint64) (err error) {
data, err := aiUnDressmod.FindDataByID(p.OrderId.Hex())
if err != nil {
return stderr.ErrDbQueryError
}
if data.UID != uid || data.Status != aiUnDressmod.SUCCESS {
return stderr.ErrDbQueryError
}
// 修改订单状态
if err = aiUnDressmod.Edit(nil, bson.M{"_id": p.OrderId}, bson.M{"$set": bson.M{
"shareStatus": 1,
"shareTitle": p.Title,
}}); err != nil {
log.Error(fmt.Sprintf("Handle AiUnDress CallBackOrder aiUnDressmod.Edit error:%+v:", err), log.Any("uid", uid))
return stderr.ErrDbUpdateError
}
// 新增一个分享
alPlaza := aiplazamod.AiPlaza{
Type: 3,
OrderId: data.ID,
Template: "",
Uid: data.UID,
Title: p.Title,
OriginalImage: data.OriginPic,
OriginalVideo: "",
OriginContent: "",
//GenerateImage: data.NewPic[0],
GenerateVideo: "",
Status: aiplazamod.DefaultStatus,
}
if len(data.NewPic) > 0 {
alPlaza.GenerateImage = data.NewPic[0]
}
_, err = aiplazamod.Insert(nil, alPlaza)
if err != nil {
log.Error("新增ai广场帖子失败", log.Any("alPlaza", alPlaza), log.E(err))
return
}
return
}
func (p *ShareReq) shareAiImageToVideo(uid uint64) (err error) {
// 查询该笔订单是否存在
data, err := aiimagetovideomod.GetInfo(p.OrderId)
if err != nil {
return stderr.ErrDbQueryError
}
if data.UID != uid || data.Status != int(aiimagetovideomod.StatusGenerationSuccess) {
return stderr.ErrDbQueryError
}
// 修改订单状态
if _, err = aiimagetovideomod.UpdateByID(nil, p.OrderId, bson.M{
"shareStatus": 1,
"shareTitle": p.Title,
}); err != nil {
return stderr.ErrDbUpdateError
}
// 新增一个分享
alPlaza := aiplazamod.AiPlaza{
Type: 4,
OrderId: data.ID,
Template: "",
Uid: data.UID,
Title: p.Title,
OriginalImage: data.ImgUrl,
OriginalVideo: "",
OriginContent: "",
GenerateImage: data.NewImgUrl,
GenerateVideo: "",
Status: aiplazamod.DefaultStatus,
}
_, err = aiplazamod.Insert(nil, alPlaza)
if err != nil {
log.Error("新增ai广场帖子失败", log.Any("alPlaza", alPlaza), log.E(err))
return
}
return
}
func (p *ShareReq) shareAiTextToImage(uid uint64) (err error) {
// 查询该笔订单是否存在
data, err := aitexttoimagemod.GetInfo(p.OrderId)
if err != nil {
return stderr.ErrDbQueryError
}
if data.UID != uid || data.Status != int(aitexttoimagemod.StatusGenerationSuccess) {
return stderr.ErrDbQueryError
}
// 修改订单状态
if _, err = aitexttoimagemod.UpdateByID(nil, p.OrderId, bson.M{
"shareStatus": 1,
"shareTitle": p.Title,
}); err != nil {
return stderr.ErrDbUpdateError
}
// 新增一个分享
alPlaza := aiplazamod.AiPlaza{
Type: 5,
OrderId: data.ID,
Template: "",
Uid: data.UID,
Title: p.Title,
OriginalImage: "",
OriginalVideo: "",
OriginContent: data.Text,
GenerateImage: data.NewImgUrl,
GenerateVideo: "",
Status: aiplazamod.DefaultStatus,
}
_, err = aiplazamod.Insert(nil, alPlaza)
if err != nil {
log.Error("新增ai广场帖子失败", log.Any("alPlaza", alPlaza), log.E(err))
return
}
return
}