init: hgmj server initial commit

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 16:50:13 +08:00
co-authored by Claude Opus 4.7
commit 625e89c15d
1870 changed files with 254090 additions and 0 deletions
+115
View File
@@ -0,0 +1,115 @@
package walletctrl
import (
"91jd-server/app/service/walletser"
"91jd-server/common"
"91jd-server/common/stderr"
"91jd-server/models/commod"
"91jd-server/models/v/txnmod"
"91jd-server/models/v/usermod"
"github.com/gin-gonic/gin"
)
// GetNewBill doc
// @Summary --我的账单新
// @Description 我的账单
// @Tags 钱包
// @Accept mpfd,json
// @Produce json,html
// @Param year query string true "年"
// @Param month query string true "月"
// @Param pageNumber query int true "页码"
// @Param pageSize query int true "条数"
// @Success 200 {object} txnmod.Bills1Res "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/app/mine/zhangdan [get]
func GetNewBill(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
var arg struct {
Month int `form:"month"`
Year int `form:"year"`
commod.Page
}
if err = ctx.ShouldBind(&arg); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
data, err := walletser.GetBills1(uid, arg.Year, arg.Month, arg.PageNumber, arg.PageSize)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, "")
return
}
common.ServeJSON(ctx, stderr.Success, data)
}
// GetIncome doc
// @Summary --收益明细
// @Description 收益明细
// @Tags 钱包
// @Accept mpfd,json
// @Produce json,html
// @Param startTime query string false "开始时间"
// @Param endTime query string false "结束时间"
// @Param pageNumber formData int true "页码"
// @Param pageSize formData int true "条数"
// @Success 200 {object} txnmod.TransactionLog "{"list": [],"hasNext":false}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /app/mine/iIncomes [get]
func GetIncome(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
var arg struct {
commod.Page
}
if err = ctx.ShouldBind(&arg); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
data, hasNext, err := txnmod.FindIncome(uid, arg.PageNumber, arg.PageSize)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, "")
return
}
var rechargeIds []uint64
for _, d := range data {
rechargeIds = append(rechargeIds, d.RechargeId)
}
if len(rechargeIds) > 0 {
// 获取用户信息
users, err := usermod.FindUsersMapByUID(rechargeIds)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, "")
return
}
mUser := make(map[uint64]*txnmod.RechargeUserInfo)
if len(users) > 0 {
for _, u := range users {
ru := txnmod.RechargeUserInfo{
UID: u.UID,
Name: u.Name,
Portrait: u.Portrait,
}
mUser[u.UID] = &ru
}
}
for _, d := range data {
if d.RechargeId != 0 {
d.RechargeUser = *mUser[d.RechargeId]
}
}
}
common.ServeJSON(ctx, stderr.Success, gin.H{
"list": data,
"hasNext": hasNext,
})
}
+22
View File
@@ -0,0 +1,22 @@
package walletctrl
import (
"91jd-server/app/appg"
"91jd-server/common/store"
"encoding/json"
"errors"
"github.com/gin-gonic/gin"
)
func Check(ctx *gin.Context, param interface{}) (err error) {
b, _ := json.Marshal(param)
sign, err := store.Encrypt(b, appg.Conf.Base.StoreEncryptKey)
if err != nil {
return
}
headerSign := ctx.Request.Header.Get("sign")
if sign != headerSign {
return errors.New("校验失败")
}
return nil
}
+48
View File
@@ -0,0 +1,48 @@
package walletctrl
import (
"91jd-server/app/service/ai_undress_server"
"91jd-server/app/service/aiser"
"91jd-server/common"
"91jd-server/common/log"
"91jd-server/common/stderr"
"91jd-server/models/v/walletmod"
"github.com/gin-gonic/gin"
)
// GetWalletAmount doc
// @Summary 获取钱包信息
// @Description 获取钱包信息
// @Tags 钱包
// @Accept mpfd,json
// @Produce json,html
// @Success 200 {object} walletmod.Wallet "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /mine/wallet [get]
func GetWalletAmount(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err.Error())
return
}
// 从AI女友页面返回后,钱包查询会先尝试把第三方剩余余额下分回主钱包。
// 下分失败只记录告警,钱包接口仍返回当前本地余额。
if err = aiser.TrySettleDown(ctx.Request.Context(), uid); err != nil {
log.Warn("wallet AI girlfriend settlement failed", log.Any("uid", uid), log.E(err))
}
w, err := walletmod.GetWallet(uid)
if err != nil {
common.ServeJSON(ctx, stderr.ErrServerUnavailable, err.Error())
return
}
resp := &walletmod.WalletResp{}
// 当日剩余ai免费脱衣次数
if w != nil {
resp.Wallet = *w
resp.TodayAiFreeTimes = ai_undress_server.GetTodayRemainingAiFreeUndressTimes(*w)
}
common.ServeJSON(ctx, stderr.Success, resp)
}