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
+94
View File
@@ -0,0 +1,94 @@
package aichangefacemod
import (
"91porn-server/common/aiService"
"91porn-server/common/db"
"91porn-server/models"
"fmt"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var mdb *db.MongoDB
const table = models.AiChangeFace
func coll(t *db.MongoTool) *db.MongoTool {
if t == nil {
return mdb.Coll(table)
}
return t.Coll(table)
}
func Init() {
mdb = db.Init(table)
initIndex()
}
func initIndex() {
many := []mongo.IndexModel{
{
Keys: bson.D{{Key: "uid", Value: 1}},
},
}
if _, err := coll(nil).CreateIndex(many); err != nil {
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
}
}
func AddAiChangeFace(t *db.MongoTool, orderId primitive.ObjectID, orderCreatedAt time.Time, uid uint64, pic []string, vidMod aiService.Template, coin, incomeCoin int64, discount []primitive.ObjectID, shareTitle string, shareStatus int) error {
_, err := coll(t).InsertOne(AiChangeFace{
ID: orderId,
Uid: uid,
Pic: pic,
VidID: vidMod.ID,
ModTitle: vidMod.Title,
ModCover: vidMod.Cover,
ModVideo: vidMod.M3u8Url,
Coin: coin,
IncomeCoin: incomeCoin,
Discount: discount,
Status: StatusGenning,
IsHide: false,
Cover: "",
Url: "",
ShareTitle: shareTitle,
ShareStatus: shareStatus,
CreatedAt: orderCreatedAt,
UpdatedAt: orderCreatedAt,
})
return err
}
func ListByUid(uid uint64, status *AiChangeFaceStatus, skip, limit int) ([]AiChangeFace, error) {
var acfs []AiChangeFace
opts := options.Find().SetSort(bson.D{{Key: "createdAt", Value: -1}})
if skip > 0 {
opts.SetSkip(int64(skip))
}
if limit > 0 {
opts.SetLimit(int64(limit))
}
cond := bson.M{"uid": uid, "isHide": bson.M{"$in": []any{nil, false}}}
if status != nil {
cond["status"] = *status
if *status == StatusGenning {
cond["status"] = bson.M{"$in": []int{0, 2}}
}
}
return acfs, coll(nil).Find(&acfs, cond, opts)
}
func Hide(uid uint64, id primitive.ObjectID) error {
_, err := coll(nil).UpdateOne(bson.M{"uid": uid, "_id": id}, bson.M{"$set": bson.M{"isHide": true}})
return err
}
func FindByID(t *db.MongoTool, id primitive.ObjectID) (*AiChangeFace, error) {
var acf AiChangeFace
return &acf, coll(t).FindOne(&acf, bson.M{"_id": id})
}
+11
View File
@@ -0,0 +1,11 @@
package aichangefacemod
import "go.mongodb.org/mongo-driver/bson/primitive"
type GenerateRequest struct {
Pic []string `json:"picture"` // 换脸照片
VidModID primitive.ObjectID `json:"vidModId"` // 视频模版id
Discount []primitive.ObjectID `json:"discount"` // 使用折扣券
ShareTitle string `json:"shareTitle" bson:"shareTitle"` // 分享标题
ShareStatus int `json:"shareStatus" bson:"shareStatus"` // 是否分享 0-不分享 1-分享
}
+39
View File
@@ -0,0 +1,39 @@
package aichangefacemod
import (
"time"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type AiChangeFaceStatus int
const (
StatusGenning AiChangeFaceStatus = 0 // 未完成
StatusComplete AiChangeFaceStatus = 1 // 已完成
StatusRefund AiChangeFaceStatus = -1 // 已退款
StatusSubmit AiChangeFaceStatus = 2 // 已提交
)
type AiChangeFace struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Uid uint64 `json:"uid" bson:"uid"` // 用户
Pic []string `json:"picture" bson:"picture"` // 换脸照片
VidID primitive.ObjectID `json:"vidId" bson:"vidId"` // 视频模版id
ModTitle string `json:"modTitle" bson:"modTitle"` //模版标题
ModCover string `json:"modCover" bson:"modCover"` //模版封面
ModVideo string `json:"modVideo" bson:"modVideo"` //模版视频
Coin int64 `json:"coin" bson:"coin"` // 普通金币数
IncomeCoin int64 `json:"incomeCoin" bson:"imcomeCoin"` // 可提现金币数
Status AiChangeFaceStatus `json:"status" bson:"status"` // 0 未完成; 1 已完成; -1 已退款
Discount []primitive.ObjectID `json:"discount" bson:"discount"` // 抵扣券id
IsHide bool `json:"-" bson:"isHide"` // 是否被用户隐藏(用户订单列表是否不显示)
Cover string `json:"cover" bson:"cover"` // 换脸后封面大图
Url string `json:"url" bson:"url"` // 换脸后视频地址
Remark string `json:"remark" bson:"remark"` // 拒绝理由
ShareTitle string `json:"shareTitle" bson:"shareTitle"` // 分享标题
ShareStatus int `json:"shareStatus" bson:"shareStatus"` // 是否分享 0-不分享 1-分享
Operator string `json:"operator" bson:"operator"` // 操作员
CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 刷新时间
}
+115
View File
@@ -0,0 +1,115 @@
package aichangefacemod
import (
"91porn-server/common/db"
"91porn-server/models/commod"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
type AiChangeFaceWebResp struct {
ID primitive.ObjectID `json:"id"`
Uid uint64 `json:"uid"` // 用户
Pic []string `json:"picture"` // 换脸照片
ModId primitive.ObjectID `json:"modId"` // 视频模版id
ModUrl string `json:"modUrl"` // 视频模版播放地址url
ModTitle string `json:"modTitle"` // 模版标题
Coin int64 `json:"coin"` // 普通金币数
IncomeCoin int64 `json:"incomeCoin"` // 可提现金币数
Status AiChangeFaceStatus `json:"status"` // 0 未完成; 1 已完成; -1 已退款
Cover string `json:"cover"` // 换脸后封面大图
Url string `json:"url"` // 换脸后视频地址
Remark string `json:"remark"` // 拒绝理由
Operator string `json:"operator"` // 操作员
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 刷新时间
}
type ListRequest struct {
ID *string `form:"id" json:"id"`
Uid *uint64 `form:"uid" json:"uid"`
Status *AiChangeFaceStatus `form:"status" json:"status"`
VidID *string `form:"vidId" json:"vidId"`
commod.Page
}
type EditAiChangeFace struct {
ID primitive.ObjectID `json:"id" binding:"required"` // 被编辑的ai换脸id
Status *AiChangeFaceStatus `json:"status"` // 0 未完成; 1 已完成; -1 已退款 2 已经提交
Cover *string `json:"cover"` // 换脸后封面大图
Url *string `json:"url"` // 换脸后视频地址
Remark *string `json:"remark"` // 拒绝理由
Title *string `json:"title"` // 标题
}
func (receiver *EditAiChangeFace) Update(updateAct string) bson.M {
var update = bson.M{}
if receiver.Url != nil {
update["url"] = receiver.Url
}
if receiver.Cover != nil {
update["cover"] = receiver.Cover
}
if receiver.Status != nil {
update["status"] = receiver.Status
}
if receiver.Remark != nil {
update["remark"] = receiver.Remark
}
update["operator"] = updateAct
update["updatedAt"] = time.Now()
return bson.M{"$set": update}
}
func WebList(id *primitive.ObjectID, uid *uint64, status *AiChangeFaceStatus, vidId *string, skip, limit int) ([]AiChangeFace, int64, error) {
cond := bson.M{}
if id != nil {
cond["_id"] = *id
}
if uid != nil {
cond["uid"] = *uid
}
if status != nil {
cond["status"] = *status
}
if vidId != nil {
vidObjId, _ := primitive.ObjectIDFromHex(*vidId)
cond["vidId"] = vidObjId
}
count, err := coll(nil).Count(cond)
if err != nil {
return nil, 0, err
}
var acfs []AiChangeFace
opts := options.Find().SetSort(bson.D{{Key: "createdAt", Value: -1}})
if skip > 0 {
opts.SetSkip(int64(skip))
}
if limit > 0 {
opts.SetLimit(int64(limit))
}
return acfs, count, coll(nil).Find(&acfs, cond, opts)
}
func Update(t *db.MongoTool, id primitive.ObjectID, set bson.M) error {
_, err := coll(t).UpdateOne(bson.M{"_id": id}, set)
return err
}
// TransitionStatus atomically changes an order from the expected status. The
// returned boolean is false when another worker or callback handled it first.
func TransitionStatus(t *db.MongoTool, id primitive.ObjectID, from, to AiChangeFaceStatus, set bson.M) (bool, error) {
if set == nil {
set = bson.M{}
}
set["status"] = to
set["updatedAt"] = time.Now()
result, err := coll(t).UpdateOne(bson.M{"_id": id, "status": from}, bson.M{"$set": set})
if err != nil {
return false, err
}
return result.ModifiedCount == 1, nil
}