Browse Source

add live red pack

master
黄梓健 5 years ago
parent
commit
b91d668766
  1. 1
      .gitignore
  2. 3
      controllers/author.go
  3. 8
      controllers/client/barrage.go
  4. 8
      controllers/client/bully_screen.go
  5. 78
      controllers/client/live.go
  6. 8
      controllers/client/reward.go
  7. 3
      controllers/common/wechat_oauth.go
  8. 1
      go.mod
  9. 2
      go.sum
  10. 631
      keywords
  11. 26
      libs/filter/filter.go
  12. 75
      libs/im/im.go
  13. 6
      libs/im/im_test.go
  14. 23
      libs/wx/pay.go
  15. 2
      models/init_models.go
  16. 38
      models/live_red_pack.go
  17. 29
      models/live_red_pack_info.go
  18. 2
      models/user_order.go
  19. 315
      services/pay/bindata.go
  20. 4
      services/pay/order.go
  21. 48
      services/red_envelope/red_envelop.go
  22. 3
      utils/code/code.go

1
.gitignore

@ -21,4 +21,3 @@ go_build_main_go
.log
services/pay/bindata.go

3
controllers/author.go

@ -47,6 +47,9 @@ func (t *AuthorCtl) MustGetActivityId() int64 {
}
func (t *AuthorCtl) MustGetCustomerId() int64 {
if t.claims.CustomerId == 0 {
return t.MustGetInt64("customer_id")
}
return t.claims.CustomerId
}

8
controllers/client/barrage.go

@ -4,6 +4,7 @@ import (
"fmt"
"github.com/ouxuanserver/osmanthuswine/src/core"
"hudongzhuanjia/controllers"
"hudongzhuanjia/libs/filter"
"hudongzhuanjia/models"
ws_send_service "hudongzhuanjia/services/ws_send"
"hudongzhuanjia/utils/code"
@ -24,9 +25,10 @@ func (t *BarrageCtl) Send() {
content := t.MustGet("content")
//检查内容是否包含敏感
if models.IsSensitive(content) {
t.ERROR("内容包含敏感字", code.MSG_ERR)
}
//if models.IsSensitive(content) {
// t.ERROR("内容包含敏感字", code.MSG_ERR)
//}
content = filter.Replace(content)
//查询该活动的所属客户
activity := new(models.Activity)

8
controllers/client/bully_screen.go

@ -2,6 +2,7 @@ package client
import (
"hudongzhuanjia/controllers"
"hudongzhuanjia/libs/filter"
"hudongzhuanjia/models"
bully_screen_service "hudongzhuanjia/services/bully_screen"
"hudongzhuanjia/services/pay"
@ -33,9 +34,10 @@ func (t *BullyScreenCtl) PaScreen() {
t.CheckRunning(activity.Status)
//检查内容是否包含敏感
if models.IsSensitive(content) {
t.ERROR("内容包含敏感字", code.MSG_ERR)
}
//if models.IsSensitive(content) {
// t.ERROR("内容包含敏感字", code.MSG_ERR)
//}
content = filter.Replace(content)
//查询该活动的的霸屏服务id
bullyScreenServer := new(models.BullyScreenServer)

78
controllers/client/live.go

@ -2,8 +2,13 @@ package client
import (
"hudongzhuanjia/controllers"
"hudongzhuanjia/libs/filter"
"hudongzhuanjia/models"
pay_service "hudongzhuanjia/services/pay"
red_envelope_service "hudongzhuanjia/services/red_envelope"
"hudongzhuanjia/utils/code"
"strings"
"time"
)
type LiveCtl struct {
@ -65,3 +70,76 @@ func (t *LiveCtl) LoopQuery() {
"watch": live.WatchNum,
})
}
// 发送红包
func (t *LiveCtl) SendLiveRedPack() {
userId := t.MustGetUID() // 用户 uid
activityId := t.MustGetInt64("activity_id") // activity_id
num := t.MustGetInt("num") // 红包数量
amount := t.MustGetDouble("amount") // 金额
prompt := t.MustGet("prompt") // 提示
user := models.User{}
exist, err := models.GetById(&user, userId)
t.CheckErr(err)
t.Assert(exist, code.MSG_USER_NOT_EXIST, "用户不存在")
ip := strings.Split(t.Request.OriginRequest.RemoteAddr, ":")
res, err := pay_service.Order("欧轩互动-直播红包", ip[0], user.Openid, int(amount*100), 3, userId, activityId)
t.CheckErr(err)
info := models.LiveRedPackInfo{}
info.UserOrderId = res["user_order_id"].(int64)
info.Amount = amount
info.UserId = userId
info.ActivityId = activityId
info.Prompt = prompt
info.IsDelete = false
info.UpdatedAt = time.Now()
info.CreatedAt = time.Now()
_, err = info.Add()
t.CheckErr(err)
redPacks := red_envelope_service.GenRedPack(int(amount*100), num)
for _, v := range redPacks {
redPack := new(models.LiveRedPack)
redPack.LiveRedPackInfoId = info.Id
redPack.ActivityId = activityId
redPack.Receiver = 0
redPack.Amount = float64(v) / 100
redPack.CreatedAt = time.Now()
redPack.UpdatedAt = time.Now()
_, err = redPack.Add()
t.CheckErr(err)
}
info.Prompt = filter.Replace(info.Prompt)
t.JSON(info)
}
func (t *LiveCtl) QueryRedPack() {
}
// 领取红包
func (t *LiveCtl) GetRedPack() {
liveRedPackInfoId := t.MustGetInt64("live_red_pack_info_id")
userId := t.MustGetUID()
redPack := new(models.LiveRedPack)
exist, err := redPack.GetByInfoId(liveRedPackInfoId)
t.CheckErr(err)
if !exist {
// 通知其他的人
t.ERROR("红包被领完了", code.MSG_LIVE_RED_PACK_NOT_EXIST)
return
}
// 乐观锁 ==> 防止并发
row, err := redPack.Receive(userId)
t.CheckErr(err)
if row != 1 {
t.ERROR("红包被领完了", code.MSG_LIVE_RED_PACK_NOT_EXIST)
return
}
t.JSON(redPack)
}

8
controllers/client/reward.go

@ -2,6 +2,7 @@ package client
import (
"hudongzhuanjia/controllers"
"hudongzhuanjia/libs/filter"
"hudongzhuanjia/models"
pay_service "hudongzhuanjia/services/pay"
"hudongzhuanjia/utils"
@ -27,9 +28,10 @@ func (t *RewardCtl) Reward() {
t.ERROR("打赏金额不能小于0", code.MSG_ERR_Param)
}
//检查内容是否包含敏感
if models.IsSensitive(content) {
t.ERROR("内容包含敏感字", code.MSG_ERR)
}
//if models.IsSensitive(content) {
// t.ERROR("内容包含敏感字", code.MSG_ERR)
//}
content = filter.Replace(content)
activity := new(models.Activity)
exist, err := models.GetById(activity, activityId)

3
controllers/common/wechat_oauth.go

@ -5,6 +5,7 @@ import (
"encoding/xml"
"fmt"
"hudongzhuanjia/controllers"
"hudongzhuanjia/libs/filter"
"hudongzhuanjia/logger"
"hudongzhuanjia/services/pay"
"os"
@ -34,11 +35,13 @@ func (t *WeChatOauthCtl) Oauth() {
}
func (t *WeChatOauthCtl) Checkin() {
content, _ := t.Get("content")
path, _ := os.Getwd()
t.JSON(map[string]interface{}{
"success": "你好, tommy黄梓健",
"version": Now,
"wd": path,
"content": filter.Replace(content),
})
}

1
go.mod

@ -13,6 +13,7 @@ require (
github.com/gorilla/websocket v1.4.0
github.com/iGoogle-ink/gopay v1.5.1 // indirect
github.com/iGoogle-ink/gopay/v2 v2.0.5
github.com/importcjj/sensitive v0.0.0-20200106142752-42d1c505be7b
github.com/kirinlabs/HttpRequest v0.1.5
github.com/ouxuanserver/osmanthuswine v0.0.0-20190916032555-480efadf4941
github.com/panjf2000/ants v4.0.2+incompatible

2
go.sum

@ -144,6 +144,8 @@ github.com/iGoogle-ink/gopay v1.5.1 h1:uAKvQows+O7P8tPsdxXMwe/YqqeEIEswrdVDwF8bF
github.com/iGoogle-ink/gopay v1.5.1/go.mod h1:/A7M5Ts6OUEaQD+88stwhPtFV1AxOCL+CAtjreZlGGQ=
github.com/iGoogle-ink/gopay/v2 v2.0.5 h1:jjiHTzkbXEOLC87hs3cAfAGC6+CqWzz/hQ/2x3w1lIU=
github.com/iGoogle-ink/gopay/v2 v2.0.5/go.mod h1:plZK1Q8XAw19RkO4MLMYEWWmIhshVK9FtLOrS1ooNwg=
github.com/importcjj/sensitive v0.0.0-20200106142752-42d1c505be7b h1:9hudrgWUhyfR4FRMOfL9KB1uYw48DUdHkkgr9ODOw7Y=
github.com/importcjj/sensitive v0.0.0-20200106142752-42d1c505be7b/go.mod h1:zLVdX6Ed2SvCbEamKmve16U0E03UkdJo4ls1TBfmc8Q=
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=

631
keywords

@ -0,0 +1,631 @@
你妈逼
爱液
按摩棒
拔出来
爆草
包二奶
暴干
暴奸
暴乳
爆乳
暴淫
被操
被插
被干
逼奸
仓井空
插暴
操逼
操黑
操烂
肏你
肏死
操死
操我
厕奴
插比
插b
插逼
插进
插你
插我
插阴
潮吹
潮喷
成人电影
成人论坛
成人色情
成人网站
成人文学
成人小说
艳情小说
成人游戏
吃精
抽插
春药
大波
大力抽送
大乳
荡妇
荡女
盗撮
发浪
放尿
肥逼
粉穴
风月大陆
干死你
干穴
肛交
肛门
龟头
裹本
国产av
好嫩
豪乳
黑逼
后庭
后穴
虎骑
换妻俱乐部
黄片
几吧
鸡吧
鸡巴
鸡奸
妓女
奸情
叫床
脚交
精液
就去日
巨屌
菊花洞
菊门
巨奶
巨乳
菊穴
开苞
口爆
口活
口交
口射
口淫
裤袜
狂操
狂插
浪逼
浪妇
浪叫
浪女
狼友
聊性
凌辱
漏乳
露b
乱交
乱伦
轮暴
轮操
轮奸
裸陪
买春
美逼
美少妇
美乳
美腿
美穴
美幼
秘唇
迷奸
密穴
蜜穴
蜜液
摸奶
摸胸
母奸
奈美
奶子
男奴
内射
嫩逼
嫩女
嫩穴
捏弄
女优
炮友
砲友
喷精
屁眼
前凸后翘
强jian
强暴
强奸处女
情趣用品
情色
拳交
全裸
群交
人妻
人兽
日逼
日烂
肉棒
肉逼
肉唇
肉洞
肉缝
肉棍
肉茎
肉具
揉乳
肉穴
肉欲
乳爆
乳房
乳沟
乳交
乳头
骚逼
骚比
骚女
骚水
骚穴
色逼
色界
色猫
色盟
色情网站
色区
色色
色诱
色欲
色b
少年阿宾
射爽
射颜
食精
释欲
兽奸
兽交
手淫
兽欲
熟妇
熟母
熟女
爽片
双臀
死逼
丝袜
丝诱
松岛枫
酥痒
汤加丽
套弄
体奸
体位
舔脚
舔阴
调教
偷欢
推油
脱内裤
文做
舞女
无修正
吸精
夏川纯
相奸
小逼
校鸡
小穴
小xue
性感妖娆
性感诱惑
性虎
性饥渴
性技巧
性交
性奴
性虐
性息
性欲
胸推
穴口
穴图
亚情
颜射
阳具
杨思敏
要射了
夜勤病栋
一本道
一夜欢
一夜情
一ye情
阴部
淫虫
阴唇
淫荡
阴道
淫电影
阴阜
淫妇
淫河
阴核
阴户
淫贱
淫叫
淫教师
阴茎
阴精
淫浪
淫媚
淫糜
淫魔
淫母
淫女
淫虐
淫妻
淫情
淫色
淫声浪语
淫兽学园
淫书
淫术炼金士
淫水
淫娃
淫威
淫亵
淫样
淫液
淫照
阴b
应召
幼交
欲火
欲女
玉乳
玉穴
援交
原味内衣
援助交际
招鸡
招妓
抓胸
自慰
作爱
a片
fuck
gay片
g点
h动画
h动漫
失身粉
淫荡自慰器
习近平
平近习
xjp
习太子
习明泽
老习
温家宝
温加宝
温x
温jia宝
温宝宝
温加饱
温加保
张培莉
温云松
温如春
温jb
胡温
胡x
胡jt
胡boss
胡总
胡王八
hujintao
胡jintao
胡j涛
胡惊涛
胡景涛
胡紧掏
湖紧掏
胡紧套
锦涛
hjt
胡派
胡主席
刘永清
胡海峰
胡海清
江泽民
民泽江
江胡
江哥
江主席
江书记
江浙闽
江沢民
江浙民
择民
则民
茳泽民
zemin
ze民
老江
老j
江core
江x
江派
江zm
jzm
江戏子
江蛤蟆
江某某
江贼
江猪
江氏集团
江绵恒
江绵康
王冶坪
江泽慧
邓小平
平小邓
xiao平
邓xp
邓晓平
邓朴方
邓榕
邓质方
毛泽东
猫泽东
猫则东
猫贼洞
毛zd
毛zx
z东
ze东
泽d
zedong
毛太祖
毛相
主席画像
改革历程
朱镕基
朱容基
朱镕鸡
朱容鸡
朱云来
李鹏
李peng
里鹏
李月月鸟
李小鹏
李小琳
华主席
华国
国锋
国峰
锋同志
白春礼
薄熙来
薄一波
蔡赴朝
蔡武
曹刚川
常万全
陈炳德
陈德铭
陈建国
陈良宇
陈绍基
陈同海
陈至立
戴秉国
丁一平
董建华
杜德印
杜世成
傅锐
郭伯雄
郭金龙
贺国强
胡春华
耀邦
华建敏
黄华华
黄丽满
黄兴国
回良玉
贾庆林
贾廷安
靖志远
李长春
李春城
李建国
李克强
李岚清
李沛瑶
李荣融
李瑞环
李铁映
李先念
李学举
李源潮
栗智
梁光烈
廖锡龙
林树森
林炎志
林左鸣
令计划
柳斌杰
刘奇葆
刘少奇
刘延东
刘云山
刘志军
龙新民
路甬祥
罗箭
吕祖善
马飚
马恺
孟建柱
欧广源
强卫
沈跃跃
宋平顺
粟戎生
苏树林
孙家正
铁凝
屠光绍
王东明
汪东兴
王鸿举
王沪宁
王乐泉
王洛林
王岐山
王胜俊
王太华
王学军
王兆国
王振华
吴邦国
吴定富
吴官正
无官正
吴胜利
吴仪
奚国华
习仲勋
徐才厚
许其亮
徐绍史
杨洁篪
叶剑英
由喜贵
于幼军
俞正声
袁纯清
曾培炎
曾庆红
曾宪梓
曾荫权
张德江
张定发
张高丽
张立昌
张荣坤
张志国
赵洪祝
紫阳
周生贤
周永康
朱海仑
中南海
大陆当局
中国当局
北京当局
共产党
党产共
共贪党
阿共
产党共
公产党
工产党
共c党
共x党
共铲
供产
共惨
供铲党
供铲谠
供铲裆
共残党
共残主义
共产主义的幽灵
拱铲
老共
中共
中珙
中gong
gc党
贡挡
gong党
g产
狗产蛋
共残裆
恶党
邪党
共产专制
共产王朝
裆中央
土共
土g
共狗
g匪
共匪
仇共
政府
症腐
政腐
政付
正府
政俯
政f
zhengfu
政zhi
挡中央
档中央
中央领导
中国zf
中央zf
国wu院
中华帝国
gong和
大陆官方
北京政权
江泽民
胡锦涛
温家宝
习近平
习仲勋
贺国强
贺子珍
周永康
李长春
李德生
王岐山
姚依林
回良玉
李源潮
李干成
戴秉国
黄镇
刘延东
刘瑞龙
俞正声
黄敬
薄熙
薄一波
周小川
周建南
温云松
徐明
江泽慧
江绵恒
江绵康
李小鹏
李鹏
李小琳
朱云来
朱容基
法轮功
李洪志
新疆骚乱

26
libs/filter/filter.go

@ -0,0 +1,26 @@
package filter
import (
"github.com/importcjj/sensitive"
"os"
"path/filepath"
)
var filter *sensitive.Filter
func init() {
initFilter()
}
func initFilter() {
wd, _ := os.Getwd()
filter = sensitive.New()
filter.LoadWordDict(filepath.Join(wd, "keywords"))
}
func Replace(content string) string {
if filter == nil {
initFilter()
}
return filter.Replace(content, '*')
}

75
libs/im/im.go

@ -13,29 +13,43 @@ var (
//SdkAppid = 1400345581
//SdkAppKey = "e3d095ce8253fe18109d6c1ad068907978cac0a428fbad181d8958631b78e930"
SdkAppKey = "9683fc9d2e50857f33c7ef5431942458f2dbc7042ba526f87042092afb646331"
SdkAppid = 1400337419
TxImHost = "https://console.tim.qq.com"
SdkAppKey = "9683fc9d2e50857f33c7ef5431942458f2dbc7042ba526f87042092afb646331"
SdkAppid = 1400337419
TxImHostV4 = "https://console.tim.qq.com/v4"
)
type AccountImportResult struct {
type NoticeType int
const NoticeLiveRedPackStart NoticeType = 256 // 通知直播用户红包开始了
const NoticeLiveRedPackEnd NoticeType = 257 // 通知直播用户红包结束了
const NoticeShakeRedPackStart NoticeType = 258 // 通知摇红包开始了
const NoticeShakeRedPackEnd NoticeType = 259 // 通知摇红包结束了
type CommonResult struct {
ActionStatus string `json:"ActionStatus"`
ErrorCode int `json:"ErrorCode"`
ErrorInfo string `json:"ErrorInfo"`
}
type AccountImportParam struct {
Identifier string `json:"Identifier"`
Nick string `json:"Nick"`
FaceUrl string `json:"FaceUrl"`
}
func GenSig(identifier string) (string, error) {
return tencentyun.GenSig(SdkAppid, SdkAppKey, identifier, 86400000)
}
func AccountImport(identifier, nickname, faceurl string) (string, error) {
sign, err := tencentyun.GenSig(SdkAppid, SdkAppKey, "admin", 86400*180)
//sign, err := tencentyun.GenSig(SdkAppid, SdkAppKey, "admin", 86400*180)
sig, err := GenSig("admin")
if err != nil {
return "", err
}
random := utils.RandomStr(32)
u := fmt.Sprintf("%s/v4/im_open_login_svc/account_import?sdkappid=%d&identifier=admin&usersig=%s&random=%s&contenttype=json", TxImHost, SdkAppid, sign, random)
u := fmt.Sprintf("%s/im_open_login_svc/account_import?sdkappid=%d&identifier=admin&usersig=%s&random=%s&contenttype=json",
TxImHostV4, SdkAppid, sig, random)
bs, _ := json.Marshal(&AccountImportParam{
Identifier: identifier,
Nick: nickname,
@ -45,7 +59,7 @@ func AccountImport(identifier, nickname, faceurl string) (string, error) {
if err != nil {
return "", err
}
res := AccountImportResult{}
res := CommonResult{}
err = resp.Json(&res)
if err != nil {
return "", err
@ -54,5 +68,50 @@ func AccountImport(identifier, nickname, faceurl string) (string, error) {
return "", errors.New(res.ErrorInfo)
}
return tencentyun.GenSig(SdkAppid, SdkAppKey, identifier, 86400000)
//return tencentyun.GenSig(SdkAppid, SdkAppKey, identifier, 86400000)
return GenSig(identifier)
}
// 群通知
type SendGroupSystemNotificationParam struct {
GroupId string `json:"GroupId"`
Content string `json:"Content"`
ToMembersAccount []string `json:"ToMembers_Account,omitempty"`
}
func SendGroupSystemNotification(groupId string, noticeType NoticeType, notice string, members ...string) error {
sig, err := GenSig("admin")
if err != nil {
return err
}
random := utils.RandomStr(32)
u := fmt.Sprintf("%s/group_open_http_svc/send_group_system_notification?sdkappid=%d&identifier=admin&usersig=%s&random=%s&contenttype=json",
TxImHostV4, SdkAppid, sig, random)
var m = make(map[string]interface{})
m["type"] = noticeType
m["notice"] = notice
content, err := json.Marshal(&m)
if err != nil {
return err
}
bs, err := json.Marshal(&SendGroupSystemNotificationParam{
GroupId: groupId,
Content: string(content),
ToMembersAccount: members,
})
if err != nil {
return err
}
resp, err := HttpRequest.NewRequest().Debug(true).JSON().Post(u, string(bs))
res := CommonResult{}
err = resp.Json(&res)
if err != nil {
return err
}
if res.ErrorCode != 0 {
return errors.New(res.ErrorInfo)
}
return nil
}

6
libs/im/im_test.go

@ -9,3 +9,9 @@ func TestAccountImport(t *testing.T) {
sig, err := AccountImport("test1", "tommy", "http://a.cphotos.bdimg.com/timg?image&quality=100&size=b4000_4000&sec=1585813714&di=c76777c95455780deffa04d28b25cb70&src=http://b-ssl.duitang.com/uploads/item/201412/28/20141228171331_L5T2n.jpeg")
fmt.Println(sig, err)
}
func TestSendGroupSystemNotification(t *testing.T) {
err := SendGroupSystemNotification("@TGS#aZWTFELGU", 256, "你好吗")
fmt.Println(err)
}

23
libs/wx/pay.go

@ -10,15 +10,6 @@ import (
"net/http"
)
func SwitchHost(host string) {
UnifiedOrderURL = fmt.Sprintf("%s/pay/unifiedorder", host)
QueryOrderURL = fmt.Sprintf("%s/pay/orderquery", host)
CloseOrderURL = fmt.Sprintf("%s/pay/closeorder", host)
RefundURL = fmt.Sprintf("%s/pay/refund", host)
RefundQueryURL = fmt.Sprintf("%s/pay/refundquery", host)
TransfersURL = fmt.Sprintf("%s/mmpaymkttransfers/promotion/transfers", host)
}
type cdata string
func (c cdata) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
@ -60,20 +51,6 @@ type Client struct {
secureClient *http.Client
}
//func NewClient() *Client {
// tlsConfig, err := getTLSConfig()
// if err != nil {
// panic(err) // 出现错误
// }
// tr := &http.Transport{TLSClientConfig: tlsConfig}
// client := &http.Client{Transport: tr}
// return &Client{
// AppId: Appid,
// MchId: Mchid,
// secureClient: client,
// }
//}
func (w *Client) Post(url string, xmlRes []byte) (*http.Response, error) {
return w.secureClient.Post(url, "application/xml", bytes.NewBuffer(xmlRes))
}

2
models/init_models.go

@ -86,6 +86,8 @@ func init() {
new(RealSignHistory),
new(LiveViewer),
new(LiveConfig),
new(LiveRedPackInfo),
new(LiveRedPack),
)
fmt.Printf("error=======>%v\n\n", err)
}

38
models/live_red_pack.go

@ -0,0 +1,38 @@
package models
import (
"github.com/ouxuanserver/osmanthuswine/src/core"
"time"
)
const LiveRedPackTN = TableNamePrefix + "live_red_pack"
type LiveRedPack struct {
Id int64 `json:"id" xorm:"not null pk autoincr INT(11)"`
IsDelete bool `json:"-" xorm:"not null default 0 comment('是否删除') TINYINT(1)"`
CreatedAt time.Time `json:"created_at" xorm:"not null created comment('创建时间') DATETIME"`
UpdatedAt time.Time `json:"updated_at" xorm:"not null updated default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
LiveRedPackInfoId int64 `json:"live_red_pack_info_id" xorm:"not null default 0 comment('红包信息id') INT(11)"`
ActivityId int64 `json:"activity_id" xorm:"not null default 0 comment('互动id') INT(11)"`
Receiver int64 `json:"receiver" xorm:"not null default 0 comment('[0未领取/非0领取用户id]') INT(11)"`
Amount float64 `json:"amount" xorm:"not null default 0.0 comment('红包金额') DECIMAL(18,2)"`
Version int `json:"version" xorm:"not null version comment('乐观锁') INT(11)"`
}
func (t LiveRedPack) TableName() string {
return LiveRedPackTN
}
func (t *LiveRedPack) Add() (int64, error) {
return core.GetXormAuto().InsertOne(t)
}
func (t *LiveRedPack) GetByInfoId(infoId int64) (bool, error) {
return core.GetXormAuto().Where("live_red_package_info_id=? and is_delete=0", infoId).Get(t)
}
func (t *LiveRedPack) Receive(userId int64) (int64, error) {
t.Receiver = userId
return core.GetXormAuto().Where("id=?", t.Id).Cols("user_id").Update(t)
}

29
models/live_red_pack_info.go

@ -0,0 +1,29 @@
package models
import (
"github.com/ouxuanserver/osmanthuswine/src/core"
"time"
)
const LiveRedPackInfoTN = TableNamePrefix + "live_red_pack_info"
type LiveRedPackInfo struct {
Id int64 `json:"live_red_pack_info_id" xorm:"not null pk autoincr INT(11)"`
IsDelete bool `json:"-" xorm:"not null default 0 comment('是否删除') TINYINT(1)"`
CreatedAt time.Time `json:"created_at" xorm:"not null created comment('创建时间') DATETIME"`
UpdatedAt time.Time `json:"updated_at" xorm:"not null updated default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
UserOrderId int64 `json:"user_order_id" xorm:"not null default 0 comment('用户微信订单id') INT(11)"`
UserId int64 `json:"user_id" xorm:"not null default 0 comment('用户id') INT(11)"`
ActivityId int64 `json:"activity_id" xorm:"not null default 0 comment('互动id') INT(11)"`
Prompt string `json:"prompt" xorm:"not null default 0 comment('祝福语') VARCHAR(255)"`
Amount float64 `json:"amount" xorm:"not null default 0.0 comment('红包金额') DECIMAL(18,2)"`
}
func (t *LiveRedPackInfo) TableName() string {
return LiveRedPackInfoTN
}
func (t *LiveRedPackInfo) Add() (int64, error) {
return core.GetXormAuto().InsertOne(t)
}

2
models/user_order.go

@ -10,7 +10,7 @@ const UserOrderTableName = TableNamePrefix + "user_order"
type UserOrder struct {
Id int64 `json:"id" xorm:"not null pk autoincr INT(11)"`
DeviceInfo string `json:"device_info" xorm:"not null default('') comment('设备号') VARCHAR(32)"`
GoodType int `json:"good_type" xorm:"not null default(0) comment('1霸屏2打赏')"`
GoodType int `json:"good_type" xorm:"not null default(0) comment('1霸屏2打赏3直播红包')"`
Desc string `json:"desc" xorm:"not null default('') comment('') VARCHAR(128)"`
OutTradeNo string `json:"out_trade_no" xorm:"not null default('') comment('商户订单号') VARCHAR(32)"`
FeeType string `json:"fee_type" xorm:"not null default('CNY') comment('货币种类') VARCHAR(16)"`

315
services/pay/bindata.go
File diff suppressed because it is too large
View File

4
services/pay/order.go

@ -14,7 +14,7 @@ import (
"time"
)
const CALLBACK_ORDER_URL = "https://api.ouxuanhudong.com/PcClient/common/WeChatOauthCtl/callbackOrder"
const CallbackOrderUrl = "https://api.ouxuanhudong.com/PcClient/common/WeChatOauthCtl/callbackOrder"
func Order(content, ip, openid string, fee, goodType int, userId, activityId int64) (map[string]interface{}, error) {
client := wechat.NewClient(wx.Appid, wx.Mchid, wx.ApiKey, true)
@ -35,7 +35,7 @@ func Order(content, ip, openid string, fee, goodType int, userId, activityId int
body.Set("out_trade_no", outTradeNo)
body.Set("total_fee", fee)
body.Set("spbill_create_ip", ip)
body.Set("notify_url", CALLBACK_ORDER_URL)
body.Set("notify_url", CallbackOrderUrl)
body.Set("trade_type", wechat.TradeType_JsApi)
body.Set("device_info", "WEB")
body.Set("sign_type", wechat.SignType_MD5)

48
services/red_envelope/red_envelop.go

@ -49,6 +49,35 @@ const (
MaxRedPackAmount = 499
)
func GenRedPack(amount, num int) []int {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
sumMoney := 0
redPacks := make([]int, num)
for i := 0; i < num; i++ {
money := r.Int()*2*(amount-sumMoney)/num - i
if money <= MinRedPackAmount {
money = MinRedPackAmount
} else if money >= MaxRedPackAmount {
money = MaxRedPackAmount
}
// 剩余红包的限制
rate := (amount - sumMoney - money) / (num - i)
if rate <= MinRedPackAmount {
money = MinRedPackAmount
} else if rate >= MaxRedPackAmount {
money = MaxRedPackAmount
}
if num-i == 1 { // 最后一个
money = amount - sumMoney
}
sumMoney += money
redPacks = append(redPacks, money)
}
return redPacks
}
// 提前生成红包
func GenRedEnvelope(aid, rid int64, rule *models.ShakeRedEnvelopeRule) error {
// 判断红包是否存在
@ -65,12 +94,29 @@ func GenRedEnvelope(aid, rid int64, rule *models.ShakeRedEnvelopeRule) error {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
if rule.Model == define.SHAKERB_RULE_RANDOM { // 随机红包
//redPacks := GenRedPack(int(rule.RandSum*100), int(rule.RedEnvelopeNum))
//for _, redpack := range redPacks {
// record := new(models.ShakeRedEnvelopeRecord)
// record.ActivityId = aid
// record.RehearsalId = rid
// record.ShakeRedEnvelopeActivityId = rule.ShakeRedEnvelopeActivityId
// record.ShakeRedEnvelopeRuleId = rule.Id
// record.Amount = float64(redpack) / 100
// record.IsDraw = -1
// record.IsDelete = false
// record.CreatedAt = time.Now()
// record.UpdatedAt = time.Now()
// if _, err := core.GetXormAuto().InsertOne(record); err != nil {
// return err
// }
//}
// 检测红包是否存在
sumMoney := 0.0
for i := 0; i < int(rule.RedEnvelopeNum); i++ {
money := r.Float64() * 2 * (rule.RandSum - sumMoney) / float64(int(rule.RedEnvelopeNum)-i)
amount := utils.Float64CusDecimal(money, 2)
if amount < MinRedPackAmount { // 随机的金额可能小于1块钱
if amount <= MinRedPackAmount { // 随机的金额可能小于1块钱
amount = MinRedPackAmount
} else if amount >= MaxRedPackAmount {
amount = MaxRedPackAmount

3
utils/code/code.go

@ -12,6 +12,8 @@ const (
MSG_CUSTOMER_NOT_EXIST = 700
MSG_AREASTORE_NOT_EXIST = 800
MSG_ENTRYPEOPLE_NOT_EXIST = 900
MSG_LIVE_ACTIVITY_NOT_EXIST = 950 // 直播活动不存在
MSG_LIVE_RED_PACK_NOT_EXIST = 951 // 直播红包不存在
MSG_ACTIVITY_NOT_EXIST = 1000 // 互动不存在
MSG_MODULE_NOT_EXIST = 1001 // 模块活动不存在
MSG_MODULE_STATUS_END = 1002 // 该模块活动已结束
@ -42,6 +44,5 @@ const (
MSG_SHAKERB_RECORD_NOT_EXIST = 8001 // 摇红包不存在
MSG_SHAKERB_RULE_NOT_EXIST = 8002 // 红包规则不存在
MSG_AUCTION_NOT_EXIST = 9000 // 竞拍不存在
MSG_AUCTION_PLAYER_NOT_EXIST = 9001 // 竞拍人不存在
MSG_CALORIE_NOT_EXIST = 10001 // 卡路里轮次不存在
)
Loading…
Cancel
Save