Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	go.mod
order_statistics
huangjiajun 5 months ago
parent
commit
02db79cdae
100 changed files with 5492 additions and 4 deletions
  1. +1
    -0
      app/cfg/cfg_app.go
  2. +2
    -0
      app/cfg/init_cfg.go
  3. +2
    -1
      cloud_issuance/svc/svc_deal_call_back.go
  4. +2
    -0
      consume/init.go
  5. +10
    -0
      consume/md/consume_key.go
  6. +72
    -0
      consume/super_cloud_issuance_msg_callback.go
  7. +11
    -0
      etc/cfg.yml
  8. +3
    -3
      go.mod
  9. +4
    -0
      main.go
  10. +40
    -0
      super_cloud_issuance/db/db_cloud_bundle.go
  11. +21
    -0
      super_cloud_issuance/db/db_order.go
  12. +27
    -0
      super_cloud_issuance/db/db_provider.go
  13. +104
    -0
      super_cloud_issuance/db/db_sys_cfg.go
  14. +79
    -0
      super_cloud_issuance/db/db_sys_mod.go
  15. +156
    -0
      super_cloud_issuance/db/db_sys_mod_format_img.go
  16. +298
    -0
      super_cloud_issuance/db/db_user.go
  17. +15
    -0
      super_cloud_issuance/db/db_user_fin_flow.go
  18. +92
    -0
      super_cloud_issuance/db/db_user_level.go
  19. +418
    -0
      super_cloud_issuance/db/db_user_profile.go
  20. +213
    -0
      super_cloud_issuance/db/db_user_relate.go
  21. +35
    -0
      super_cloud_issuance/db/db_user_virtual_amount.go
  22. +63
    -0
      super_cloud_issuance/db/db_virtual_coin.go
  23. +16
    -0
      super_cloud_issuance/db/db_virtual_coin_relate.go
  24. +55
    -0
      super_cloud_issuance/db/dbs_sys_cfg.go
  25. +17
    -0
      super_cloud_issuance/db/model/cloud_bundle.go
  26. +18
    -0
      super_cloud_issuance/db/model/db_mapping.go
  27. +30
    -0
      super_cloud_issuance/db/model/fin_user_flow.go
  28. +46
    -0
      super_cloud_issuance/db/model/ord_list.go
  29. +9
    -0
      super_cloud_issuance/db/model/provider_icon.go
  30. +7
    -0
      super_cloud_issuance/db/model/sys_cfg.go
  31. +34
    -0
      super_cloud_issuance/db/model/sys_module.go
  32. +18
    -0
      super_cloud_issuance/db/model/sys_push_user.go
  33. +19
    -0
      super_cloud_issuance/db/model/sys_template.go
  34. +25
    -0
      super_cloud_issuance/db/model/user.go
  35. +8
    -0
      super_cloud_issuance/db/model/user_app_domain.go
  36. +20
    -0
      super_cloud_issuance/db/model/user_level.go
  37. +91
    -0
      super_cloud_issuance/db/model/user_profile.go
  38. +13
    -0
      super_cloud_issuance/db/model/user_relate.go
  39. +13
    -0
      super_cloud_issuance/db/model/user_tag.go
  40. +8
    -0
      super_cloud_issuance/db/model/user_virtual_amount.go
  41. +8
    -0
      super_cloud_issuance/db/model/user_virtual_assets.go
  42. +21
    -0
      super_cloud_issuance/db/model/user_virtual_coin_flow.go
  43. +17
    -0
      super_cloud_issuance/db/model/virtual_coin.go
  44. +12
    -0
      super_cloud_issuance/db/model/virtual_coin_relate.go
  45. +41
    -0
      super_cloud_issuance/db/model/wx_applet_list.go
  46. +15
    -0
      super_cloud_issuance/db/official/db_super_cloud_issuance_baisc.go
  47. +117
    -0
      super_cloud_issuance/db/official/db_super_cloud_issuance_master.go
  48. +117
    -0
      super_cloud_issuance/db/official/db_super_cloud_issuance_master_buy_ord.go
  49. +62
    -0
      super_cloud_issuance/db/official/db_super_cloud_issuance_robot_records.go
  50. +15
    -0
      super_cloud_issuance/db/official/model/super_cloud_issuance_basic.go
  51. +14
    -0
      super_cloud_issuance/db/official/model/super_cloud_issuance_master.go
  52. +22
    -0
      super_cloud_issuance/db/official/model/super_cloud_issuance_master_buy_ord.go
  53. +15
    -0
      super_cloud_issuance/db/official/model/super_cloud_issuance_robot.go
  54. +8
    -0
      super_cloud_issuance/db/official/model/super_cloud_issuance_robot_records.go
  55. +8
    -0
      super_cloud_issuance/db/official/model/user_app_list.go
  56. +8
    -0
      super_cloud_issuance/db/official/model/user_app_member.go
  57. +41
    -0
      super_cloud_issuance/db/zhimeng_db.go
  58. +88
    -0
      super_cloud_issuance/enum/enum_api.go
  59. +31
    -0
      super_cloud_issuance/enum/enum_goods_category.go
  60. +19
    -0
      super_cloud_issuance/enum/enum_super_cloud_issuance_add_group_welcome_message.go
  61. +55
    -0
      super_cloud_issuance/enum/enum_super_cloud_issuance_keyword_reply_with_activate_group.go
  62. +109
    -0
      super_cloud_issuance/enum/enum_super_cloud_issuance_user_group_manage.go
  63. +19
    -0
      super_cloud_issuance/enum/enum_super_cloud_issuance_user_robot_kind.go
  64. +31
    -0
      super_cloud_issuance/enum/enum_super_cloud_issuance_user_robot_type.go
  65. +19
    -0
      super_cloud_issuance/enum/enum_super_cloud_issuance_user_robot_with_activate_group.go
  66. +23
    -0
      super_cloud_issuance/lib/auth/base.go
  67. +40
    -0
      super_cloud_issuance/lib/baidu/shorten_url.go
  68. +16
    -0
      super_cloud_issuance/lib/qiniu/bucket_create.go
  69. +18
    -0
      super_cloud_issuance/lib/qiniu/bucket_delete.go
  70. +18
    -0
      super_cloud_issuance/lib/qiniu/bucket_get_domain.go
  71. +22
    -0
      super_cloud_issuance/lib/qiniu/init.go
  72. +54
    -0
      super_cloud_issuance/lib/qiniu/req_img_upload.go
  73. +66
    -0
      super_cloud_issuance/lib/zhimeng/api.go
  74. +162
    -0
      super_cloud_issuance/lib/zhimeng/sdk.go
  75. +64
    -0
      super_cloud_issuance/md/alipay.go
  76. +11
    -0
      super_cloud_issuance/md/app_redis_key.go
  77. +19
    -0
      super_cloud_issuance/md/cfg_key.go
  78. +54
    -0
      super_cloud_issuance/md/file.go
  79. +183
    -0
      super_cloud_issuance/md/md_api.go
  80. +18
    -0
      super_cloud_issuance/md/md_call_back.go
  81. +143
    -0
      super_cloud_issuance/md/mod.go
  82. +14
    -0
      super_cloud_issuance/md/mq.go
  83. +49
    -0
      super_cloud_issuance/md/pay.go
  84. +38
    -0
      super_cloud_issuance/md/platform.go
  85. +42
    -0
      super_cloud_issuance/md/split_db.go
  86. +39
    -0
      super_cloud_issuance/md/user_info.go
  87. +30
    -0
      super_cloud_issuance/md/wxpay.go
  88. +89
    -0
      super_cloud_issuance/svc/copy_writing.go
  89. +14
    -0
      super_cloud_issuance/svc/svc_auth.go
  90. +369
    -0
      super_cloud_issuance/svc/svc_cloud_issuance.go
  91. +11
    -0
      super_cloud_issuance/svc/svc_db.go
  92. +210
    -0
      super_cloud_issuance/svc/svc_deal_call_back.go
  93. +58
    -0
      super_cloud_issuance/svc/svc_domain_info.go
  94. +71
    -0
      super_cloud_issuance/svc/svc_file_img_format.go
  95. +103
    -0
      super_cloud_issuance/svc/svc_file_img_upload.go
  96. +68
    -0
      super_cloud_issuance/svc/svc_fin_user_flow.go
  97. +85
    -0
      super_cloud_issuance/svc/svc_redis_mutex_lock.go
  98. +137
    -0
      super_cloud_issuance/svc/svc_sys_cfg_get.go
  99. +26
    -0
      super_cloud_issuance/svc/svc_validate_common.go
  100. +101
    -0
      super_cloud_issuance/tool/super_cloud_issuance/api.go

+ 1
- 0
app/cfg/cfg_app.go View File

@@ -26,6 +26,7 @@ type Config struct {
WxappletFilepath WxappletFilepathCfg `yaml:"wxapplet_filepath"`
Local bool
AppComm AppCommCfg `yaml:"app_comm"`
ZhimengDB DBCfg `yaml:"zhimeng_db"`
}

// 公共模块


+ 2
- 0
app/cfg/init_cfg.go View File

@@ -25,6 +25,7 @@ var (
Local bool
AppComm *AppCommCfg
WxappletFilepath *WxappletFilepathCfg
ZhimengDB *DBCfg
)

//初始化配置文件,将cfg.yml读入到内存
@@ -63,4 +64,5 @@ func InitCfg() {
ImBusinessRpc = &conf.ImBusinessRpc
ImLogicRpc = &conf.ImLogicRpc
WxappletFilepath = &conf.WxappletFilepath
ZhimengDB = &conf.ZhimengDB
}

+ 2
- 1
cloud_issuance/svc/svc_deal_call_back.go View File

@@ -8,6 +8,7 @@ import (
"applet/cloud_issuance/db"
"applet/cloud_issuance/enum"
"applet/cloud_issuance/md"
db3 "applet/super_cloud_issuance/db"
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/chain_transfer"
cache2 "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils/cache"
"fmt"
@@ -63,7 +64,7 @@ func (dealCloudIssuanceCallBackService *DealCloudIssuanceCallBackService) DealCa
utils.FilePutContents("cloud", utils.SerializeStr(args))
randInt := utils.RandIntRand(10, 100)
time.Sleep(time.Millisecond * time.Duration(randInt)) // 等待10 ~ 100毫秒
chain := chain_transfer.TurnChain(svc.MasterDb(c), db2.Db, args)
chain := chain_transfer.TurnChain(svc.MasterDb(c), db3.ZhimengDb, db2.Db, args)
utils.FilePutContents("cloud_resp", utils.SerializeStr(chain))
if chain.Count != "" {
req.Data.Content = chain.Count


+ 2
- 0
consume/init.go View File

@@ -98,6 +98,8 @@ func initConsumes() {
//////////////////////////////////////// autoRepaid /////////////////////////////////////////////////////
jobs[consumeMd.InstallmentPaymentAutoRepaidConsumeFunName] = InstallmentPaymentAutoRepaidConsume //分期付 - 自动扣款

////////////////////////////////////// SuperCloudIssuance /////////////////////////////////////////////////////
//jobs[consumeMd.SuperCloudIssuanceMsgCallBackFunName] = SuperCloudIssuanceMsgCallBackConsume
}

func Run() {


+ 10
- 0
consume/md/consume_key.go View File

@@ -29,6 +29,15 @@ var RabbitMqQueueKeyList = []*MqQueue{
BindKey: "",
ConsumeFunName: "CloudIssuanceMsgCallBackConsume",
},
{
ExchangeName: "zhios.super.cloud.issuance.msg.callback.exchange",
Name: "super_cloud_issuance_msg_call_back",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "",
BindKey: "",
ConsumeFunName: "SuperCloudIssuanceMsgCallBackConsume",
},
{
ExchangeName: "zhios.cloud_chain.fenxiao.newChange.exchange",
Name: "cloud_chain_fenxiao_newChange",
@@ -545,6 +554,7 @@ const (
ZhiosTikTokAllUpdateFunName = "ZhiosTikTokAllUpdate"
CloudIssuanceAsyncMLoginFunName = "CloudIssuanceAsyncMLoginConsume"
CloudIssuanceMsgCallBackFunName = "CloudIssuanceMsgCallBackConsume"
SuperCloudIssuanceMsgCallBackFunName = "SuperCloudIssuanceMsgCallBackConsume"
ZhiosAcquisitionConditionFunName = "ZhiosAcquisitionCondition"
ZhiosValidUserFunName = "ZhiosValidUser"
ZhiosAppreciationFunName = "ZhiosAppreciation"


+ 72
- 0
consume/super_cloud_issuance_msg_callback.go View File

@@ -0,0 +1,72 @@
package consume

import (
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
db "applet/super_cloud_issuance/db/official"
md2 "applet/super_cloud_issuance/md"
"applet/super_cloud_issuance/svc"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/streadway/amqp"
"time"
)

func SuperCloudIssuanceMsgCallBackConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//2、取出数据进行消费
ch.Qos(10)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>CloudIssuanceMsgCallBackConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
//解析mq中queue的数据结构体
var msg *md2.CallbackRequest
err = json.Unmarshal(res.Body, &msg)
if err != nil {
panic(err)
}
randInt := utils.RandIntRand(100, 200)
time.Sleep(time.Millisecond * time.Duration(randInt)) // 等待100 ~ 200毫秒
go func() {
//设置masterId
cloudIssuanceRobotRecords, err := db.SuperCloudIssuanceRobotRecordsGetOneByParams(map[string]interface{}{
"key": "robot_id",
"value": msg.RobotId,
})
if err != nil {
fmt.Println("CallBackErr:::::", err.Error())
return
}
if cloudIssuanceRobotRecords == nil {
//TODO::未查询到机器人,不需要处理
utils.FilePutContents("cloud_issuance_call_back_not_found", utils.SerializeStr(msg))
return
}
var c = &gin.Context{}
c.Set("mid", cloudIssuanceRobotRecords.MasterId)
dealCloudIssuanceCallBackService := svc.DealSuperCloudIssuanceCallBackService{}
dealCloudIssuanceCallBackService.Set(c)
dealCloudIssuanceCallBackService.DealCallBack(c, *msg)
}()
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

+ 11
- 0
etc/cfg.yml View File

@@ -39,6 +39,17 @@ db:
max_idle_conns: 100
path: 'tmp/%s.log'

zhimeng_db:
host: '119.23.182.117:3306'
name: 'zhi_meng'
user: 'root'
psw: 'Fnuo123com@'
show_log: true
max_lifetime: 30
max_open_conns: 100
max_idle_conns: 100
path: 'tmp/%s.log'

# 连接 big_data_screen 数据库
data_db:
host: 'zhios123.rwlb.rds.aliyuncs.com:3306'


+ 3
- 3
go.mod View File

@@ -6,9 +6,9 @@ require (
code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git v1.1.2-0.20240607091816-3df1433a2f0d
code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.0
code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5
code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240703034234-2ab228956242
code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240626081400-7f66164d40c2
code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git v1.6.2-0.20231116085701-9ba6e19f877b
code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240126015516-38ca248db2fd
code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240611024753-7cd929a03014
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/boombuler/barcode v1.0.1
@@ -45,7 +45,7 @@ require (
)

require (
code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240701102131-0408d7ee8572 // indirect
code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240627143928-f533f5e7e4a0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect


+ 4
- 0
main.go View File

@@ -6,6 +6,7 @@ import (
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume"
db2 "applet/super_cloud_issuance/db"
"fmt"
"os"
"os/signal"
@@ -29,6 +30,9 @@ func init() {
if err := db.InitImDB(cfg.ImDB); err != nil { //im本身库初始化
panic(err)
}
if err := db2.InitZhimengDB(cfg.ZhimengDB); err != nil {
panic(err)
}
channel := make(chan int, 0) //开辟管道,缓冲为
go db.InitDBs(channel)
<-channel


+ 40
- 0
super_cloud_issuance/db/db_cloud_bundle.go View File

@@ -0,0 +1,40 @@
package db

import (
model2 "applet/super_cloud_issuance/db/model"
"errors"

"xorm.io/xorm"
)

// GetCloudBundleByVersion is 根据版本 获取打包记录
func GetCloudBundleByVersion(Db *xorm.Engine, appverison string, os int) (*model2.CloudBundle, error) {
m := new(model2.CloudBundle)
has, err := Db.Where("version = ? and os = ?", appverison, os).Get(m)
if err != nil {
return nil, err
}
if !has {
return nil, errors.New("not Found")
}
return m, nil
}

// GetCloudBundleByVersionPlatform is 根据版本\os 获取打包记录
func GetCloudBundleByVersionPlatform(Db *xorm.Engine, appverison string, platform string) (*model2.CloudBundle, error) {
m := new(model2.CloudBundle)
var tag int
if platform == "ios" {
tag = 2
} else {
tag = 1
}
has, err := Db.Where("version = ? and os=?", appverison, tag).Get(m)
if err != nil {
return nil, err
}
if !has {
return nil, errors.New("not Found")
}
return m, nil
}

+ 21
- 0
super_cloud_issuance/db/db_order.go View File

@@ -0,0 +1,21 @@
package db

import (
"applet/app/db/model"
"applet/app/utils"
"fmt"
"xorm.io/xorm"
)

func OrderListPaidPriceByUIDByOrderTypeByTime(Db *xorm.Engine, uid, buyType, state, stime, etime interface{}) (float64, error) {

str := fmt.Sprintf("uid = %s AND order_type = %s AND ( state in (%s) or settle_at>0) AND create_at > %s AND create_at < %s",
utils.AnyToString(uid), buyType, state, stime, etime)
fmt.Println("============test订单数=================")
fmt.Println(str)
total, _ := Db.Where("is_game_invite=1 and uid = ? AND create_at > ? AND create_at < ? and settle_at=0", uid, stime, etime).In("state", state).Sum(&model.OrdList{}, "paid_price")
total1, _ := Db.Where("is_game_invite=1 and uid = ? AND create_at > ? AND create_at < ? and settle_at>0", uid, stime, etime).Sum(&model.OrdList{}, "paid_price")
fmt.Println(total)

return total + total1, nil
}

+ 27
- 0
super_cloud_issuance/db/db_provider.go View File

@@ -0,0 +1,27 @@
package db

import (
model2 "applet/super_cloud_issuance/db/model"
"xorm.io/xorm"
)

func GetProvider(eg *xorm.Engine, types string) map[string]string {
var data []model2.ProviderIcon
err := eg.Where("type=?", types).Find(&data)
if err != nil {
return nil
}
list := make(map[string]string)
for _, v := range data {
list[v.Pvd] = v.Icon
}
return list
}
func GetProviderOne(eg *xorm.Engine, id string) *model2.ProviderIcon {
var data model2.ProviderIcon
get, err := eg.Where("id=?", id).Get(&data)
if get == false || err != nil {
return nil
}
return &data
}

+ 104
- 0
super_cloud_issuance/db/db_sys_cfg.go View File

@@ -0,0 +1,104 @@
package db

import (
"applet/app/db/model"
"applet/app/md"
"applet/app/utils/cache"
"applet/app/utils/logx"
"fmt"
"xorm.io/xorm"
)

// 系统配置get
func SysCfgGetAll(Db *xorm.Engine) (*[]model.SysCfg, error) {
var cfgList []model.SysCfg
if err := Db.Cols("key,val,memo").Find(&cfgList); err != nil {
return nil, logx.Error(err)
}
return &cfgList, nil
}

// 获取一条记录
func SysCfgGetOne(Db *xorm.Engine, key string) (*model.SysCfg, error) {
var cfgList model.SysCfg
if has, err := Db.Where("`key`=?", key).Get(&cfgList); err != nil || has == false {
return nil, logx.Error(err)
}
return &cfgList, nil
}

// 单条记录获取DB
func SysCfgGetWithDb(eg *xorm.Engine, masterId string, HKey string) string {
cacheKey := fmt.Sprintf(md.AppCfgCacheKey, masterId) + HKey
get, err := cache.GetString(cacheKey)
if err != nil || get == "" {
cfg, err := SysCfgGetOne(eg, HKey)
if err != nil || cfg == nil {
_ = logx.Error(err)
return ""
}

// key是否存在
cacheKeyExist := false
if cache.Exists(cacheKey) {
cacheKeyExist = true
}

// 设置缓存
_, err = cache.Set(cacheKey, cfg.Val)
if err != nil {
_ = logx.Error(err)
return ""
}
if !cacheKeyExist { // 如果是首次设置 设置过期时间
_, err := cache.Expire(cacheKey, md.CfgCacheTime)
if err != nil {
_ = logx.Error(err)
return ""
}
}
return cfg.Val
}
return get
}

// 多条记录获取DB
func SysCfgFindWithDb(eg *xorm.Engine, masterId string, keys ...string) map[string]string {
res := map[string]string{}
//TODO::判断keys长度(大于5个直接查数据库)
if len(keys) > 5 {
cfgList, _ := SysCfgGetAll(eg)
if cfgList == nil {
return nil
}
for _, v := range *cfgList {
res[v.Key] = v.Val
}
} else {
for _, key := range keys {
res[key] = SysCfgGetWithDb(eg, masterId, key)
}
}
return res
}

// 返回最后插入id
func SysCfgInsert(Db *xorm.Engine, key, val, memo string) bool {
cfg := model.SysCfg{Key: key, Val: val, Memo: memo}
_, err := Db.InsertOne(&cfg)
if err != nil {
logx.Error(err)
return false
}
return true
}

func SysCfgUpdate(Db *xorm.Engine, key, val, memo string) bool {
cfg := model.SysCfg{Key: key, Val: val, Memo: memo}
_, err := Db.Where("`key`=?", key).Cols("val,memo").Update(&cfg)
if err != nil {
logx.Error(err)
return false
}
return true
}

+ 79
- 0
super_cloud_issuance/db/db_sys_mod.go View File

@@ -0,0 +1,79 @@
package db

import (
"applet/app/utils/logx"
model2 "applet/super_cloud_issuance/db/model"
"xorm.io/xorm"
)

// 返回所有, 不管是否显示
func SysModFindAll(Db *xorm.Engine) (*[]model2.SysModule, error) {
var m []model2.SysModule
if err := Db.Find(&m); err != nil {
return nil, err
}
return &m, nil
}

// 查找主模块数据
func SysModFindMain(Db *xorm.Engine) (*[]model2.SysModule, error) {
var m []model2.SysModule
if err := Db.Where("mod_pid = 0 AND state = 1 AND position = 'base'").
Asc("sort").
Find(&m); err != nil {
return nil, err
}
return &m, nil
}

// 用IDS找对应模块数据
func SysModFindByIds(Db *xorm.Engine, ids ...int) (*[]model2.SysModule, error) {
var m []model2.SysModule
if err := Db.In("mod_id", ids).Where("state = 1").
Cols("mod_id,mod_pid,mod_name,position,skip_identifier,title,subtitle,url,margin,aspect_ratio,icon,img,font_color,bg_img,bg_color,bg_color_t,badge,path,data,sort").
Asc("sort").Find(&m); err != nil {
return nil, err
}

return &m, nil
}

// SysModFindByPosition is 根据位置查找对应模块
func SysModFindByPosition(Db *xorm.Engine, positions ...string) (*[]model2.SysModule, error) {
var m []model2.SysModule
if err := Db.In("position", positions).Where("state = 1").Find(&m); err != nil {
return nil, err
}
return &m, nil
}

// SysModFindByTemplateIDAndSkip is 根据模板id 查找对应模块
func SysModFindByTemplateIDAndSkip(Db *xorm.Engine, id interface{}, skip string) (*model2.SysModule, error) {
var m model2.SysModule
if has, err := Db.Where("state = 1 AND template_id = ? AND skip_identifier = ?", id, skip).
Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// SysModFindByTemplateIDAndPID is 根据模板id 和pid =0 查找父模块
func SysModFindByTemplateIDAndPID(Db *xorm.Engine, id interface{}, pid interface{}) (*model2.SysModule, error) {
var m model2.SysModule
if has, err := Db.Where("state = 1 AND template_id = ? AND mod_pid = ?", id, pid).
Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}

return &m, nil
}

// SysModFindByTemplateIDAndModName is 根据模板id 和mod name 查找模块
func SysModFindByTemplateIDAndModName(Db *xorm.Engine, id interface{}, modName string) (*model2.SysModule, error) {
var m model2.SysModule
if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = ?", id, modName).
Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

+ 156
- 0
super_cloud_issuance/db/db_sys_mod_format_img.go View File

@@ -0,0 +1,156 @@
package db

import (
"applet/app/cfg"
"applet/app/utils/logx"
"fmt"
"github.com/syyongx/php2go"
"regexp"
"strings"

"github.com/gin-gonic/gin"
)

func ReformatStr(str string, c *gin.Context) string {
protocol := SysCfgGet(c, "file_bucket_scheme")
domain := SysCfgGet(c, "file_bucket_host")

// PNG
replaceList := reformatPng(str)
l := removeDuplicateElement(replaceList)
for _, s := range l {
if strings.Contains(s, "http") {
continue
}
s = strings.ReplaceAll(s, `\`, "")
s = php2go.Rawurlencode(s)
new := fmt.Sprintf("%s://%s/%s", protocol, domain, s)
if skipHTTPPng(new) {
continue
}
ss := s
s = strings.ReplaceAll(s, `"`, "")
str = strings.Replace(str, ss, `"`+new+`"`, -1)
}

// JPG
replaceList = reformatJPG(str)
l = removeDuplicateElement(replaceList)
for _, s := range l {
if strings.Contains(s, "http") {
continue
}
s = strings.ReplaceAll(s, `\`, "")
s = php2go.Rawurlencode(s)
new := fmt.Sprintf("%s://%s/%s", protocol, domain, s)
if skipHTTPPng(new) {
continue
}
ss := s
s = strings.ReplaceAll(s, `"`, "")
str = strings.Replace(str, ss, `"`+new+`"`, -1)
}

// GIF
replaceList = reformatGIF(str)
l = removeDuplicateElement(replaceList)
for _, s := range l {
if strings.Contains(s, "http") {
continue
}
s = strings.ReplaceAll(s, `\`, "")
s = php2go.Rawurlencode(s)
new := fmt.Sprintf("%s://%s/%s", protocol, domain, s)
if skipHTTPPng(new) {
continue
}
ss := s
s = strings.ReplaceAll(s, `"`, "")
str = strings.Replace(str, ss, `"`+new+`"`, -1)
}

return str
}

// 正则匹配
func reformatPng(data string) []string {
re, _ := regexp.Compile(`"([^\"]*.png")`)
list := re.FindAllString(data, -1)
return list
}

func skipHTTPPng(data string) bool {
re, _ := regexp.Compile(`(http|https):\/\/([^\"]*.png)`)
return re.MatchString(data)
}

// 正则匹配
func reformatJPG(data string) []string {
re, _ := regexp.Compile(`"([^\"]*.jpg")`)
list := re.FindAllString(data, -1)
return list
}

// 正则匹配
func reformatGIF(data string) []string {
re, _ := regexp.Compile(`"([^\"]*.gif")`)
list := re.FindAllString(data, -1)
return list
}

func removeDuplicateElement(addrs []string) []string {
result := make([]string, 0, len(addrs))
temp := map[string]int{}
i := 1
for _, item := range addrs {
if _, ok := temp[item]; !ok {
temp[item] = i
result = append(result, item)
continue
}
temp[item] = temp[item] + 1
}
// fmt.Println(temp)
return result
}

// 单挑记录获取
func SysCfgGet(c *gin.Context, key string) string {
eg := DBs[c.GetString("mid")]
if !cfg.Prd {
myCfg, err := SysCfgGetOne(eg, key)
if err != nil || myCfg == nil {
_ = logx.Error(err)
return ""
}
return myCfg.Val
}
res := SysCfgFind(c, key)
//fmt.Println(res)
if _, ok := res[key]; !ok {
return ""
}
return res[key]
}

// 多条记录获取
func SysCfgFind(c *gin.Context, keys ...string) map[string]string {
masterId := c.GetString("mid")
eg := DBs[c.GetString("mid")]
res := map[string]string{}
//TODO::判断keys长度(大于5个直接查数据库)
if len(keys) > 5 {
cfgList, _ := SysCfgGetAll(eg)
if cfgList == nil {
return nil
}
for _, v := range *cfgList {
res[v.Key] = v.Val
}
} else {
for _, key := range keys {
res[key] = SysCfgGetWithDb(eg, masterId, key)
}
}
return res
}

+ 298
- 0
super_cloud_issuance/db/db_user.go View File

@@ -0,0 +1,298 @@
package db

import (
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"fmt"
"xorm.io/xorm"
)

// UserisExistByUsernameAndPassword is usernameAndPassword exist
func UserisExistByUsernameAndPassword(Db *xorm.Engine, username string, password string) (bool, error) {

has, err := Db.Where("username = ? AND password = ?", username, utils.Md5(password)).Exist(&model.User{})

if err != nil {
return false, err
}
return has, nil
}

// UserisExistByMobile is exist
func UserisExistByMobile(Db *xorm.Engine, n string) (bool, error) {
has, err := Db.Where("phone = ?", n).Exist(&model.User{})

if err != nil {
return false, err
}
return has, nil
}

// UserInByUIDByLevel is In查询 以及是否是有效用户
func UserInByUIDByLevel(Db *xorm.Engine, ids []int, levelID interface{}) (*[]model.User, error) {
var m []model.User
if err := Db.In("uid", ids).Where("level = ?", levelID).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserFindByMobile search user by mobile
func UserFindByMobile(Db *xorm.Engine, mobile string) (*model.User, error) {
var m model.User
if has, err := Db.Where("(phone = ? OR uid = ?) AND delete_at = 0", mobile, mobile).
Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserFindExistByMobile search user by mobile
func UserFindExistByMobile(Db *xorm.Engine, mobile string) (*model.User, bool, error) {
var m model.User
has, err := Db.Where("(phone = ? OR uid = ?) AND delete_at = 0", mobile, mobile).Get(&m)
if err != nil {
logx.Infof("UserFindExistByMobile err")
return nil, false, logx.Warn(err)
}
return &m, has, nil
}

// UserFindByMobile search user by mobile
func UserFindByMobileAll(Db *xorm.Engine, mobile string) (*model.User, error) {
var m model.User
if has, err := Db.Where("(phone = ? OR uid = ?)", mobile, mobile).
Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserGetByMobileIgnoreDelete search user by mobile ignore delete
func UserGetByMobileIgnoreDelete(Db *xorm.Engine, mobile string) (*model.User, bool, error) {
m := new(model.User)
has, err := Db.Where("phone = ?", mobile).Get(m)
if err != nil {
return nil, false, logx.Warn(err)
}
return m, has, nil
}

// UsersFindByMobileLike search users by mobile
func UsersFindByMobileLike(Db *xorm.Engine, mobile string) (*[]model.User, error) {
var m []model.User
if err := Db.Where("phone like ?", "%"+mobile+"%").
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersFindByNickNameLike search users by nickname
func UsersFindByNickNameLike(Db *xorm.Engine, nickname string) (*[]model.User, error) {
var m []model.User
if err := Db.Where("nickname like ?", "%"+nickname+"%").
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

//UsersInByIds is 根据ids 查找users
func UsersInByIds(Db *xorm.Engine, ids []int, limit, start int) (*[]model.User, error) {
var m []model.User
if limit == 0 && start == 0 {
if err := Db.In("uid", ids).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.In("uid", ids).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

//UsersInByIdsWhereLv is 根据ids和 lv会员等级 查找users
func UsersInByIdsWhereLv(Db *xorm.Engine, ids []int, lv interface{}, limit, start int) (*[]model.User, error) {
var m []model.User
if limit == 0 && start == 0 {
if err := Db.Where("level = ?", lv).In("uid", ids).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("level = ?", lv).In("uid", ids).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

//UsersInByIdsByAscWhereLv is 根据ids和 lv会员等级 查找users 升排序
func UsersInByIdsByAscWhereLv(Db *xorm.Engine, ids []int, lv interface{}, limit, start int, c string) (*[]model.User, error) {
var m []model.User
if limit == 0 && start == 0 {
if err := Db.Where("level = ?", lv).In("uid", ids).Asc(c).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("level = ?", lv).In("uid", ids).Asc(c).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

//UsersInByIdsByDescWhereLv is 根据ids和 lv会员等级 查找users 降排序
func UsersInByIdsByDescWhereLv(Db *xorm.Engine, ids []int, lv interface{}, limit, start int, c string) (*[]model.User, error) {
var m []model.User
if limit == 0 && start == 0 {
if err := Db.Where("level = ?", lv).In("uid", ids).Desc(c).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("level = ?", lv).In("uid", ids).Desc(c).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserFindByArkidUserName search user by mobile
func UserFindByArkidUserName(Db *xorm.Engine, name string) (*model.User, error) {
var m model.User
if has, err := Db.Where("username = ?", name).
Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserFindByID is find user byid
func UserFindByID(Db *xorm.Engine, id interface{}) (*model.User, error) {
var m model.User
if has, err := Db.Where("uid = ?", id).
Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

func UserFindByIDs(Db *xorm.Engine, uids []int) (*[]model.User, error) {
var m []model.User
if err := Db.In("uid", uids).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersInByIdsByDesc is 根据某列 降序
func UsersInByIdsByDesc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.User, error) {
var m []model.User
if limit == 0 && start == 0 {
if err := Db.In("uid", ids).Desc(c).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.In("uid", ids).Desc(c).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersInByIdsByAsc is 根据某列 升序
func UsersInByIdsByAsc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.User, error) {
var m []model.User
if limit == 0 && start == 0 {
if err := Db.In("uid", ids).Asc(c).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.In("uid", ids).Asc(c).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

//UserInsert is insert user
func UserInsert(Db *xorm.Engine, user *model.User) (int64, error) {
affected, err := Db.Insert(user)
if err != nil {
return 0, err
}
return affected, nil
}

// UserIsExistByMobile is mobile exist
func UserIsExistByMobile(Db *xorm.Engine, mobile string) (bool, error) {
//fmt.Println(mobile)
has, err := Db.Where("phone = ? OR uid = ?", mobile, mobile).Exist(&model.User{})
fmt.Println(has, mobile)
if err != nil {
return false, err
}
return has, nil
}

// UserIsExistByID is mobile exist by id
func UserIsExistByID(Db *xorm.Engine, id string) (bool, error) {
has, err := Db.Where("uid = ?", id).Exist(&model.User{})
if err != nil {
return false, err
}
return has, nil
}

// UserUpdate is update user
func UserUpdate(Db *xorm.Engine, uid interface{}, user *model.User, forceColums ...string) (int64, error) {
var (
affected int64
err error
)
if forceColums != nil {
affected, err = Db.Where("uid=?", uid).Cols(forceColums...).Update(user)
} else {
affected, err = Db.Where("uid=?", uid).Update(user)
}
if err != nil {
return 0, err
}
return affected, nil
}

func UserUpdateWithSession(Db *xorm.Session, uid interface{}, user *model.User, forceColums ...string) (int64, error) {
var (
affected int64
err error
)
if forceColums != nil {
affected, err = Db.Where("uid=?", uid).Cols(forceColums...).Update(user)
} else {
affected, err = Db.Where("uid=?", uid).Update(user)
}
if err != nil {
return 0, err
}
return affected, nil
}

// UserDelete is delete user
func UserDelete(Db *xorm.Engine, uid interface{}) (int64, error) {
return Db.Where("uid = ?", uid).Delete(model.User{})
}

+ 15
- 0
super_cloud_issuance/db/db_user_fin_flow.go View File

@@ -0,0 +1,15 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

// 在事务中使用,插入一条流水记录
func FinUserFlowInsertOneWithSession(session *xorm.Session, m *model.FinUserFlow) error {
_, err := session.InsertOne(m)
if err != nil {
return err
}
return nil
}

+ 92
- 0
super_cloud_issuance/db/db_user_level.go View File

@@ -0,0 +1,92 @@
package db

import (
"applet/app/db/model"
"applet/app/utils/logx"
"xorm.io/xorm"
)

//UserLevelByID is 根据用户id 获取对应的等级信息
func UserLevelByID(Db *xorm.Engine, id interface{}) (*model.UserLevel, error) {
m := new(model.UserLevel)
has, err := Db.Where("id = ?", id).Get(m)
if err != nil {
return nil, logx.Warn(err)
}
if !has {
return nil, logx.Error("Not found")
}

return m, nil
}

//UserLevelTop is 查询最高的等级
func UserLevelTop(Db *xorm.Engine) (*model.UserLevel, error) {
m := new(model.UserLevel)
has, err := Db.OrderBy("level_weight DESC").Get(m)
if err != nil {
return nil, logx.Warn(err)
}
if !has {
return nil, logx.Error("Not found")
}

return m, nil
}

//UserLevelNext is 查询下一等级
func UserLevelNext(Db *xorm.Engine, curLevelWeight int) (*model.UserLevel, error) {
m := new(model.UserLevel)
has, err := Db.Where("level_weight > ?", curLevelWeight).OrderBy("level_weight ASC").Get(m)
if err != nil {
return nil, logx.Warn(err)
}
if !has {
return nil, logx.Error("Not found")
}

return m, nil
}

// UserLevelByWeight is 根据权重获取对应的等级
func UserLevelByWeight(Db *xorm.Engine, w interface{}) (*model.UserLevel, error) {
m := new(model.UserLevel)
has, err := Db.Where("level_weight = ?", w).Get(m)
if err != nil {
return nil, logx.Warn(err)
}
if !has {
return nil, logx.Warn("Not found")
}
return m, nil
}

//UserLevelInIDescByWeight is In 查询获取 权重最低 对应等级
func UserLevelInIDescByWeightLow(Db *xorm.Engine) ([]*model.UserLevel, error) {
var ms []*model.UserLevel
if err := Db.Asc("level_weight").Limit(1).Find(&ms); err != nil {
return nil, err
}
return ms, nil

}

//UserLevelInIDescByWeight is In 查询获取对应等级 根据权重排序
func UserLevelInIDescByWeight(Db *xorm.Engine, ids []int) ([]*model.UserLevel, error) {
var ms []*model.UserLevel
if err := Db.In("id", ids).Desc("level_weight").Find(&ms); err != nil {
return nil, err
}
return ms, nil

}

// UserLevlEgAll is 获取所有开启等级并且升序返回
func UserLevlEgAll(Db *xorm.Engine) ([]*model.UserLevel, error) {
var m []*model.UserLevel
err := Db.Where("is_use = ?", 1).Asc("level_weight").Find(&m)
if err != nil {
return nil, logx.Warn(err)
}
return m, nil
}

+ 418
- 0
super_cloud_issuance/db/db_user_profile.go View File

@@ -0,0 +1,418 @@
package db

import (
"applet/app/db/model"
"applet/app/utils/logx"
"xorm.io/xorm"
)

// UserProfileFindByArkID is get userprofile by arkid
func UserProfileFindByArkID(Db *xorm.Engine, id interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("arkid_uid = ?", id).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByInviteCode is get userprofile by InviteCode
func UserProfileFindByInviteCode(Db *xorm.Engine, code string) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("invite_code = ?", code).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByInviteCode is get userprofile by InviteCode
func UserProfileFindByCustomInviteCode(Db *xorm.Engine, code string) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("custom_invite_code = ?", code).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByInviteCodes is get userprofile by InviteCode
func UserProfileFindByInviteCodes(Db *xorm.Engine, codes ...string) (*[]model.UserProfile, error) {
var m []model.UserProfile
if err := Db.In("invite_code", codes).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByCustomInviteCodes is get userprofile by CustomInviteCode
func UserProfileFindByCustomInviteCodes(Db *xorm.Engine, codes ...string) (*[]model.UserProfile, error) {
var m []model.UserProfile
if err := Db.In("custom_invite_code", codes).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByID search user_profile by userid
func UserProfileFindByID(Db *xorm.Engine, id interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("uid = ?", id).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileOrderByNew 找最新的记录
func UserProfileOrderByNew(Db *xorm.Engine) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("invite_code != ''").OrderBy("uid desc").Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByTaobaoOpenID search user_profile ByTaobaoOpenID
func UserProfileFindByTaobaoOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("third_party_taobao_oid = ?", openid).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByQQOpenID search user_profile ByTaobaoOpenID
func UserProfileFindByQQOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("third_party_qq_openid = ?", openid).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByAppleToken search user_profile AppleToken
func UserProfileFindByAppleToken(Db *xorm.Engine, token interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("third_party_apple_token = ?", token).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByWeChatOpenID search user_profile By 微信openid
func UserProfileFindByWeChatOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("third_party_wechat_openid = ?", openid).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByWeChatMiniOpenID search user_profile By 小程序openid
func UserProfileFindByWeChatMiniOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("third_party_wechat_mini_openid = ?", openid).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileFindByWeChatUnionID search user_profile By 微信唯一id
func UserProfileFindByWeChatUnionID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := Db.Where("third_party_wechat_unionid = ?", openid).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileisExistByTaobaoOpenID is exist by Taobao
func UserProfileisExistByTaobaoOpenID(Db *xorm.Engine, openid string) (bool, error) {
has, err := Db.Where("third_party_taobao_oid = ?", openid).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileisExistByQQOpenID is exist by QQ openid
func UserProfileisExistByQQOpenID(Db *xorm.Engine, openid string) (bool, error) {
has, err := Db.Where("third_party_qq_openid = ?", openid).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileisExistByAppleToken is exist by apple token
func UserProfileisExistByAppleToken(Db *xorm.Engine, token string) (bool, error) {
has, err := Db.Where("third_party_apple_token = ?", token).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileisExistByWeChatOpenID is exist by Wecaht openid
func UserProfileisExistByWeChatOpenID(Db *xorm.Engine, openid string) (bool, error) {
has, err := Db.Where("third_party_wechat_openid = ?", openid).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileisExistByWeChatMiniOpenID is exist by Wecaht openid
func UserProfileisExistByWeChatMiniOpenID(Db *xorm.Engine, openid string) (bool, error) {
has, err := Db.Where("third_party_wechat_mini_openid = ?", openid).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileisExistByWeChatUnionID is exist by Wecaht openid
func UserProfileisExistByWeChatUnionID(Db *xorm.Engine, openid string) (bool, error) {
has, err := Db.Where("third_party_wechat_unionid = ?", openid).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileisExistByRelationIDAndSpecialID is exist by RelationIdAndSpecialId
func UserProfileisExistByRelationIDAndSpecialID(Db *xorm.Engine, SpecialID, RelationID int64) (bool, error) {
has, err := Db.Where("acc_taobao_self_id = ? AND acc_taobao_share_id = ?", SpecialID, RelationID).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileisExistBySpecialID is exist by SpecialId
func UserProfileisExistBySpecialID(Db *xorm.Engine, SpecialID string) (bool, error) {
has, err := Db.Where("acc_taobao_self_id = ? ", SpecialID).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileCountByRelationID 统计relationID数量
func UserProfileCountByRelationID(Db *xorm.Engine) (total int64, err error) {
relate := new(model.UserProfile)
total, err = Db.Where("acc_taobao_share_id > 0").Count(relate)
return
}

// UserProfileCountByPUID 统计直推下级数量
func UserProfileCountByPUID(Db *xorm.Engine, puid int) (total int64, err error) {
relate := new(model.UserProfile)
total, err = Db.Where("parent_uid = ?", puid).Count(relate)
return
}

// UserProfileisExistByRelationID is exist by RelationID
func UserProfileisExistByRelationID(Db *xorm.Engine, RelationID string) (bool, error) {
has, err := Db.Where("acc_taobao_share_id = ? ", RelationID).Exist(&model.UserProfile{})

if err != nil {
return false, err
}
return has, nil
}

// UserProfileFindByIDs is in sql by ids
func UserProfileFindByIDs(Db *xorm.Engine, uids ...int) (*[]model.UserProfile, error) {
var m []model.UserProfile
if err := Db.In("uid", uids).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileByPuid search user_profile by parent_uid
func UserProfileByPuid(Db *xorm.Engine, puid interface{}) (*[]model.UserProfile, error) {
var m []model.UserProfile
if err := Db.Where("parent_uid = ?", puid).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersProfileInByIds is profiles by ids
func UsersProfileInByIds(Db *xorm.Engine, ids []int, limit, start int) (*[]model.UserProfile, error) {
var m []model.UserProfile
if limit == 0 && start == 0 {
if err := Db.In("uid", ids).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.In("uid", ids).Limit(limit, start).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersProfileInByUIDByisVerify is In查询 以及是否是有效用户
func UsersProfileInByUIDByisVerify(Db *xorm.Engine, ids []int, isVerify interface{}) (*[]model.UserProfile, error) {
var m []model.UserProfile
if err := Db.In("uid", ids).Where("is_verify = ?", isVerify).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
func UsersProfileInByUIDByisVerifyByTime(Db *xorm.Engine, puid, stime, etime interface{}) (*[]model.UserProfile, error) {
var m []model.UserProfile
if err := Db.Where("parent_uid = ? and is_verify = ? and is_old=0 and is_game_invite = ? AND create_time > ? AND create_time < ?", puid, 1, 1, stime, etime).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersProfileInByIdsByDesc is 根据某列 降序
func UsersProfileInByIdsByDesc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.UserProfile, error) {
var m []model.UserProfile
if limit == 0 && start == 0 {
if err := Db.In("uid", ids).Desc(c).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.In("uid", ids).Desc(c).Limit(limit, start).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersProfileInByIdsByAsc is 根据某列 升序
func UsersProfileInByIdsByAsc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.UserProfile, error) {
var m []model.UserProfile
if limit == 0 && start == 0 {
if err := Db.In("uid", ids).Asc(c).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.In("uid", ids).Asc(c).Limit(limit, start).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UsersProfileByAll is 查询所有分享id大于0的数据
func UsersProfileByTaobaoShateIdNotNull(Db *xorm.Engine, limit, start int) (*[]model.UserProfile, error) {
var m []model.UserProfile
if err := Db.Where("acc_taobao_share_id > 0").Limit(limit, start).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserProfileIsExistByUserID is mobile exist
func UserProfileIsExistByUserID(Db *xorm.Engine, id int) (bool, error) {
has, err := Db.Where("uid = ?", id).Exist(&model.UserProfile{})
if err != nil {
return false, err
}
return has, nil
}

// UserProfileIsExistByInviteCode is exist ?
func UserProfileIsExistByInviteCode(Db *xorm.Engine, code string) (bool, error) {
has, err := Db.Where("invite_code = ?", code).Exist(&model.UserProfile{})
if err != nil {
return false, err
}
return has, nil
}

// UserProfileIsExistByCustomInviteCode is exist ?
func UserProfileIsExistByCustomInviteCode(Db *xorm.Engine, code string) (bool, error) {
has, err := Db.Where("custom_invite_code = ?", code).Exist(&model.UserProfile{})
if err != nil {
return false, err
}
return has, nil
}

// UserProfileInsert is insert user
func UserProfileInsert(Db *xorm.Engine, userProfile *model.UserProfile) (int64, error) {
affected, err := Db.Insert(userProfile)
if err != nil {
return 0, err
}
return affected, nil
}

// UserProfileUpdate is update userprofile
func UserProfileUpdate(Db *xorm.Engine, uid interface{}, userProfile *model.UserProfile, forceCols ...string) (int64, error) {
var (
affected int64
err error
)
if forceCols != nil {
affected, err = Db.Where("uid=?", uid).Cols(forceCols...).Update(userProfile)
} else {
affected, err = Db.Where("uid=?", uid).Update(userProfile)
}
if err != nil {
return 0, logx.Warn(err)
}
return affected, nil
}

// UserProfileUpdateByArkID is update userprofile
func UserProfileUpdateByArkID(Db *xorm.Engine, arkid interface{}, userProfile *model.UserProfile, forceCols ...string) (int64, error) {
var (
affected int64
err error
)
if forceCols != nil {
affected, err = Db.Where("arkid_uid=?", arkid).Cols(forceCols...).Update(userProfile)
} else {
affected, err = Db.Where("arkid_uid=?", arkid).Update(userProfile)
}
if err != nil {
return 0, logx.Warn(err)
}
return affected, nil
}

// UserProfileDelete is delete user profile
func UserProfileDelete(Db *xorm.Engine, uid interface{}) (int64, error) {
return Db.Where("uid = ?", uid).Delete(model.UserProfile{})
}

func UserProfileFindByIdWithSession(session *xorm.Session, uid int) (*model.UserProfile, error) {
var m model.UserProfile
if has, err := session.Where("uid = ?", uid).Get(&m); err != nil || has == false {
return nil, logx.Warn(err)
}
return &m, nil
}

// 在事务中更新用户信息
func UserProfileUpdateWithSession(session *xorm.Session, uid interface{}, userProfile *model.UserProfile, forceCols ...string) (int64, error) {
var (
affected int64
err error
)
if forceCols != nil {
affected, err = session.Where("uid=?", uid).Cols(forceCols...).Update(userProfile)
} else {
affected, err = session.Where("uid=?", uid).Update(userProfile)
}
if err != nil {
return 0, logx.Warn(err)
}
return affected, nil
}

+ 213
- 0
super_cloud_issuance/db/db_user_relate.go View File

@@ -0,0 +1,213 @@
package db

import (
"applet/app/db/model"
"applet/app/utils/logx"

"xorm.io/xorm"
)

// UserRelateInsert is 插入一条数据到用户关系表
func UserRelateInsert(Db *xorm.Engine, userRelate *model.UserRelate) (int64, error) {
affected, err := Db.Insert(userRelate)
if err != nil {
return 0, err
}
return affected, nil
}

//UserRelateByPuid is 获取用户关系列表 by puid
func UserRelatesByPuid(Db *xorm.Engine, puid interface{}, limit, start int) (*[]model.UserRelate, error) {
var m []model.UserRelate
if limit == 0 && start == 0 {
if err := Db.Where("parent_uid = ?", puid).
Cols(`id,parent_uid,uid,level,invite_time`).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("parent_uid = ?", puid).
Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}

return &m, nil
}

//UserRelatesByPuidByLv is 获取用户关系列表 by puid 和lv
func UserRelatesByPuidByLv(Db *xorm.Engine, puid, lv interface{}, limit, start int) (*[]model.UserRelate, error) {
var m []model.UserRelate
if limit == 0 && start == 0 {
if err := Db.Where("parent_uid = ? AND level = ?", puid, lv).
Cols(`id,parent_uid,uid,level,invite_time`).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("parent_uid = ? AND level = ?", puid, lv).
Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}

return &m, nil
}

//UserRelatesByPuidByLvByTime is 获取直属 level =1用户关系列表 by puid 和lv by time
func UserRelatesByPuidByLvByTime(Db *xorm.Engine, puid, lv, stime, etime interface{}, limit, start int) (*[]model.UserRelate, error) {
var m []model.UserRelate
if limit == 0 && start == 0 {
if err := Db.Where("parent_uid = ? AND level = ? AND invite_time > ? AND invite_time < ?", puid, lv, stime, etime).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("parent_uid = ? AND level = ? AND invite_time > ? AND invite_time < ?", puid, lv, stime, etime).
Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}

return &m, nil
}

//UserRelatesByPuidByTime is 获取户关系列表 by puid 和lv by time
func UserRelatesByPuidByTime(Db *xorm.Engine, puid, stime, etime interface{}, limit, start int) (*[]model.UserRelate, error) {
var m []model.UserRelate
if limit == 0 && start == 0 {
if err := Db.Where("parent_uid = ? AND invite_time > ? AND invite_time < ?", puid, stime, etime).
Cols(`id,parent_uid,uid,level,invite_time`).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("parent_uid = ? AND invite_time > ? AND invite_time < ?", puid, stime, etime).
Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}

return &m, nil
}

//UserRelatesByPuidExceptLv is 获取用户关系列表 by puid 和非 lv
func UserRelatesByPuidExceptLv(Db *xorm.Engine, puid, lv interface{}, limit, start int) (*[]model.UserRelate, error) {
var m []model.UserRelate
if limit == 0 && start == 0 {
if err := Db.Where("parent_uid = ? AND level != ?", puid, lv).
Cols(`id,parent_uid,uid,level,invite_time`).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}
if err := Db.Where("parent_uid = ? AND level != ?", puid, lv).
Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start).
Find(&m); err != nil {
return nil, logx.Warn(err)
}

return &m, nil
}

//UserRelateByUID is 获取用户关系表 by uid
func UserRelateByUID(Db *xorm.Engine, uid interface{}) (*model.UserRelate, bool, error) {
r := new(model.UserRelate)
has, err := Db.Where("uid=?", uid).Get(r)
if err != nil {
return nil, false, err
}
return r, has, nil
}

//UserRelateByUIDByLv is 获取用户关系表 by uid
func UserRelateByUIDByLv(Db *xorm.Engine, uid, lv interface{}) (*model.UserRelate, bool, error) {
r := new(model.UserRelate)
has, err := Db.Where("uid=? AND level=?", uid, lv).Get(r)
if err != nil {
return nil, false, err
}
return r, has, nil
}

//UserRelateByUIDAndPUID 根据 Puid 和uid 查找 ,用于确认关联
func UserRelateByUIDAndPUID(Db *xorm.Engine, uid, puid interface{}) (*model.UserRelate, bool, error) {
r := new(model.UserRelate)
has, err := Db.Where("uid=? AND parent_uid=?", uid, puid).Get(r)
if err != nil {
return nil, false, err
}
return r, has, nil
}

//UserRelatesByPuIDAndLv is 查询用户关系表 获取指定等级和puid的关系
func UserRelatesByPuIDAndLv(Db *xorm.Engine, puid, lv interface{}) (*[]model.UserRelate, error) {
var m []model.UserRelate
if err := Db.Where("parent_uid = ? AND level = ?", puid, lv).
Cols(`id,parent_uid,uid,level,invite_time`).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserRelateInByUID is In查询
func UserRelateInByUID(Db *xorm.Engine, ids []int) (*[]model.UserRelate, error) {
var m []model.UserRelate
if err := Db.In("uid", ids).
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

// UserRelatesByUIDDescLv is Where 查询 根据level 降序
func UserRelatesByUIDDescLv(Db *xorm.Engine, id interface{}) (*[]model.UserRelate, error) {
var m []model.UserRelate
if err := Db.Where("uid = ?", id).Desc("level").
Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
}

//UserRelateCountByPUID is 根据puid 计数
func UserRelateCountByPUID(Db *xorm.Engine, pid interface{}) (int64, error) {

count, err := Db.Where("parent_uid = ?", pid).Count(model.UserRelate{})
if err != nil {
return 0, nil
}
return count, nil
}

//UserRelateDelete is 删除关联他上级的关系记录,以及删除他下级的关联记录
func UserRelateDelete(Db *xorm.Engine, uid interface{}) (int64, error) {
// 删除与之上级的记录
_, err := Db.Where("uid = ?", uid).Delete(model.UserRelate{})
if err != nil {
return 0, err
}
// 删除与之下级的记录
_, err = Db.Where("parent_uid = ?", uid).Delete(model.UserRelate{})
if err != nil {
return 0, err
}

return 1, nil
}

//UserRelateDelete is 删除关联他上级的关系记录
func UserRelateExtendDelete(Db *xorm.Engine, uid interface{}) (int64, error) {
// 删除与之上级的记录
_, err := Db.Where("uid = ?", uid).Delete(model.UserRelate{})
if err != nil {
return 0, err
}
return 1, nil
}

+ 35
- 0
super_cloud_issuance/db/db_user_virtual_amount.go View File

@@ -0,0 +1,35 @@
package db

import (
"applet/app/db/model"
"applet/app/utils"
"xorm.io/xorm"
)

func GetUserVirtualAmountOne(session *xorm.Session, uid int, coinId int) (*model.UserVirtualAmount, error) {

var m model.UserVirtualAmount
isExist, err := session.Table("user_virtual_amount").Where("uid = ? AND coin_id = ?", uid, coinId).Get(&m)
if err != nil {
return nil, err
}
if !isExist {
return nil, nil
}
return &m, nil

}
func GetUserVirtualAmountSum(eg *xorm.Engine, uid int, coinId int) (string, error) {
//TODO 后面针对单个虚拟币
var m model.UserVirtualAmount
sum, err := eg.Table("user_virtual_amount").Where("uid = ? ", uid).Sum(&m, "amount")
if err != nil {
return "0", err
}
return utils.Float64ToStr(sum), nil

}

/*func UserVirtualAmountUpdateWithSession(session *xorm.Session, m *model.UserVirtualAmount) bool {

}*/

+ 63
- 0
super_cloud_issuance/db/db_virtual_coin.go View File

@@ -0,0 +1,63 @@
package db

import (
"applet/app/db/model"
"applet/app/md"
"applet/app/utils/cache"
"errors"
"fmt"
"xorm.io/xorm"
)

func GetVirtualCoinList(eg *xorm.Engine, masterId string) ([]*model.VirtualCoin, error) {
var m []*model.VirtualCoin
cacheKey := fmt.Sprintf(md.VirtualCoinCfgCacheKey, masterId)

err := cache.GetJson(cacheKey, &m)
if err != nil || len(m) == 0 {
err := eg.Where("is_use=1").Find(&m)
if err != nil {
return nil, err
}
cache.SetJson(cacheKey, m, md.CfgCacheTime)
}

return m, nil
}

// InsertUserVirtualFlow 插入一条虚拟币流水
func InsertUserVirtualFlow(eg *xorm.Engine, m model.UserVirtualCoinFlow) error {
insert, err := eg.Insert(m)
if err != nil {
return err
}
if insert == 0 {
return errors.New("插入虚拟币流水错误")
}

return nil
}

func InsertUserVirtualFlowWithSess(sess *xorm.Session, m model.UserVirtualCoinFlow) error {
insert, err := sess.Insert(m)
if err != nil {
return err
}
if insert == 0 {
return errors.New("插入虚拟币流水错误")
}

return nil
}

func GetBlockCoin(eg *xorm.Engine) (*model.VirtualCoin, error) {
var m model.VirtualCoin
get, err := eg.Where("is_block = 1").Get(&m)
if err != nil {
return nil, err
}
if get {
return &m, nil
}
return nil, errors.New("查询有误!")
}

+ 16
- 0
super_cloud_issuance/db/db_virtual_coin_relate.go View File

@@ -0,0 +1,16 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

// 根据订单id查出相关的数据
func GetVirtualCoinRelateListWithOrdId(engine *xorm.Engine, ordId int64) ([]*model.VirtualCoinRelate, error) {
var list []*model.VirtualCoinRelate
err := engine.Table("virtual_coin_relate").Where("oid = ?", ordId).Find(&list)
if err != nil {
return nil, err
}
return list, nil
}

+ 55
- 0
super_cloud_issuance/db/dbs_sys_cfg.go View File

@@ -0,0 +1,55 @@
package db

import (
"xorm.io/xorm"

"applet/app/db/model"
"applet/app/utils/logx"
)

// 系统配置get
func DbsSysCfgGetAll(eg *xorm.Engine) (*[]model.SysCfg, error) {
var cfgList []model.SysCfg
if err := eg.Cols("`key`,`val`").Find(&cfgList); err != nil {
return nil, logx.Error(err)
}
return &cfgList, nil
}

// 获取一条记录
func DbsSysCfgGet(eg *xorm.Engine, key string) (*model.SysCfg, error) {
var cfgList model.SysCfg
if has, err := eg.Where("`key`=?", key).Get(&cfgList); err != nil || has == false {
return nil, logx.Error(err)
}
return &cfgList, nil
}

func DbsSysCfgInsert(eg *xorm.Engine, key, val string) bool {
cfg := model.SysCfg{Key: key, Val: val}
_, err := eg.Where("`key`=?", key).Cols("val,memo").Update(&cfg)
if err != nil {
logx.Error(err)
return false
}
return true
}
func DbsSysCfgInserts(eg *xorm.Engine, key, val string) bool {
cfg := model.SysCfg{Key: key, Val: val}
_, err := eg.InsertOne(&cfg)
if err != nil {
logx.Error(err)
return false
}
return true
}

func DbsSysCfgUpdate(eg *xorm.Engine, key, val string) bool {
cfg := model.SysCfg{Key: key, Val: val}
_, err := eg.Where("`key`=?", key).Cols("val").Update(&cfg)
if err != nil {
logx.Error(err)
return false
}
return true
}

+ 17
- 0
super_cloud_issuance/db/model/cloud_bundle.go View File

@@ -0,0 +1,17 @@
package model

type CloudBundle struct {
Id int `json:"id" xorm:"not null pk autoincr INT(10)"`
Os int `json:"os" xorm:"not null default 1 comment('系统类型:1.Android; 2.IOS') TINYINT(1)"`
Version string `json:"version" xorm:"not null default '' comment('版本号') VARCHAR(255)"`
Modules string `json:"modules" xorm:"not null default '' comment('包含的模块') VARCHAR(255)"`
ApplyAt int `json:"apply_at" xorm:"comment('申请时间') INT(11)"`
FinishAt int `json:"finish_at" xorm:"comment('完成时间') INT(11)"`
State int `json:"state" xorm:"not null default 1 comment('状态:正在排队0,正在同步代码1,正在更新配置2,正在混淆3,正在打包4,正在上传5,打包成功999,异常-1') SMALLINT(5)"`
Memo string `json:"memo" xorm:"comment('备注') TEXT"`
ErrorMsg string `json:"error_msg" xorm:"comment('错误信息') TEXT"`
Src string `json:"src" xorm:"comment('包源地址') VARCHAR(255)"`
BuildId string `json:"build_id" xorm:"comment('build版本ID') VARCHAR(255)"`
BuildNumber string `json:"build_number" xorm:"default '' VARCHAR(255)"`
TemplateDuringAudit string `json:"template_during_audit" xorm:"not null default '' VARCHAR(255)"`
}

+ 18
- 0
super_cloud_issuance/db/model/db_mapping.go View File

@@ -0,0 +1,18 @@
package model

import (
"time"
)

type DbMapping struct {
DbMasterId string `json:"db_master_id" xorm:"not pk null comment('站长id') VARCHAR(32)"`
DbHost string `json:"db_host" xorm:"not null default '' comment('数据库连接(带port)') VARCHAR(255)"`
DbUsername string `json:"db_username" xorm:"not null default '' comment('数据库用户名') VARCHAR(255)"`
DbPassword string `json:"db_password" xorm:"not null default '' comment('数据库用户名密码') VARCHAR(255)"`
DbName string `json:"db_name" xorm:"not null comment('数据库名') VARCHAR(255)"`
ExternalMysql string `json:"external_mysql" xorm:"not null default '0' comment('是否外部mysql(0是内部,1是外部)') VARCHAR(255)"`
IsDev int `json:"is_dev" xorm:"not null default 0 comment('开发库是1,0是生产库') TINYINT(1)"`
CreatedAt time.Time `json:"created_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdatedAt time.Time `json:"updated_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
DeletedAt int `json:"deleted_at" xorm:"not null default 0 comment('是否已删除') TINYINT(1)"`
}

+ 30
- 0
super_cloud_issuance/db/model/fin_user_flow.go View File

@@ -0,0 +1,30 @@
package model

import (
"time"
)

type FinUserFlow struct {
Id int64 `json:"id" xorm:"pk autoincr comment('流水编号') BIGINT(20)"`
Uid int `json:"uid" xorm:"not null default 0 comment('用户id') INT(11)"`
Type int `json:"type" xorm:"not null default 0 comment('0收入,1支出') TINYINT(1)"`
Amount string `json:"amount" xorm:"not null default 0.0000 comment('变动金额') DECIMAL(11,4)"`
BeforeAmount string `json:"before_amount" xorm:"not null default 0.0000 comment('变动前金额') DECIMAL(11,4)"`
AfterAmount string `json:"after_amount" xorm:"not null default 0.0000 comment('变动后金额') DECIMAL(11,4)"`
SysFee string `json:"sys_fee" xorm:"not null default 0.0000 comment('手续费') DECIMAL(11,4)"`
PaymentType int `json:"payment_type" xorm:"not null default 1 comment('1支付宝,2微信.3手动转账') TINYINT(1)"`
OrdType string `json:"ord_type" xorm:"not null default '' comment('订单类型taobao,jd,pdd,vip,suning,kaola,own自营,withdraw提现') VARCHAR(20)"`
OrdId string `json:"ord_id" xorm:"not null default '' comment('对应订单编号') VARCHAR(50)"`
OrdTitle string `json:"ord_title" xorm:"not null default '' comment('订单标题') VARCHAR(50)"`
OrdAction int `json:"ord_action" xorm:"not null default 0 comment('10自购,11推广,12团队,20提现,21消费') TINYINT(2)"`
OrdTime int `json:"ord_time" xorm:"not null default 0 comment('下单时间or提现时间') INT(11)"`
OrdDetail string `json:"ord_detail" xorm:"not null default '' comment('记录商品ID或提现账号') VARCHAR(50)"`
ExpectedTime string `json:"expected_time" xorm:"not null default '0' comment('预期到账时间,字符串用于直接显示,结算后清除内容') VARCHAR(30)"`
State int `json:"state" xorm:"not null default 1 comment('1未到账,2已到账') TINYINT(1)"`
Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(2000)"`
OtherId int64 `json:"other_id" xorm:"not null default 0 comment('其他关联订单,具体根据订单类型判断') BIGINT(20)"`
AliOrdId string `json:"ali_ord_id" xorm:"default '' comment('支付宝订单号') VARCHAR(128)"`
CreateAt time.Time `json:"create_at" xorm:"created not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"updated not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
TransferData string `json:"transfer_data" xorm:" comment('支付宝订单号') TEXT"`
}

+ 46
- 0
super_cloud_issuance/db/model/ord_list.go View File

@@ -0,0 +1,46 @@
package model

type OrdList struct {
OrdId int64 `xorm:"pk autoincr BIGINT(20)" json:"ord_id"`
Uid int `xorm:"not null index INT(10)" json:"uid"`
PvdOid string `xorm:"not null index(IDX_PVD) VARCHAR(50)" json:"pvd_oid"`
ParentOrdId int64 `xorm:" BIGINT(20)" json:"parent_ord_id"`
Pvd string `xorm:"not null default '' index(IDX_PVD) index(IDX_PVD_ITEM) VARCHAR(8)" json:"pvd"`
ItemId string `xorm:"not null default '' index(IDX_PVD_ITEM) VARCHAR(50)" json:"item_id"`
ItemNum int `xorm:"not null default 1 TINYINT(3)" json:"item_num"`
ItemPrice float64 `xorm:"not null default 0.00 FLOAT(10,2)" json:"item_price"`
ItemCommissionRate float64 `xorm:"not null default 0.00 FLOAT(6,4)" json:"item_commission_rate"`
PaidPrice float64 `xorm:"not null default 0.00 FLOAT(10,2)" json:"paid_price"`
CostPrice float64 `xorm:"not null default 0.00 FLOAT(10,2)" json:"cost_price"`
OrderType int `xorm:"not null default 0 TINYINT(1)" json:"order_type"`
PriceType int `xorm:"not null default 0 INT(1)" json:"price_type"`
OrderCompare int `xorm:"not null default 0 TINYINT(1)" json:"order_compare"`
SubsidyFee float64 `xorm:"not null default 0.00 FLOAT(8,2)" json:"subsidy_fee"`
SubsidyRate float64 `xorm:"not null default 0.0000 FLOAT(10,4)" json:"subsidy_rate"`
UserCommission float64 `xorm:"not null default 0.000 FLOAT(8,3)" json:"user_commission"`
UserCommissionRate float64 `xorm:"not null default 0.0000 FLOAT(6,4)" json:"user_commission_rate"`
PvdCommission float64 `xorm:"not null default 0.0000 FLOAT(8,4)" json:"pvd_commission"`
PvdCommissionRate float64 `xorm:"not null default 0.0000 FLOAT(6,4)" json:"pvd_commission_rate"`
SysCommission float64 `xorm:"not null default 0.0000 FLOAT(8,4)" json:"sys_commission"`
SysCommissionRate float64 `xorm:"not null default 0.0000 FLOAT(6,4)" json:"sys_commission_rate"`
PlanCommissionId int `xorm:"not null default 0 INT(10)" json:"plan_commission_id"`
PlanCommissionState int `xorm:"not null default 0 TINYINT(1)" json:"plan_commission_state"`
Reason string `xorm:"not null default '' VARCHAR(32)" json:"reason"`
State int `xorm:"not null default 0 TINYINT(1)" json:"state"`
LockState int `xorm:"not null default 0 TINYINT(1)" json:"lock_state"`
CreateAt int `xorm:"not null default 0 INT(10)" json:"create_at"`
UpdateAt int `xorm:"not null default 0 INT(11)" json:"update_at"`
ConfirmAt int `xorm:"not null default 0 INT(10)" json:"confirm_at"`
PvdSettleAt int `xorm:"not null default 0 INT(10)" json:"pvd_settle_at"`
SettleAt int `xorm:"not null default 0 INT(10)" json:"settle_at"`
SubsidyAt int `xorm:"not null default 0 INT(10)" json:"subsidy_at"`
BenefitList string `xorm:"not null default '' index VARCHAR(200)" json:"benefit_list"`
BenefitAll float64 `xorm:"not null default 0.00 FLOAT(8,2)" json:"benefit_all"`
Data string `xorm:"not null default '' VARCHAR(2000)" json:"data"`
UpdateFrom int `xorm:"not null default 0 TINYINT(1)" json:"update_from"`
CreateFrom int `xorm:"not null default 0 TINYINT(1)" json:"create_from"`
PvdPid string `xorm:"not null default '' index VARCHAR(100)" json:"pvd_pid"`
UserReturnMoney float64 `xorm:"not null default 0.000 FLOAT(8,3)" json:"user_return_money"`
ReturnMoneySettleAt int `xorm:"not null default 0 INT(10)" json:"return_money_settle_at"`
IsSetReduce int `json:"is_set_reduce" xorm:"default 0 comment('小口袋定制设置退回 0否 1是') INT(1)"`
}

+ 9
- 0
super_cloud_issuance/db/model/provider_icon.go View File

@@ -0,0 +1,9 @@
package model

type ProviderIcon struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Icon string `json:"icon" xorm:"VARCHAR(255)"`
IconUrl string `json:"icon_url" xorm:"VARCHAR(255)"`
Pvd string `json:"pvd" xorm:"VARCHAR(255)"`
Type string `json:"type" xorm:"comment('list列表 detail 详情') VARCHAR(255)"`
}

+ 7
- 0
super_cloud_issuance/db/model/sys_cfg.go View File

@@ -0,0 +1,7 @@
package model

type SysCfg struct {
Key string `json:"key" xorm:"not null pk comment('键') VARCHAR(127)"`
Val string `json:"val" xorm:"comment('值') TEXT"`
Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(255)"`
}

+ 34
- 0
super_cloud_issuance/db/model/sys_module.go View File

@@ -0,0 +1,34 @@
package model

import (
"time"
)

type SysModule struct {
ModId int `json:"mod_id" xorm:"not null pk autoincr INT(10)"`
ModPid int `json:"mod_pid" xorm:"not null default 0 comment('父级模块ID') INT(10)"`
TemplateId int `json:"template_id" xorm:"not null default 0 comment('模板ID') INT(11)"`
ModName string `json:"mod_name" xorm:"not null default '' comment('模块名称') VARCHAR(250)"`
Position string `json:"position" xorm:"not null default '' comment('位置') VARCHAR(250)"`
SkipIdentifier string `json:"skip_identifier" xorm:"not null default '' comment('跳转标识') VARCHAR(250)"`
Title string `json:"title" xorm:"not null default '' comment('标题') VARCHAR(128)"`
Subtitle string `json:"subtitle" xorm:"not null default '' comment('副标题') VARCHAR(255)"`
Url string `json:"url" xorm:"not null default '' comment('跳转链接') VARCHAR(512)"`
Margin string `json:"margin" xorm:"not null default '0,0,0,0' comment('边距,上右下左') VARCHAR(64)"`
AspectRatio string `json:"aspect_ratio" xorm:"not null default 0.00 comment('宽高比,宽/高保留两位小数') DECIMAL(4,2)"`
Icon string `json:"icon" xorm:"not null default '' comment('图标') VARCHAR(512)"`
Img string `json:"img" xorm:"not null default '' comment('图片') VARCHAR(512)"`
FontColor string `json:"font_color" xorm:"not null default '' comment('文字颜色') VARCHAR(128)"`
BgImg string `json:"bg_img" xorm:"not null default '' comment('背景图片') VARCHAR(512)"`
BgColor string `json:"bg_color" xorm:"not null default '' comment('背景颜色') VARCHAR(512)"`
BgColorT string `json:"bg_color_t" xorm:"not null default '' comment('背景颜色过度') VARCHAR(255)"`
Badge string `json:"badge" xorm:"not null default '' comment('badge图片') VARCHAR(512)"`
Path string `json:"path" xorm:"not null default '' comment('跳转路径') VARCHAR(255)"`
Data string `json:"data" xorm:"comment('内容') TEXT"`
Sort int `json:"sort" xorm:"not null default 0 comment('排序') INT(11)"`
State int `json:"state" xorm:"not null default 1 comment('0不显示,1显示') TINYINT(1)"`
IsGlobal int `json:"is_global" xorm:"not null default 0 comment('是否全局显示') TINYINT(1)"`
Platform int `json:"platform" xorm:"not null default 1 comment('平台;1:全平台;2:App应用(ios和android);3:H5(wap);4:微信小程序;5:抖音小程序;6:百度小程序') TINYINT(1)"`
CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
}

+ 18
- 0
super_cloud_issuance/db/model/sys_push_user.go View File

@@ -0,0 +1,18 @@
package model

import (
"time"
)

type SysPushUser struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
PushId int `json:"push_id" xorm:"not null default 0 comment('sys_push_app表ID') index INT(11)"`
Uid int `json:"uid" xorm:"not null default 0 INT(11)"`
State int `json:"state" xorm:"not null default 0 comment('发送状态;0:失败;1:成功') TINYINT(1)"`
Time time.Time `json:"time" xorm:"default CURRENT_TIMESTAMP comment('发送时间') TIMESTAMP"`
SendData string `json:"send_data" xorm:"comment('发送内容,json格式') TEXT"`
Provider string `json:"provider" xorm:"not null default 'mob' comment('平台供应商,如:mob,official:官方推送') VARCHAR(16)"`
Type string `json:"type" xorm:"not null default '' comment('模板类型 | 推送类型;public;:普通推送;activity:活动通知;order_self:新订单提醒(导购自购新订单),order_team:新订单提醒(团队新订单),order_share:新订单提醒(导购分享新订单),member_register:团队成员注册成功,level_upgrade:团队成员等级升级成功,withdraw_fail:提现失败提醒,withdraw_success:提现成功提醒,comission_settle_success:佣金结算提醒(平台结算)') VARCHAR(50)"`
SendAt int `json:"send_at" xorm:"not null default 0 comment('官方活动显示时间(大于当前时间戳才显示);0为即可显示') INT(11)"`
IsRead int `json:"is_read" xorm:"not null default 0 comment('是否已读;0:未读;1:已读') TINYINT(1)"`
}

+ 19
- 0
super_cloud_issuance/db/model/sys_template.go View File

@@ -0,0 +1,19 @@
package model

import (
"time"
)

type SysTemplate struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Uid int `json:"uid" xorm:"not null default 0 INT(11)"`
Name string `json:"name" xorm:"not null default '' comment('模板名称') VARCHAR(32)"`
Title string `json:"title" xorm:"not null default '' comment('页面title字段') VARCHAR(32)"`
Type string `json:"type" xorm:"not null default 'index' comment('模板类型;index:首页;bottom:底部导航栏;member:会员中心;custom:自定义模板;share_goods_image:商品图文分享;share_goods_link:商品链接分享;share_goods_platform_xx:商品分享平台(xx对应平台类型)') VARCHAR(64)"`
Image string `json:"image" xorm:"not null default '' VARCHAR(128)"`
IsUse int `json:"is_use" xorm:"default 0 comment('是否使用;1:使用;0未使用') TINYINT(1)"`
Remark string `json:"remark" xorm:"not null default '' comment('备注') VARCHAR(128)"`
IsSystem int `json:"is_system" xorm:"not null default 0 comment('是否系统模板;0:否;1:是') TINYINT(1)"`
CreateAt time.Time `json:"create_at" xorm:"default CURRENT_TIMESTAMP TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"default CURRENT_TIMESTAMP TIMESTAMP"`
}

+ 25
- 0
super_cloud_issuance/db/model/user.go View File

@@ -0,0 +1,25 @@
package model

import (
"time"
)

type User struct {
Uid int `json:"uid" xorm:"not null pk autoincr comment('主键ID') INT(10)"`
Username string `json:"username" xorm:"not null default '' comment('用户名') index VARCHAR(50)"`
Password string `json:"password" xorm:"not null default '' comment('密码') CHAR(32)"`
Email string `json:"email" xorm:"not null default '' comment('邮箱') VARCHAR(128)"`
Phone string `json:"phone" xorm:"not null default '' comment('联系电话') VARCHAR(20)"`
Nickname string `json:"nickname" xorm:"not null default '' comment('昵称') VARCHAR(20)"`
Level int `json:"level" xorm:"not null default 0 comment('用户等级id') INT(11)"`
InviteTotal int `json:"invite_total" xorm:"not null default 0 comment('直推邀请总人数') INT(11)"`
LevelArriveAt time.Time `json:"level_arrive_at" xorm:"not null default CURRENT_TIMESTAMP comment('到达该等级的时间') TIMESTAMP"`
LevelExpireAt time.Time `json:"level_expire_at" xorm:"not null default CURRENT_TIMESTAMP comment('该等级过期时间') TIMESTAMP"`
CreateAt time.Time `json:"create_at" xorm:"created not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"updated default CURRENT_TIMESTAMP comment('最后修改资料时间') TIMESTAMP"`
LastLoginAt time.Time `json:"last_login_at" xorm:"default CURRENT_TIMESTAMP comment('最近登录时间') TIMESTAMP"`
DeleteAt int `json:"delete_at" xorm:"not null default 0 comment('是否删除;0未删除;1已删除') TINYINT(1)"`
State int `json:"state" xorm:"not null default 1 comment('0未激活,1正常,2冻结,3删除') TINYINT(1)"`
LastLoginIp string `json:"last_login_ip" xorm:"not null default '' comment('最后登录IP') VARCHAR(64)"`
RegisterIp string `json:"register_ip" xorm:"not null default '' comment('注册IP') VARCHAR(64)"`
}

+ 8
- 0
super_cloud_issuance/db/model/user_app_domain.go View File

@@ -0,0 +1,8 @@
package model

type UserAppDomain struct {
Domain string `json:"domain" xorm:"not null pk comment('绑定域名') VARCHAR(100)"`
Uuid int `json:"uuid" xorm:"not null comment('对应APP ID编号') index unique(IDX_UUID_TYPE) INT(10)"`
Type string `json:"type" xorm:"not null comment('api接口域名,wap.h5域名,admin管理后台') unique(IDX_UUID_TYPE) ENUM('admin','api','wap')"`
IsSsl int `json:"is_ssl" xorm:"not null default 0 comment('是否开启ssl:0否;1是') TINYINT(255)"`
}

+ 20
- 0
super_cloud_issuance/db/model/user_level.go View File

@@ -0,0 +1,20 @@
package model

import (
"time"
)

type UserLevel struct {
Id int `json:"id" xorm:"not null pk autoincr comment('等级id') INT(11)"`
BenefitIds string `json:"benefit_ids" xorm:"comment('该等级拥有的权益id【json】') TEXT"`
LevelName string `json:"level_name" xorm:"not null default '' comment('等级名称') VARCHAR(255)"`
LevelWeight int `json:"level_weight" xorm:"not null default 0 comment('等级权重') INT(11)"`
LevelUpdateCondition int `json:"level_update_condition" xorm:"not null default 2 comment('2是条件升级,1是无条件升级') TINYINT(1)"`
AutoAudit int `json:"auto_audit" xorm:"not null default 0 comment('(自动审核)0关闭,1开启') TINYINT(1)"`
LevelDate int `json:"level_date" xorm:"default 0 comment('会员有效期(0永久有效,单位月)') INT(11)"`
IsUse int `json:"is_use" xorm:"not null default 1 comment('是否开启(0否,1是)') TINYINT(1)"`
ChoosableNum int `json:"choosable_num" xorm:"default 0 comment('可选任务数量(当is_must_task为0时生效)') INT(6)"`
Memo string `json:"memo" xorm:"default '' comment('备注') VARCHAR(255)"`
CssSet string `json:"css_set" xorm:"TEXT"`
CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP TIMESTAMP"`
}

+ 91
- 0
super_cloud_issuance/db/model/user_profile.go View File

@@ -0,0 +1,91 @@
package model

import (
"time"
)

type UserProfile struct {
Uid int `json:"uid" xorm:"not null pk comment('关联userID') INT(20)"`
ArkidUid int `json:"arkid_uid" xorm:"not null default 0 comment('Arkid 用户ID') INT(20)"`
ParentUid int `json:"parent_uid" xorm:"not null default 0 comment('上级ID') INT(20)"`
ArkidToken string `json:"arkid_token" xorm:"not null default '' comment('token') VARCHAR(2000)"`
AvatarUrl string `json:"avatar_url" xorm:"not null default '' comment('头像URL') VARCHAR(2000)"`
CustomInviteCode string `json:"custom_invite_code" xorm:"not null default '' comment('邀请码(自定义)') VARCHAR(16)"`
InviteCode string `json:"invite_code" xorm:"not null default '' comment('邀请码(系统)') VARCHAR(16)"`
Gender int `json:"gender" xorm:"not null default 2 comment('性别0女,1男,2未知') TINYINT(1)"`
Birthday int `json:"birthday" xorm:"not null default 0 comment('出生日期') INT(10)"`
AccWxId string `json:"acc_wx_id" xorm:"not null default '' comment('账户_微信id') VARCHAR(50)"`
AccWxOpenid string `json:"acc_wx_openid" xorm:"not null default '' comment('账户_微信openid') VARCHAR(80)"`
AccTaobaoNickname string `json:"acc_taobao_nickname" xorm:"not null default '' comment('淘宝昵称') VARCHAR(50)"`
AccTaobaoAuthTime int64 `json:"acc_taobao_auth_time" xorm:"not null default 0 comment('淘宝授权备案时间') BIGINT(11)"`
AccTaobaoShareId int64 `json:"acc_taobao_share_id" xorm:"not null default 0 comment('淘宝分享relationId,') index BIGINT(12)"`
AccTaobaoSelfId int64 `json:"acc_taobao_self_id" xorm:"not null default 0 comment('淘宝自购specialId') index BIGINT(12)"`
AccJdSelfId string `json:"acc_jd_self_id" xorm:"not null default '' comment('京东自购ID') index VARCHAR(50)"`
AccJdShareId string `json:"acc_jd_share_id" xorm:"not null default '' comment('京东分享ID') index VARCHAR(50)"`
AccJdFreeId string `json:"acc_jd_free_id" xorm:"not null default '' comment('京东新人免单ID') VARCHAR(50)"`
AccSuningSelfId string `json:"acc_suning_self_id" xorm:"not null default '' comment('苏宁自购ID') index VARCHAR(50)"`
AccSuningShareId string `json:"acc_suning_share_id" xorm:"not null default '' comment('苏宁分享ID') index VARCHAR(50)"`
AccSuningFreeId string `json:"acc_suning_free_id" xorm:"not null default '' comment('苏宁新人免单ID') VARCHAR(50)"`
AccPddSelfId string `json:"acc_pdd_self_id" xorm:"not null default '' comment('拼多多自购ID') index VARCHAR(50)"`
AccPddShareId string `json:"acc_pdd_share_id" xorm:"not null default '' comment('拼多多分享ID') index VARCHAR(50)"`
AccPddFreeId string `json:"acc_pdd_free_id" xorm:"not null default '' comment('拼多多新人免单ID') VARCHAR(50)"`
AccPddBind int `json:"acc_pdd_bind" xorm:"not null default 0 comment('拼多多是否授权绑定') TINYINT(1)"`
AccVipSelfId string `json:"acc_vip_self_id" xorm:"not null default '' comment('唯品会自购ID') index VARCHAR(50)"`
AccVipShareId string `json:"acc_vip_share_id" xorm:"not null default '' comment('唯品会分享ID') index VARCHAR(50)"`
AccVipFreeId string `json:"acc_vip_free_id" xorm:"not null default '' comment('唯品会新人免单ID') VARCHAR(50)"`
AccKaolaSelfId string `json:"acc_kaola_self_id" xorm:"not null default '' comment('考拉自购ID') index VARCHAR(50)"`
AccKaolaShareId string `json:"acc_kaola_share_id" xorm:"not null default '' comment('考拉分享ID') index VARCHAR(50)"`
AccKaolaFreeId string `json:"acc_kaola_free_id" xorm:"not null default '' comment('考拉新人免单ID') VARCHAR(50)"`
AccDuomaiShareId int64 `json:"acc_duomai_share_id" xorm:"not null pk default 0 comment('多麦联盟分享ID') BIGINT(12)"`
AccAlipay string `json:"acc_alipay" xorm:"not null default '' comment('支付宝账号') VARCHAR(50)"`
AccAlipayRealName string `json:"acc_alipay_real_name" xorm:"not null default '' comment('支付宝账号真实姓名') VARCHAR(50)"`
CertTime int `json:"cert_time" xorm:"not null default 0 comment('认证时间') INT(10)"`
CertName string `json:"cert_name" xorm:"not null default '' comment('证件上名字,也是真实姓名') VARCHAR(50)"`
CertNum string `json:"cert_num" xorm:"not null default '' comment('证件号码') VARCHAR(50)"`
CertState int `json:"cert_state" xorm:"not null default 0 comment('认证状态(0为未认证,1为认证中,2为已认证,3为认证失败)') TINYINT(1)"`
FinCommission string `json:"fin_commission" xorm:"not null default 0.0000 comment('累计佣金') DECIMAL(10,4)"`
FinValid string `json:"fin_valid" xorm:"not null default 0.0000 comment('可用余额,fin=>finance财务') DECIMAL(10,4)"`
FinInvalid string `json:"fin_invalid" xorm:"not null default 0.0000 comment('不可用余额,冻结余额') DECIMAL(10,4)"`
FinSelfOrderCount int `json:"fin_self_order_count" xorm:"not null default 0 comment('自购订单数,包括未完成') INT(11)"`
FinSelfOrderCountDone int `json:"fin_self_order_count_done" xorm:"not null default 0 comment('自购已完成订单') INT(11)"`
FinSelfRebate float32 `json:"fin_self_rebate" xorm:"not null default 0.000000 comment('累积自购获得返利金额') FLOAT(14,6)"`
FinTotal float32 `json:"fin_total" xorm:"not null default 0.000000 comment('累计总收益') FLOAT(14,6)"`
Lat float32 `json:"lat" xorm:"not null default 0.000000 comment('纬度') FLOAT(15,6)"`
Lng float32 `json:"lng" xorm:"not null default 0.000000 comment('经度') FLOAT(15,6)"`
Memo string `json:"memo" xorm:"not null default '' comment('用户简述备注') VARCHAR(2048)"`
IsNew int `json:"is_new" xorm:"not null default 1 comment('是否是新用户') TINYINT(1)"`
IsVerify int `json:"is_verify" xorm:"not null default 0 comment('是否有效会员') TINYINT(1)"`
IsOrdered int `json:"is_ordered" xorm:"not null default 0 comment('是否已完成首单(0否,1是)') TINYINT(1)"`
FromWay string `json:"from_way" xorm:"not null default '' comment('注册来源:
no_captcha_phone:免验证码手机号注册;
manual_phone:手动手机验证码注册;
wx:微信授权;
wx_mp:小程序授权;
wx_pub:公众号授权;
wx_bind_phone:微信注册绑定手机号;
admin:管理员添加;taobao_bind_phone:淘宝注册绑定手机号,apple_bind_phone:苹果注册绑定手机号') VARCHAR(16)"`
HidOrder int `json:"hid_order" xorm:"not null default 0 comment('隐藏订单') TINYINT(3)"`
HidContact int `json:"hid_contact" xorm:"not null default 0 comment('隐藏联系方式') TINYINT(4)"`
NewMsgNotice int `json:"new_msg_notice" xorm:"not null default 1 comment('新消息通知') TINYINT(1)"`
WxAccount string `json:"wx_account" xorm:"not null default '' comment('微信号') VARCHAR(100)"`
WxQrcode string `json:"wx_qrcode" xorm:"not null default '' comment('微信二维码') VARCHAR(100)"`
ThirdPartyTaobaoOid string `json:"third_party_taobao_oid" xorm:"not null default '' comment('淘宝第三方登录openID') VARCHAR(100)"`
ThirdPartyTaobaoSid string `json:"third_party_taobao_sid" xorm:"not null default '' comment('淘宝第三方登录sID') VARCHAR(255)"`
ThirdPartyTaobaoAcctoken string `json:"third_party_taobao_acctoken" xorm:"not null default '' comment('淘宝第三方登录topaccesstoken') VARCHAR(100)"`
ThirdPartyTaobaoAuthcode string `json:"third_party_taobao_authcode" xorm:"not null default '' comment('淘宝第三方登录topAuthCode') VARCHAR(100)"`
ThirdPartyAppleToken string `json:"third_party_apple_token" xorm:"not null default '' comment('苹果第三方登录token') VARCHAR(1024)"`
ThirdPartyQqAccessToken string `json:"third_party_qq_access_token" xorm:"not null default '' comment('QQ第三方登录access_token') VARCHAR(255)"`
ThirdPartyQqExpiresIn string `json:"third_party_qq_expires_in" xorm:"not null default '' comment('QQ第三方登录expires_in(剩余时长)') VARCHAR(255)"`
ThirdPartyQqOpenid string `json:"third_party_qq_openid" xorm:"not null default '' comment('QQ第三方登陆openid(不变,用于认证)') VARCHAR(255)"`
ThirdPartyQqUnionid string `json:"third_party_qq_unionid" xorm:"not null default '' comment('QQ第三方登陆unionid') VARCHAR(255)"`
ThirdPartyWechatExpiresIn string `json:"third_party_wechat_expires_in" xorm:"not null default '' comment('微信第三方登录expires_in(剩余时长)') VARCHAR(255)"`
ThirdPartyWechatOpenid string `json:"third_party_wechat_openid" xorm:"not null default '' comment('微信第三方登陆openid(不变,用于认证)') VARCHAR(255)"`
ThirdPartyWechatUnionid string `json:"third_party_wechat_unionid" xorm:"not null default '' comment('微信第三方登陆unionid') VARCHAR(255)"`
ThirdPartyWechatMiniOpenid string `json:"third_party_wechat_mini_openid" xorm:"not null default '' comment('微信小程序登录open_id') VARCHAR(255)"`
ThirdPartyWechatH5Openid string `json:"third_party_wechat_h5_openid" xorm:"not null default '' comment('微信H5登录open_id') VARCHAR(255)"`
FreeRemainTime int `json:"free_remain_time" xorm:"not null default 0 comment('免单剩余次数') INT(11)"`
FreeCumulativeTime int `json:"free_cumulative_time" xorm:"not null default 0 comment('免单累计次数') INT(11)"`
IsDelete int `json:"is_delete" xorm:"not null default 0 comment('是否已删除') TINYINT(1)"`
UpdateAt time.Time `json:"update_at" xorm:"updated not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
CreateAt time.Time `json:"create_at" xorm:" not null default '' comment('更新时间') TIMESTAMP"`
}

+ 13
- 0
super_cloud_issuance/db/model/user_relate.go View File

@@ -0,0 +1,13 @@
package model

import (
"time"
)

type UserRelate struct {
Id int64 `json:"id" xorm:"pk autoincr comment('主键') BIGINT(10)"`
ParentUid int `json:"parent_uid" xorm:"not null default 0 comment('上级会员ID') unique(idx_union_u_p_id) INT(20)"`
Uid int `json:"uid" xorm:"not null default 0 comment('关联UserID') unique(idx_union_u_p_id) INT(20)"`
Level int `json:"level" xorm:"not null default 1 comment('推广等级(1直属,大于1非直属)') INT(10)"`
InviteTime time.Time `json:"invite_time" xorm:"not null default CURRENT_TIMESTAMP comment('邀请时间') TIMESTAMP"`
}

+ 13
- 0
super_cloud_issuance/db/model/user_tag.go View File

@@ -0,0 +1,13 @@
package model

import (
"time"
)

type UserTag struct {
TagId int `json:"tag_id" xorm:"not null pk autoincr INT(10)"`
TagName string `json:"tag_name" xorm:"not null default '' comment('tag名') index VARCHAR(16)"`
Uid int `json:"uid" xorm:"not null default 0 comment('用户ID,uid为0表示标签本身,用于标签管理') index INT(11)"`
Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(80)"`
CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
}

+ 8
- 0
super_cloud_issuance/db/model/user_virtual_amount.go View File

@@ -0,0 +1,8 @@
package model

type UserVirtualAmount struct {
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"`
Uid int `json:"uid" xorm:"index INT(11)"`
CoinId int `json:"coin_id" xorm:"INT(11)"`
Amount string `json:"amount" xorm:"DECIMAL(16,6)"`
}

+ 8
- 0
super_cloud_issuance/db/model/user_virtual_assets.go View File

@@ -0,0 +1,8 @@
package model

type UserVirtualAssets struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Uid int `json:"uid" xorm:"default 0 comment('用户id') INT(11)"`
Integral string `json:"integral" xorm:"default 0.0000 comment('用户积分') DECIMAL(12,4)"`
BlockIcons string `json:"block_icons" xorm:"default 0.0000 comment('区块币') DECIMAL(12,4)"`
}

+ 21
- 0
super_cloud_issuance/db/model/user_virtual_coin_flow.go View File

@@ -0,0 +1,21 @@
package model

import (
"time"
)

type UserVirtualCoinFlow struct {
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"`
Uid int `json:"uid" xorm:"not null comment('用户id') index INT(11)"`
CoinId int `json:"coin_id" xorm:"not null comment('虚拟币id') INT(11)"`
Direction int `json:"direction" xorm:"not null comment('方向:1收入 2支出') TINYINT(255)"`
Title string `json:"title" xorm:"comment('标题') VARCHAR(255)"`
OrdId string `json:"ord_id" xorm:"comment('相关的订单id') VARCHAR(255)"`
Amout string `json:"amout" xorm:"not null comment('变更数量') DECIMAL(16,6)"`
BeforeAmout string `json:"before_amout" xorm:"not null comment('变更前数量') DECIMAL(16,6)"`
AfterAmout string `json:"after_amout" xorm:"not null comment('变更后数量') DECIMAL(16,6)"`
SysFee string `json:"sys_fee" xorm:"not null default 0.000000 comment('手续费') DECIMAL(16,6)"`
CreateTime time.Time `json:"create_time" xorm:"created default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"`
TransferType int `json:"transfer_type" xorm:"comment('转账类型:1全球分红,2管理员修改,3消费,4退回,5虚拟币兑换') TINYINT(100)"`
CoinIdTo int `json:"coin_id_to" xorm:"not null default 0 comment('兑换时目标币种id') INT(11)"`
}

+ 17
- 0
super_cloud_issuance/db/model/virtual_coin.go View File

@@ -0,0 +1,17 @@
package model

type VirtualCoin struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Name string `json:"name" xorm:"not null default '' comment('名称') VARCHAR(255)"`
ExchangeRatio string `json:"exchange_ratio" xorm:"not null comment('兑换比例(与金额)') DECIMAL(5,2)"`
IsUse int `json:"is_use" xorm:"comment('是否开启:0否 1是') TINYINT(1)"`
CanExchange string `json:"can_exchange" xorm:"comment('能兑换的虚拟币id和手续费列表json') VARCHAR(255)"`
CanExchangeMoney int `json:"can_exchange_money" xorm:"not null default 0 comment('现金能否兑换:0否 1是') TINYINT(1)"`
IsBlock int `json:"is_block" xorm:"not null default 0 comment('是否区块币:0否 1是') TINYINT(1)"`
FunctionType string `json:"function_type" xorm:"comment('功能类型') VARCHAR(255)"`
CanCny int `json:"can_cny" xorm:"not null default 0 comment('是否能兑换余额:0否 1是') TINYINT(1)"`
CanTransfer int `json:"can_transfer" xorm:"not null default 0 comment('是否能支持转账:0否 1是') TINYINT(1)"`
CanBackout int `json:"can_backout" xorm:"not null default 0 comment('是否能支持转账撤回:0否 1是') TINYINT(1)"`
LimitLevelTransfer string `json:"limit_level_transfer" xorm:"default '' comment('能支持转账的用户等级') VARCHAR(600)"`
LimitLevelBackout string `json:"limit_level_backout" xorm:"comment('能支持撤回的用户等级') VARCHAR(600)"`
}

+ 12
- 0
super_cloud_issuance/db/model/virtual_coin_relate.go View File

@@ -0,0 +1,12 @@
package model

type VirtualCoinRelate struct {
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"`
Oid int64 `json:"oid" xorm:"not null default 0 comment('订单号') index unique(IDX_ORD) BIGINT(20)"`
Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') unique(IDX_ORD) index INT(10)"`
CoinId int `json:"coin_id" xorm:"comment('虚拟币id') INT(11)"`
Amount string `json:"amount" xorm:"not null default 0.000000 comment('数量') DECIMAL(16,6)"`
Pvd string `json:"pvd" xorm:"not null default '' comment('供应商taobao,jd,pdd,vip,suning,kaola,mall_goods,group_buy') index VARCHAR(255)"`
CreateAt int `json:"create_at" xorm:"not null default 0 comment('订单创建时间') index INT(10)"`
Level int `json:"level" xorm:"not null default 0 comment('0自购 1直推 大于1:间推') INT(10)"`
}

+ 41
- 0
super_cloud_issuance/db/model/wx_applet_list.go View File

@@ -0,0 +1,41 @@
package model

import (
"time"
)

type WxAppletList struct {
Id int `json:"id" xorm:"not null pk autoincr INT(10)"`
Memo string `json:"memo" xorm:"not null default '' comment('备注') unique VARCHAR(255)"`
CompanyName string `json:"company_name" xorm:"not null default '' comment('企业名(需与工商部门登记信息一致);如果是“无主体名称个体工商户”则填“个体户+法人姓名”,例如“个体户张三”') VARCHAR(255)"`
Code string `json:"code" xorm:"not null default '' comment('企业代码') VARCHAR(255)"`
CodeType int `json:"code_type" xorm:"not null default 3 comment('企业代码类型 1:统一社会信用代码(18 位) 2:组织机构代码(9 位 xxxxxxxx-x) 3:营业执照注册号(15 位)') TINYINT(3)"`
LegalPersonaWechat string `json:"legal_persona_wechat" xorm:"not null default '' comment('法人微信号') VARCHAR(255)"`
LegalPersonaName string `json:"legal_persona_name" xorm:"not null default '' comment('法人姓名(绑定银行卡)') VARCHAR(255)"`
State int `json:"state" xorm:"not null default 0 comment('创建状态(0:创建中 1:创建成功 2:创建失败)') TINYINT(3)"`
Ext string `json:"ext" xorm:"comment('拓展字段') TEXT"`
UniqueIdentifier string `json:"unique_identifier" xorm:"not null default '' comment('唯一标识符(企业名称、企业代码、法人微信、法人姓名四个字段作为每次任务的唯一标示,来区别每次任务。)') VARCHAR(255)"`
AppId string `json:"app_id" xorm:"default '' comment('小程序appId') VARCHAR(255)"`
OriginalAppId string `json:"original_app_id" xorm:"default '' comment('原始ID') VARCHAR(255)"`
AuthorizerToken string `json:"authorizer_token" xorm:"default '' comment('授权token') VARCHAR(255)"`
AuthorizerRefreshToken string `json:"authorizer_refresh_token" xorm:"default '' comment('授权更新token') VARCHAR(255)"`
AuditVersionState int `json:"audit_version_state" xorm:"not null default 0 comment('线上版本号') TINYINT(3)"`
PublishVersionNum string `json:"publish_version_num" xorm:"comment('审核状态(0:暂无审核;1:审核中;2:审核通过;3:审核驳回)') VARCHAR(255)"`
AppletName string `json:"applet_name" xorm:"default '' comment('小程序名字') VARCHAR(255)"`
AppletSignature string `json:"applet_signature" xorm:"default '' comment('小程序简介') VARCHAR(255)"`
AppletLogo string `json:"applet_logo" xorm:"default '' comment('小程序logo') VARCHAR(255)"`
SetAppletNameInfo string `json:"set_applet_name_info" xorm:"default '' comment('小程序改名证件url') VARCHAR(255)"`
SetAppletNameInfoType int `json:"set_applet_name_info_type" xorm:"default 1 comment('小程序改名证件类型(1:个人号 2:组织号)') TINYINT(3)"`
SetAppletNameState int `json:"set_applet_name_state" xorm:"default 0 comment('小程序改名状态(0:未进行 1:进行中 2:改名成功 3:改名失败)') TINYINT(3)"`
SetAppletNameAuditId string `json:"set_applet_name_audit_id" xorm:"default '' comment('小程序改名的审核单id') VARCHAR(255)"`
CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' TIMESTAMP"`
IsFilterTaobao int `json:"is_filter_taobao" xorm:"default 0 comment('是否过滤淘宝商品 0否 1是') INT(1)"`
CateId string `json:"cate_id" xorm:"default '' comment('主营类目id') VARCHAR(50)"`
BottomNavCssId int `json:"bottom_nav_css_id" xorm:"default 0 comment('底部导航样式id') INT(11)"`
AuthType string `json:"auth_type" xorm:"default 'reg' comment('授权方式 直接授权old_auth 注册授权reg') VARCHAR(100)"`
MpAuditVersion string `json:"mp_audit_version" xorm:"default '' comment('审核版本') VARCHAR(100)"`
MpAuditCssId int `json:"mp_audit_css_id" xorm:"default 0 comment('审核版本底部样式ID') INT(11)"`
AppletBgColor string `json:"applet_bg_color" xorm:"default '' comment('导航栏/状态栏背景色') VARCHAR(100)"`
AppletNavColor string `json:"applet_nav_color" xorm:"default '' comment('导航栏/状态栏字体色') VARCHAR(100)"`
}

+ 15
- 0
super_cloud_issuance/db/official/db_super_cloud_issuance_baisc.go View File

@@ -0,0 +1,15 @@
package db

import (
"applet/app/db"
"applet/app/utils/logx"
"applet/super_cloud_issuance/db/official/model"
)

func GetSuperCloudIssuanceBasic() (*model.SuperCloudIssuanceBasic, error) {
var m model.SuperCloudIssuanceBasic
if has, err := db.Db.Where("id >=1").Get(&m); err != nil || has == false {
return nil, logx.Error(err)
}
return &m, nil
}

+ 117
- 0
super_cloud_issuance/db/official/db_super_cloud_issuance_master.go View File

@@ -0,0 +1,117 @@
package db

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/super_cloud_issuance/db/official/model"
"errors"
"fmt"
"reflect"
)

// BatchSelectSuperCloudIssuanceMaster 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `SuperCloudIssuanceMasterFindByParams` 方法
func BatchSelectSuperCloudIssuanceMaster(params map[string]interface{}) (*[]model.SuperCloudIssuanceMaster, error) {
var SuperCloudIssuanceMasterData []model.SuperCloudIssuanceMaster
if err := db.Db.In(utils.AnyToString(params["key"]), params["value"]).
Find(&SuperCloudIssuanceMasterData); err != nil {
return nil, logx.Warn(err)
}
return &SuperCloudIssuanceMasterData, nil
}

// SuperCloudIssuanceMasterInsert 插入单条数据
func SuperCloudIssuanceMasterInsert(SuperCloudIssuanceMaster *model.SuperCloudIssuanceMaster) (int, error) {
_, err := db.Db.InsertOne(SuperCloudIssuanceMaster)
if err != nil {
return 0, err
}
return SuperCloudIssuanceMaster.Id, nil
}

// BatchAddSuperCloudIssuanceMaster 批量新增数据
func BatchAddSuperCloudIssuanceMaster(SuperCloudIssuanceMasterData []*model.SuperCloudIssuanceMaster) (int64, error) {
affected, err := db.Db.Insert(SuperCloudIssuanceMasterData)
if err != nil {
return 0, err
}
return affected, nil
}

func GetSuperCloudIssuanceMasterCount() int {
var SuperCloudIssuanceMaster model.SuperCloudIssuanceMaster
session := db.Db.Where("")
count, err := session.Count(&SuperCloudIssuanceMaster)
if err != nil {
return 0
}
return int(count)
}

// SuperCloudIssuanceMasterDelete 删除记录
func SuperCloudIssuanceMasterDelete(id interface{}) (int64, error) {
if reflect.TypeOf(id).Kind() == reflect.Slice {
return db.Db.In("id", id).Delete(model.SuperCloudIssuanceMaster{})
} else {
return db.Db.Where("id = ?", id).Delete(model.SuperCloudIssuanceMaster{})
}
}

// SuperCloudIssuanceMasterUpdate 更新记录
func SuperCloudIssuanceMasterUpdate(id interface{}, SuperCloudIssuanceMaster *model.SuperCloudIssuanceMaster, forceColums ...string) (int64, error) {
var (
affected int64
err error
)
if forceColums != nil {
affected, err = db.Db.Where("id=?", id).Cols(forceColums...).Update(SuperCloudIssuanceMaster)
} else {
affected, err = db.Db.Where("id=?", id).Update(SuperCloudIssuanceMaster)
}
if err != nil {
return 0, err
}
return affected, nil
}

// SuperCloudIssuanceMasterGetOneByParams 通过传入的参数查询数据(单条)
func SuperCloudIssuanceMasterGetOneByParams(params map[string]interface{}) (*model.SuperCloudIssuanceMaster, error) {
var m model.SuperCloudIssuanceMaster
var query = fmt.Sprintf("%s =?", params["key"])
if has, err := db.Db.Where(query, params["value"]).Get(&m); err != nil || has == false {
return nil, logx.Error(err)
}
return &m, nil
}

// SuperCloudIssuanceMasterFindByParams 通过传入的参数查询数据(多条)
func SuperCloudIssuanceMasterFindByParams(params map[string]interface{}) (*[]model.SuperCloudIssuanceMaster, error) {
var m []model.SuperCloudIssuanceMaster
if params["value"] == nil {
return nil, errors.New("参数有误")
}
if params["key"] == nil {
//查询全部数据
err := db.Db.Find(&m)
if err != nil {
return nil, logx.Error(err)
}
return &m, nil
} else {
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice {
//指定In查询
if err := db.Db.In(utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
} else {
var query = fmt.Sprintf("%s =?", params["key"])
err := db.Db.Where(query, params["value"]).Find(&m)
if err != nil {
return nil, logx.Error(err)
}
return &m, nil
}

}
}

+ 117
- 0
super_cloud_issuance/db/official/db_super_cloud_issuance_master_buy_ord.go View File

@@ -0,0 +1,117 @@
package db

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/super_cloud_issuance/db/official/model"
"errors"
"fmt"
"reflect"
)

// BatchSelectCloudIssuanceMasterBuyOrd 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `CloudIssuanceMasterBuyOrdFindByParams` 方法
func BatchSelectCloudIssuanceMasterBuyOrd(params map[string]interface{}) (*[]model.SuperCloudIssuanceMasterBuyOrd, error) {
var CloudIssuanceMasterBuyOrdData []model.SuperCloudIssuanceMasterBuyOrd
if err := db.Db.In(utils.AnyToString(params["key"]), params["value"]).
Find(&CloudIssuanceMasterBuyOrdData); err != nil {
return nil, logx.Warn(err)
}
return &CloudIssuanceMasterBuyOrdData, nil
}

// CloudIssuanceMasterBuyOrdInsert 插入单条数据
func CloudIssuanceMasterBuyOrdInsert(CloudIssuanceMasterBuyOrd *model.SuperCloudIssuanceMasterBuyOrd) (int, error) {
_, err := db.Db.InsertOne(CloudIssuanceMasterBuyOrd)
if err != nil {
return 0, err
}
return CloudIssuanceMasterBuyOrd.Id, nil
}

// BatchAddCloudIssuanceMasterBuyOrd 批量新增数据
func BatchAddCloudIssuanceMasterBuyOrd(CloudIssuanceMasterBuyOrdData []*model.SuperCloudIssuanceMasterBuyOrd) (int64, error) {
affected, err := db.Db.Insert(CloudIssuanceMasterBuyOrdData)
if err != nil {
return 0, err
}
return affected, nil
}

func GetCloudIssuanceMasterBuyOrdCount() int {
var CloudIssuanceMasterBuyOrd model.SuperCloudIssuanceMasterBuyOrd
session := db.Db.Where("")
count, err := session.Count(&CloudIssuanceMasterBuyOrd)
if err != nil {
return 0
}
return int(count)
}

// CloudIssuanceMasterBuyOrdDelete 删除记录
func CloudIssuanceMasterBuyOrdDelete(id interface{}) (int64, error) {
if reflect.TypeOf(id).Kind() == reflect.Slice {
return db.Db.In("id", id).Delete(model.SuperCloudIssuanceMasterBuyOrd{})
} else {
return db.Db.Where("id = ?", id).Delete(model.SuperCloudIssuanceMasterBuyOrd{})
}
}

// CloudIssuanceMasterBuyOrdUpdate 更新记录
func CloudIssuanceMasterBuyOrdUpdate(id interface{}, CloudIssuanceMasterBuyOrd *model.SuperCloudIssuanceMasterBuyOrd, forceColums ...string) (int64, error) {
var (
affected int64
err error
)
if forceColums != nil {
affected, err = db.Db.Where("id=?", id).Cols(forceColums...).Update(CloudIssuanceMasterBuyOrd)
} else {
affected, err = db.Db.Where("id=?", id).Update(CloudIssuanceMasterBuyOrd)
}
if err != nil {
return 0, err
}
return affected, nil
}

// CloudIssuanceMasterBuyOrdGetOneByParams 通过传入的参数查询数据(单条)
func CloudIssuanceMasterBuyOrdGetOneByParams(params map[string]interface{}) (*model.SuperCloudIssuanceMasterBuyOrd, error) {
var m model.SuperCloudIssuanceMasterBuyOrd
var query = fmt.Sprintf("%s =?", params["key"])
if has, err := db.Db.Where(query, params["value"]).Get(&m); err != nil || has == false {
return nil, logx.Error(err)
}
return &m, nil
}

// CloudIssuanceMasterBuyOrdFindByParams 通过传入的参数查询数据(多条)
func CloudIssuanceMasterBuyOrdFindByParams(params map[string]interface{}) (*[]model.SuperCloudIssuanceMasterBuyOrd, error) {
var m []model.SuperCloudIssuanceMasterBuyOrd
if params["value"] == nil {
return nil, errors.New("参数有误")
}
if params["key"] == nil {
//查询全部数据
err := db.Db.Find(&m)
if err != nil {
return nil, logx.Error(err)
}
return &m, nil
} else {
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice {
//指定In查询
if err := db.Db.In(utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
} else {
var query = fmt.Sprintf("%s =?", params["key"])
err := db.Db.Where(query, params["value"]).Find(&m)
if err != nil {
return nil, logx.Error(err)
}
return &m, nil
}

}
}

+ 62
- 0
super_cloud_issuance/db/official/db_super_cloud_issuance_robot_records.go View File

@@ -0,0 +1,62 @@
package db

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/super_cloud_issuance/db/official/model"
"errors"
"fmt"
"reflect"
)

// SuperCloudIssuanceRobotRecordsInsert 插入单条数据
func SuperCloudIssuanceRobotRecordsInsert(SuperCloudIssuanceRobotRecords *model.SuperCloudIssuanceRobotRecords) (int, error) {
_, err := db.Db.InsertOne(SuperCloudIssuanceRobotRecords)
if err != nil {
return 0, err
}
return SuperCloudIssuanceRobotRecords.Id, nil
}

// SuperCloudIssuanceRobotRecordsGetOneByParams 通过传入的参数查询数据(单条)
func SuperCloudIssuanceRobotRecordsGetOneByParams(params map[string]interface{}) (*model.SuperCloudIssuanceRobotRecords, error) {
var m model.SuperCloudIssuanceRobotRecords
var query = fmt.Sprintf("%s =?", params["key"])
if has, err := db.Db.Where(query, params["value"]).Get(&m); err != nil || has == false {
return nil, logx.Error(err)
}
return &m, nil
}

// SuperCloudIssuanceRobotRecordsFindByParams 通过传入的参数查询数据(多条)
func SuperCloudIssuanceRobotRecordsFindByParams(params map[string]interface{}) (*[]model.SuperCloudIssuanceRobotRecords, error) {
var m []model.SuperCloudIssuanceRobotRecords
if params["value"] == nil {
return nil, errors.New("参数有误")
}
if params["key"] == nil {
//查询全部数据
err := db.Db.Find(&m)
if err != nil {
return nil, logx.Error(err)
}
return &m, nil
} else {
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice {
//指定In查询
if err := db.Db.In(utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil {
return nil, logx.Warn(err)
}
return &m, nil
} else {
var query = fmt.Sprintf("%s =?", params["key"])
err := db.Db.Where(query, params["value"]).Find(&m)
if err != nil {
return nil, logx.Error(err)
}
return &m, nil
}

}
}

+ 15
- 0
super_cloud_issuance/db/official/model/super_cloud_issuance_basic.go View File

@@ -0,0 +1,15 @@
package model

import "time"

type SuperCloudIssuanceBasic struct {
Id int `json:"id"`
ImageNumsLimitIssuanceOnCircleOfFriends int `json:"image_nums_limit_issuance_on_circle_of_friends"`
ImageNumsLimitIssuanceOnGroups int `json:"image_nums_limit_issuance_on_groups"`
BindNums int `json:"bind_nums"`
FollowGroupUserNums int `json:"follow_group_user_nums"`
FollowGroupBindNums int `json:"follow_group_bind_nums"`
FollowGroupRelayNums int `json:"follow_group_relay_nums"`
CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
}

+ 14
- 0
super_cloud_issuance/db/official/model/super_cloud_issuance_master.go View File

@@ -0,0 +1,14 @@
package model

import "time"

type SuperCloudIssuanceMaster struct {
Id int `json:"id"`
MasterId int `json:"master_id"`
Amount string `json:"amount"`
CreditAmount string `json:"credit_amount"`
Memo string `json:"memo"`
State int `json:"state"`
CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
}

+ 22
- 0
super_cloud_issuance/db/official/model/super_cloud_issuance_master_buy_ord.go View File

@@ -0,0 +1,22 @@
package model

import "time"

type SuperCloudIssuanceMasterBuyOrd struct {
Id int `json:"id"`
OrdId string `json:"ord_id"`
MasterId int `json:"master_id"`
Nickname string `json:"nickname"`
Phone int64 `json:"phone"`
Uid int `json:"uid"`
UserPhone string `json:"user_phone"`
RobotId int `json:"robot_id"`
Month int `json:"month"`
CostPrice string `json:"cost_price"`
BeforeBalance string `json:"before_balance"`
Balance string `json:"balance"`
Memo string `json:"memo"`
State int `json:"state"`
CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
}

+ 15
- 0
super_cloud_issuance/db/official/model/super_cloud_issuance_robot.go View File

@@ -0,0 +1,15 @@
package model

import "time"

type SuperCloudIssuanceRobot struct {
Id int `json:"id"`
Name string `json:"name"`
Price string `json:"price"`
Type int32 `json:"type"`
State int32 `json:"state"`
Sort int `json:"sort"`
Memo string `json:"memo"`
CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"`
UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"`
}

+ 8
- 0
super_cloud_issuance/db/official/model/super_cloud_issuance_robot_records.go View File

@@ -0,0 +1,8 @@
package model

type SuperCloudIssuanceRobotRecords struct {
Id int `json:"id"`
MasterId string `json:"master_id"`
RobotId string `json:"robot_id"`
Uid int `json:"uid"`
}

+ 8
- 0
super_cloud_issuance/db/official/model/user_app_list.go View File

@@ -0,0 +1,8 @@
package model

type UserAppList struct {
Id int `json:"id" xorm:"int(11) NOT NULL "`
Uuid int64 `json:"uuid" xorm:"int(10) NOT NULL "`
AppId int64 `json:"app_id" xorm:"int(10) NOT NULL "`
Name string `json:"name" xorm:"varchar(255) DEFAULT '' "`
}

+ 8
- 0
super_cloud_issuance/db/official/model/user_app_member.go View File

@@ -0,0 +1,8 @@
package model

type UserAppMember struct {
Id int `json:"id" xorm:"int(11) NOT NULL "`
Uuid int64 `json:"uuid" xorm:"int(10) NOT NULL "`
Uid int64 `json:"uid" xorm:"int(10) NOT NULL "`
Phone int64 `json:"phone" xorm:"int(10) NOT NULL "`
}

+ 41
- 0
super_cloud_issuance/db/zhimeng_db.go View File

@@ -0,0 +1,41 @@
package db

import (
"applet/app/cfg"
db2 "applet/app/db"
"fmt"
_ "github.com/go-sql-driver/mysql"
"os"
"xorm.io/xorm"
"xorm.io/xorm/log"
)

var ZhimengDb *xorm.Engine

func InitZhimengDB(c *cfg.DBCfg) error {
var err error
if ZhimengDb, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", c.User, c.Psw, c.Host, c.Name)); err != nil {
return err
}
ZhimengDb.SetConnMaxLifetime(c.MaxLifetime)
ZhimengDb.SetMaxOpenConns(c.MaxOpenConns)
ZhimengDb.SetMaxIdleConns(c.MaxIdleConns)
if err = db2.Db.Ping(); err != nil {
return err
}
if c.ShowLog {
ZhimengDb.ShowSQL(true)
ZhimengDb.Logger().SetLevel(0)
f, err := os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777)
if err != nil {
os.RemoveAll(c.Path)
if f, err = os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777); err != nil {
return err
}
}
logger := log.NewSimpleLogger(f)
logger.ShowSQL(true)
ZhimengDb.SetLogger(logger)
}
return nil
}

+ 88
- 0
super_cloud_issuance/enum/enum_api.go View File

@@ -0,0 +1,88 @@
package enum

type CloudIssuanceMethodName string

const (
RobotCreateMethodName = "itaoke.robot.create.get"
QrcodeMacLoginMethodName = "itaoke.robot.qrcode.maclogin"
RobotAsyncMacLoginMethodName = "itaoke.robot.async.mlogin"
RobotForceOfflineMethodName = "itaoke.robot.force.offline"
RobotSecondLoginMethodName = "itaoke.robot.second.login"
RobotChangeMethodName = "itaoke.robot.change.get"
RobotResetMethodName = "itaoke.robot.reset.get"
RobotRoomListMethodName = "itaoke.robot.room.list"
RobotGroupListMethodName = "itaoke.robot.group.list"
RobotRoomDetailMethodName = "itaoke.robot.room.detail"
RobotMacGetChatRoomMemberMethodName = "itaoke.robot.macget.chatroommember"
RobotMacSendCardMethodName = "itaoke.robot.macsend.card"
RobotMacSendUriMethodName = "itaoke.robot.macsend.image"
RobotMacSendTextMethodName = "itaoke.robot.macsend.text"
RobotMacSendRecvImageMethodName = "itaoke.robot.macsend.recvimage"
RobotMacSendRecvViedoMethodName = "itaoke.robot.macsend.recvviedo"
RobotMacRepeatCircleMethodName = "itaoke.robot.macrepeat.circle"
RobotMacSendAppMethodName = "itaoke.robot.macsend.app"
RobotMacSendCircleMethodName = "itaoke.robot.macsend.circle"
)

func (gt CloudIssuanceMethodName) String() string {
switch gt {
case RobotCreateMethodName:
return "云发单添加机器人"
case QrcodeMacLoginMethodName:
return "获取登录二维码"
case RobotAsyncMacLoginMethodName:
return "循环是否登陆"
case RobotForceOfflineMethodName:
return "强制下线"
case RobotSecondLoginMethodName:
return "二次登录(阻塞式)"
case RobotChangeMethodName:
return "机器人修改/续费"
case RobotResetMethodName:
return "重置机器人"
case RobotRoomListMethodName:
return "获取群列表"
case RobotGroupListMethodName:
return "获取群列表(优惠狗端)"
case RobotRoomDetailMethodName:
return "获取群详情"
case RobotMacGetChatRoomMemberMethodName:
return "获取群成员"
case RobotMacSendCardMethodName:
return "发链接消息"
case RobotMacSendUriMethodName:
return "根据url发图"
case RobotMacSendTextMethodName:
return "发文本消息"
case RobotMacSendRecvImageMethodName:
return "转发图片(xml版)"
case RobotMacSendRecvViedoMethodName:
return "转发视频(xml版)"
case RobotMacRepeatCircleMethodName:
return "朋友圈转发"
case RobotMacSendAppMethodName:
return "转发小程序等XML"
case RobotMacSendCircleMethodName:
return "发送朋友圈"
default:
return "未知"
}
}

type CloudIssuanceLoginStatus int

const (
NotLogin = 0
AlreadyLogin = 1
)

func (gt CloudIssuanceLoginStatus) String() string {
switch gt {
case NotLogin:
return "未登录"
case AlreadyLogin:
return "已登录"
default:
return "未知"
}
}

+ 31
- 0
super_cloud_issuance/enum/enum_goods_category.go View File

@@ -0,0 +1,31 @@
package enum

type CloudIssuanceGoodsProvider string

const (
ProviderForJd = "jd"
ProviderForTaoBao = "taobao"
ProviderForSuNing = "suning"
ProviderForPdd = "pdd"
ProviderForKaoLa = "kaola"
ProviderForVip = "vip"
)

func (gt CloudIssuanceGoodsProvider) String() string {
switch gt {
case ProviderForJd:
return "京东"
case ProviderForTaoBao:
return "淘宝"
case ProviderForSuNing:
return "苏宁"
case ProviderForPdd:
return "拼多多"
case ProviderForKaoLa:
return "考拉"
case ProviderForVip:
return "唯品会"
default:
return "未知"
}
}

+ 19
- 0
super_cloud_issuance/enum/enum_super_cloud_issuance_add_group_welcome_message.go View File

@@ -0,0 +1,19 @@
package enum

type SuperCloudIssuanceAddGroupWelcomeMessageState int

const (
SuperCloudIssuanceAddGroupWelcomeMessageStateForSuspend = 0
SuperCloudIssuanceAddGroupWelcomeMessageStateForNormal = 1
)

func (gt SuperCloudIssuanceAddGroupWelcomeMessageState) String() string {
switch gt {
case SuperCloudIssuanceAddGroupWelcomeMessageStateForNormal:
return "正常"
case SuperCloudIssuanceAddGroupWelcomeMessageStateForSuspend:
return "暂停"
default:
return "未知"
}
}

+ 55
- 0
super_cloud_issuance/enum/enum_super_cloud_issuance_keyword_reply_with_activate_group.go View File

@@ -0,0 +1,55 @@
package enum

type SuperCloudIssuanceKeywordReplyWithActivateGroupState int

const (
SuperCloudIssuanceKeywordReplyWithActivateGroupStateForNormal = 1
SuperCloudIssuanceKeywordReplyWithActivateGroupStateForSuspend = 0
)

func (gt SuperCloudIssuanceKeywordReplyWithActivateGroupState) String() string {
switch gt {
case SuperCloudIssuanceKeywordReplyWithActivateGroupStateForNormal:
return "正常"
case SuperCloudIssuanceKeywordReplyWithActivateGroupStateForSuspend:
return "暂停"
default:
return "未知"
}
}

type SuperCloudIssuanceKeywordReplyWithActivateGroupIsFollowOfficial int

const (
SuperCloudIssuanceKeywordReplyWithActivateGroupIsFollowOfficialForYes = 1
SuperCloudIssuanceKeywordReplyWithActivateGroupIsFollowOfficialForNo = 0
)

func (gt SuperCloudIssuanceKeywordReplyWithActivateGroupIsFollowOfficial) String() string {
switch gt {
case SuperCloudIssuanceKeywordReplyWithActivateGroupIsFollowOfficialForYes:
return "跟随官方"
case SuperCloudIssuanceKeywordReplyWithActivateGroupIsFollowOfficialForNo:
return "不跟随官方"
default:
return "未知"
}
}

type SuperCloudIssuanceKeywordReplyWithActivateGroupListKind int

const (
SuperCloudIssuanceKeywordReplyWithActivateGroupListKindForWriting = 1
SuperCloudIssuanceKeywordReplyWithActivateGroupListKindForPicture = 2
)

func (gt SuperCloudIssuanceKeywordReplyWithActivateGroupListKind) String() string {
switch gt {
case SuperCloudIssuanceKeywordReplyWithActivateGroupListKindForWriting:
return "文字"
case SuperCloudIssuanceKeywordReplyWithActivateGroupListKindForPicture:
return "图片"
default:
return "未知"
}
}

+ 109
- 0
super_cloud_issuance/enum/enum_super_cloud_issuance_user_group_manage.go View File

@@ -0,0 +1,109 @@
package enum

type SuperCloudIssuanceUserGroupManageIsOpenOut int

const (
SuperCloudIssuanceUserGroupManageIsOpenOutForNo SuperCloudIssuanceUserGroupManageIsOpenOut = iota
SuperCloudIssuanceUserGroupManageIsOpenOutForYes
)

func (gt SuperCloudIssuanceUserGroupManageIsOpenOut) String() string {
switch gt {
case SuperCloudIssuanceUserGroupManageIsOpenOutForNo:
return "关闭"
case SuperCloudIssuanceUserGroupManageIsOpenOutForYes:
return "开启"
default:
return "未知"
}
}

type SuperCloudIssuanceUserGroupManageOutSendFile int

const (
SuperCloudIssuanceUserGroupManageOutSendFileForNo SuperCloudIssuanceUserGroupManageOutSendFile = iota
SuperCloudIssuanceUserGroupManageOutSendFileForYes
)

func (gt SuperCloudIssuanceUserGroupManageOutSendFile) String() string {
switch gt {
case SuperCloudIssuanceUserGroupManageOutSendFileForNo:
return "踢发文件-关闭"
case SuperCloudIssuanceUserGroupManageOutSendFileForYes:
return "踢发文件-开启"
default:
return "未知"
}
}

type SuperCloudIssuanceUserGroupManageOutSendCard int

const (
SuperCloudIssuanceUserGroupManageOutSendCardForNo SuperCloudIssuanceUserGroupManageOutSendCard = iota
SuperCloudIssuanceUserGroupManageOutSendCardForYes
)

func (gt SuperCloudIssuanceUserGroupManageOutSendCard) String() string {
switch gt {
case SuperCloudIssuanceUserGroupManageOutSendCardForNo:
return "踢发名片-关闭"
case SuperCloudIssuanceUserGroupManageOutSendCardForYes:
return "踢发名片-开启"
default:
return "未知"
}
}

type SuperCloudIssuanceUserGroupManageOutSendLink int

const (
SuperCloudIssuanceUserGroupManageOutSendLinkForNo SuperCloudIssuanceUserGroupManageOutSendLink = iota
SuperCloudIssuanceUserGroupManageOutSendLinkForYes
)

func (gt SuperCloudIssuanceUserGroupManageOutSendLink) String() string {
switch gt {
case SuperCloudIssuanceUserGroupManageOutSendLinkForNo:
return "踢发链接-关闭"
case SuperCloudIssuanceUserGroupManageOutSendLinkForYes:
return "踢发链接-开启"
default:
return "未知"
}
}

type SuperCloudIssuanceUserGroupManageOutSendApplet int

const (
SuperCloudIssuanceUserGroupManageOutSendAppletForNo SuperCloudIssuanceUserGroupManageOutSendApplet = iota
SuperCloudIssuanceUserGroupManageOutSendAppletForYes
)

func (gt SuperCloudIssuanceUserGroupManageOutSendApplet) String() string {
switch gt {
case SuperCloudIssuanceUserGroupManageOutSendAppletForNo:
return "踢发小程序-关闭"
case SuperCloudIssuanceUserGroupManageOutSendAppletForYes:
return "踢发小程序-开启"
default:
return "未知"
}
}

type SuperCloudIssuanceUserGroupManageOutAutoAddBlackList int

const (
SuperCloudIssuanceUserGroupManageOutAutoAddBlackListForNo SuperCloudIssuanceUserGroupManageOutAutoAddBlackList = iota
SuperCloudIssuanceUserGroupManageOutAutoAddBlackListForYes
)

func (gt SuperCloudIssuanceUserGroupManageOutAutoAddBlackList) String() string {
switch gt {
case SuperCloudIssuanceUserGroupManageOutAutoAddBlackListForNo:
return "踢人时自动加入黑名单-关闭"
case SuperCloudIssuanceUserGroupManageOutAutoAddBlackListForYes:
return "踢人时自动加入黑名单-开启"
default:
return "未知"
}
}

+ 19
- 0
super_cloud_issuance/enum/enum_super_cloud_issuance_user_robot_kind.go View File

@@ -0,0 +1,19 @@
package enum

type CloudIssuanceUserRobotKind int

const (
ExclusiveRobot = 1
ShareRobot = 2
)

func (gt CloudIssuanceUserRobotKind) String() string {
switch gt {
case ExclusiveRobot:
return "独享机器人"
case ShareRobot:
return "共享机器人"
default:
return "未知"
}
}

+ 31
- 0
super_cloud_issuance/enum/enum_super_cloud_issuance_user_robot_type.go View File

@@ -0,0 +1,31 @@
package enum

type CloudIssuanceUserRobotType int

const (
IssuingRobot = 1
ForwardRobot = 2
RebateRobot = 3
AllAroundRobot = 4
SmallRobot = 5
SendToMomentsRobot = 6
)

func (gt CloudIssuanceUserRobotType) String() string {
switch gt {
case IssuingRobot:
return "发单机器人"
case ForwardRobot:
return "转发机器人"
case RebateRobot:
return "返利机器人"
case AllAroundRobot:
return "全能机器人"
case SmallRobot:
return "小型机器人"
case SendToMomentsRobot:
return "发圈机器人"
default:
return "未知"
}
}

+ 19
- 0
super_cloud_issuance/enum/enum_super_cloud_issuance_user_robot_with_activate_group.go View File

@@ -0,0 +1,19 @@
package enum

type SuperCloudIssuanceUserRobotWithActivateGroupState int

const (
SuperCloudIssuanceUserRobotWithActivateGroupStateForNormal = 1
SuperCloudIssuanceUserRobotWithActivateGroupStateForSuspend = 2
)

func (gt SuperCloudIssuanceUserRobotWithActivateGroupState) String() string {
switch gt {
case SuperCloudIssuanceUserRobotWithActivateGroupStateForNormal:
return "正常"
case SuperCloudIssuanceUserRobotWithActivateGroupStateForSuspend:
return "暂停"
default:
return "未知"
}
}

+ 23
- 0
super_cloud_issuance/lib/auth/base.go View File

@@ -0,0 +1,23 @@
package auth

import (
"time"

"github.com/dgrijalva/jwt-go"
)

// TokenExpireDuration is jwt 过期时间
const TokenExpireDuration = time.Hour * 4380

var Secret = []byte("zyos")

// JWTUser 如果想要保存更多信息,都可以添加到这个结构体中
type JWTUser struct {
UID int `json:"uid"`
Username string `json:"username"`
Phone string `json:"phone"`
AppName string `json:"app_name"`
MiniOpenID string `json:"mini_open_id"` // 小程序的open_id
MiniSK string `json:"mini_session_key"` // 小程序的session_key
jwt.StandardClaims
}

+ 40
- 0
super_cloud_issuance/lib/baidu/shorten_url.go View File

@@ -0,0 +1,40 @@
package baidu

import (
"applet/app/utils"
"applet/app/utils/logx"
"encoding/json"
)

var DWZ_TOKEN = "eecdf4b18f416b0cf26fef98f7e1f4ff"

func ShortenUrl(url string) (string, error) {
host := "https://dwz.cn/admin/v2/create"
args := map[string]string{
"Url": url,
"TermOfValidity": "1-year",
}

resp, err := utils.CurlPost(host, utils.Serialize(args), map[string]string{
"Content-Type": "application/json",
"Token": DWZ_TOKEN,
})
// {"Code":0,"IsNew":true,"ShortUrl":"https://dwz.cn/4kSgiKVl","LongUrl":"https://open.taobao.com/search.htm?q=taobao.tbk.sc.material","ErrMsg":""}
if err != nil {
return "", logx.Warn(err)
}
var tmp struct {
Code int `json:"Code"`
IsNew bool `json:"IsNew"`
ShortURL string `json:"ShortUrl"`
LongURL string `json:"LongUrl"`
ErrMsg string `json:"ErrMsg"`
}
if err = json.Unmarshal(resp, &tmp); err != nil {
return url, logx.Warn("resp: " + string(resp) + ", err:" + err.Error())
}
if tmp.ShortURL == "" {
tmp.ShortURL = url
}
return tmp.ShortURL, nil
}

+ 16
- 0
super_cloud_issuance/lib/qiniu/bucket_create.go View File

@@ -0,0 +1,16 @@
package qiniu

import (
"github.com/qiniu/api.v7/v7/auth"
"github.com/qiniu/api.v7/v7/storage"
)

func BucketCreate() error {
mac := auth.New(AK, SK)
cfg := storage.Config{
// 是否使用https域名进行资源管理
UseHTTPS: false,
}
bucketManager := storage.NewBucketManager(mac, &cfg)
return bucketManager.CreateBucket("", storage.RIDHuanan)
}

+ 18
- 0
super_cloud_issuance/lib/qiniu/bucket_delete.go View File

@@ -0,0 +1,18 @@
package qiniu

import (
"github.com/qiniu/api.v7/v7/auth"
"github.com/qiniu/api.v7/v7/storage"
)

func BucketDelete(bucketName string) error {
mac := auth.New(AK, SK)

cfg := storage.Config{
// 是否使用https域名进行资源管理
UseHTTPS: false,
}

bucketManager := storage.NewBucketManager(mac, &cfg)
return bucketManager.DropBucket(bucketName)
}

+ 18
- 0
super_cloud_issuance/lib/qiniu/bucket_get_domain.go View File

@@ -0,0 +1,18 @@
package qiniu

import (
"github.com/qiniu/api.v7/v7/auth"
"github.com/qiniu/api.v7/v7/storage"
)

func BucketGetDomain(bucketName string) (string, error) {
mac := auth.New(AK, SK)

cfg := storage.Config{UseHTTPS: false}
bucketManager := storage.NewBucketManager(mac, &cfg)
b, err := bucketManager.ListBucketDomains(bucketName)
if err != nil {
return "", err
}
return b[0].Domain, nil
}

+ 22
- 0
super_cloud_issuance/lib/qiniu/init.go View File

@@ -0,0 +1,22 @@
package qiniu

import (
"applet/app/utils"
)

var (
AK = "MmxNdai23egjNUHjdzEVaTPdPCIbWzENz9BQuak3"
SK = "mElaFlM9O16rXp-ihoQdJ9KOH56naKm3MoyQBA59"
BUCKET = "dev-fnuoos" // 桶子名称
BUCKET_SCHEME = "http"
BUCKET_REGION = "up-z2.qiniup.com"
Expires uint64 = 3600
)

func Init(ak, sk, bucket, region, scheme string) {
AK, SK, BUCKET, BUCKET_REGION, BUCKET_SCHEME = ak, sk, bucket, region, scheme
}

func Sign(t string) string {
return utils.Md5(AK + SK + t)
}

+ 54
- 0
super_cloud_issuance/lib/qiniu/req_img_upload.go View File

@@ -0,0 +1,54 @@
package qiniu

import (
"applet/app/md"
"applet/app/utils"
"time"

"github.com/qiniu/api.v7/v7/auth/qbox"
_ "github.com/qiniu/api.v7/v7/conf"
"github.com/qiniu/api.v7/v7/storage"
)

// 请求图片上传地址信息
func ReqImgUpload(f *md.FileCallback, callbackUrl string) interface{} {
if ext := utils.FileExt(f.FileName); ext == "png" || ext == "jpg" || ext == "jpeg" || ext == "gif" || ext == "bmp" || ext == "webp" {
f.Width = "$(imageInfo.width)"
f.Height = "$(imageInfo.height)"
}
f.Provider = "qiniu"
f.FileSize = "$(fsize)"
f.Hash = "$(etag)"
f.Bucket = "$(bucket)"
f.Mime = "$(mimeType)"
f.Time = utils.Int64ToStr(time.Now().Unix())
f.Sign = Sign(f.Time)
putPolicy := storage.PutPolicy{
Scope: BUCKET + ":" + f.FileName, // 使用覆盖方式时候必须请求里面有key,否则报错
Expires: Expires,
ForceSaveKey: true,
SaveKey: f.FileName,
MimeLimit: "image/*", // 只允许上传图片
CallbackURL: callbackUrl,
CallbackBody: utils.SerializeStr(f),
CallbackBodyType: "application/json",
}
return &struct {
Method string `json:"method"`
Key string `json:"key"`
Host string `json:"host"`
Token string `json:"token"`
}{Key: f.FileName, Method: "POST", Host: BUCKET_SCHEME + "://" + BUCKET_REGION, Token: putPolicy.UploadToken(qbox.NewMac(AK, SK))}
}

/*
form表单上传
地址 : http://upload-z2.qiniup.com
header
- Content-Type : multipart/form-data

body :
- key : 文件名
- token : 生成token
- file : 待上传文件
*/

+ 66
- 0
super_cloud_issuance/lib/zhimeng/api.go View File

@@ -0,0 +1,66 @@
package zhimeng

import (
"applet/app/utils"
"fmt"
"sort"
"strconv"
"time"
)

var StatusSuc int = 1

type ZM struct {
AK string
SK string
SMS_AK string
SMS_SK string
}

// 智盟接口, 可以调取京东, 拼多多等
const ZM_HOST = "http://www.izhim.com/"

var (
ZM_BASE_URL = ZM_HOST + "?mod=api&act=%s&ctrl=%s"
APP_KEY = "300000001"
SECRET_KEY = "95c347002b2750dbd4b6a03bd4196c18"
SMS_APP_KEY = "300000175"
SMS_SECRET_KEY = "6cf1dcd1820a576ff2cbecbe00d31df2"
)

func Send(act, op string, args map[string]interface{}) ([]byte, error) {
router := fmt.Sprintf(ZM_BASE_URL, act, op)
// args["appkey"] = APP_KEY
args["time"] = strconv.Itoa(int(time.Now().Unix()))
args["sign"] = sign(args, args["secret_key"].(string))
// b, _ := json.Marshal(args)
// fmt.Println(string(b))
return utils.CurlPost(router, args, nil)
}

// SMSend is 发送短信用的key 和签名
func SMSend(act, op, key, secret string, args map[string]interface{}) ([]byte, error) {
router := fmt.Sprintf(ZM_BASE_URL, act, op)

args["appkey"] = key
args["time"] = strconv.Itoa(int(time.Now().Unix()))
args["sign"] = sign(args, secret)

return utils.CurlPost(router, args, nil)
}

func sign(m map[string]interface{}, SK string) string {
// key sort
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
str := ""
for _, k := range keys {
str += k + utils.AnyToString(m[k])
}
// merge string
str = SK + str + SK + "方诺科技"
return utils.Md5(str)
}

+ 162
- 0
super_cloud_issuance/lib/zhimeng/sdk.go View File

@@ -0,0 +1,162 @@
package zhimeng

import (
"applet/app/utils/logx"
"encoding/json"
"errors"
"fmt"
"strings"

"github.com/shopspring/decimal"
"github.com/tidwall/gjson"
)

// SDK is zhimeng sdk
type SDK struct {
Action string
operation string
response []byte
SmsKey string
SmsSecret string
data interface{}
err error
}

// Init is init action
// In some condition, such as send Sms, need pass sms key and secret after 'action'
func (sdk *SDK) Init(action string, keys ...string) {
sdk.Action = action
//if keys[0] == "" || keys[1] == "" {
// sdk.err = errors.New("智盟短信未配置")
//}
if len(keys) > 1 {
sdk.SmsKey = keys[0]
sdk.SmsSecret = keys[1]
}

}

// SelectFunction is select api with operation
func (sdk *SDK) SelectFunction(operation string) *SDK {
sdk.operation = operation
return sdk
}

// WithSMSArgs is SMS
func (sdk *SDK) WithSMSArgs(args map[string]interface{}) *SDK {
res, err := SMSend(sdk.Action, sdk.operation, sdk.SmsKey, sdk.SmsSecret, args)
if err != nil {
logx.Error(err)
}
sdk.response = res
return sdk
}

// WithArgs is post data to api
func (sdk *SDK) WithArgs(args map[string]interface{}) *SDK {
// args["appkey"] = svc.SysCfgGet(c, md.KEY_CFG_ZM_AK)
// args["secret_key"] = svc.SysCfgGet(c, md.KEY_CFG_ZM_SK)

res, err := Send(sdk.Action, sdk.operation, args)
if err != nil {
logx.Error(err)
}
// for k, v := range args {
// fmt.Printf("%s:%v \n", k, v)
// }
// fmt.Println(string(res))
sdk.response = res
return sdk
}

// Result is response data from api , return interface{}
func (sdk *SDK) Result() (*SDK, error) {
if sdk.err != nil {
return nil, sdk.err
}
tmp := struct {
Msg string `json:"msg"`
Success int `json:"success"`
Data interface{} `json:"data"`
}{}
if err := json.Unmarshal(sdk.response, &tmp); err != nil {
return nil, logx.Error("【Resp】" + string(sdk.response) + ", 【Error】" + err.Error())
}
if tmp.Success != StatusSuc {
return nil, logx.Error(string(sdk.response))
}

if gjson.GetBytes(sdk.response, "data").String() == "[]" {
return nil, errors.New("no result")
}

sdk.data = tmp.Data
return sdk, nil
}

// ToObject is the interface is Slice and get the first item
func (sdk *SDK) ToObject() *SDK {
s, ok := sdk.ToInterface().([]interface{})
if !ok {
logx.Errorf("\nToOject cantnot convert to []interface{}, 【Data】: %#v\n", sdk.data)
return sdk
}
sdk.data = s[len(s)-len(s)]
return sdk
}

// ToInterface is data to Interface
func (sdk *SDK) ToInterface() interface{} {
return sdk.data
}

// ToMapStringInterface is data to map[string]string
func (sdk *SDK) ToMapStringInterface(item interface{}) map[string]interface{} {
data, err := json.Marshal(item)
if err != nil {
logx.Error("ToMapStringString marshal error : " + err.Error())

}
m := make(map[string]interface{})
if err = json.Unmarshal(data, &m); err != nil {
logx.Error("ToMapStringString unmarshal error : " + err.Error())

}
for key, v := range m {
switch v.(type) {
case int:
t, ok := v.(string)
if !ok {
logx.Warn("int convert error")
}
m[key] = t
case int32:
t, ok := v.(string)
if !ok {
logx.Warn("int32 convert error")
}
m[key] = t
case int64:
t, ok := v.(string)
if !ok {
logx.Warn("int64 convert error")
}
m[key] = t
case float64:
vstr := fmt.Sprintf("%v", v)
if strings.Contains(vstr, "e+") {
decimalNum, err := decimal.NewFromString(vstr)
if err != nil {
panic(logx.Errorf("decimal.NewFromString error, vstr:%s, err:%v", vstr, err))
}
vstr = decimalNum.String()
}
m[key] = vstr
case nil:
m[key] = v
default:
m[key] = v
}
}
return m
}

+ 64
- 0
super_cloud_issuance/md/alipay.go View File

@@ -0,0 +1,64 @@
package md

// AliPayCallback 支付宝的回调结构体
type AliPayCallback struct {
AppID string `json:"app_id"`
AuthAppID string `json:"auth_app_id"`
BuyerID string `json:"buyer_id"`
BuyerLogonID string `json:"buyer_logon_id"`
BuyerPayAmount string `json:"buyer_pay_amount"`
Charset string `json:"charset"`
FundBillList string `json:"fund_bill_list"`
GmtCreate string `json:"gmt_create"`
GmtPayment string `json:"gmt_payment"`
InvoiceAmount string `json:"invoice_amount"`
OrderType string `json:"order_type"`
MasterID string `json:"master_id"`
NotifyID string `json:"notify_id"`
NotifyTime string `json:"notify_time"`
NotifyType string `json:"notify_type"`
OutTradeNo string `json:"out_trade_no"`
PassbackParams string `json:"passback_params"`
PointAmount string `json:"point_amount"`
ReceiptAmount string `json:"receipt_amount"`
SellerEmail string `json:"seller_email"`
SellerID string `json:"seller_id"`
Sign string `json:"sign"`
SignType string `json:"sign_type"`
Subject string `json:"subject"`
TotalAmount string `json:"total_amount"`
TradeNo string `json:"trade_no"`
TradeStatus string `json:"trade_status"`
Version string `json:"version"`
PayMethod string `json:"pay_method"`
}

type AliPayPayParams struct {
Subject string `json:"subject" binding:"required"`
Amount string `json:"amount" binding:"required"`
OrderType string `json:"order_type" binding:"required"`
OrdId string `json:"ord_id"`
Phone string `json:"phone"`
}
type PayData struct {
PayAppCertSn string `json:"pay_app_cert_sn"`
PayAlipayRootCertSn string `json:"pay_alipay_root_cert_sn"`
PayAlipayrsaPublicKey string `json:"pay_alipayrsa_public_key"`
PayAliUseType string `json:"pay_ali_use_type"`
PriKey string `json:"pay_ali_new_private_key"`
}
type UserCertifyParams struct {
RealName string `json:"real_name" `
IdentityNum string `json:"identity_num" `
OrdId string `json:"ord_id"`
CertifyId string `json:"certify_id"`
Uid string `json:"uid"`
}

type UserCertifyRequest struct {
OrderId string `json:"order_id"` //支付订单
RealName string `json:"real_name" `
IdentityNum string `json:"identity_num" `
CertifyId string `json:"certify_id"`
Uid string `json:"uid"`
}

+ 11
- 0
super_cloud_issuance/md/app_redis_key.go View File

@@ -0,0 +1,11 @@
package md

// 缓存key统一管理, %s格式化为masterId
const (
AppCfgCacheKey = "%s:cfg_cache:%s" // 占位符: masterId, key的第一个字母
VirtualCoinCfgCacheKey = "%s:virtual_coin_cfg"

UserFinValidUpdateLock = "%s:user_fin_valid_update_lock:%s" // 用户余额更新锁(能拿到锁才能更新余额)

CfgCacheTime = 86400
)

+ 19
- 0
super_cloud_issuance/md/cfg_key.go View File

@@ -0,0 +1,19 @@
package md

// 获取用户的缓存key
const (
KEY_SYS_CFG_CACHE = "sys_cfg_cache"

// 文件缓存的key
KEY_CFG_FILE_PVD = "file_provider" // 文件供应商
KEY_CFG_FILE_BUCKET = "file_bucket"
KEY_CFG_FILE_REGION = "file_bucket_region"
KEY_CFG_FILE_HOST = "file_bucket_host"
KEY_CFG_FILE_SCHEME = "file_bucket_scheme"
KEY_CFG_FILE_AK = "file_access_key"
KEY_CFG_FILE_SK = "file_secret_key"
KEY_CFG_FILE_MAX_SIZE = "file_user_upload_max_size"
KEY_CFG_FILE_EXT = "file_ext"
KEY_CFG_FILE_AVATAR_THUMBNAIL = "file_avatar_thumbnail" // 默认头像缩略图参数,宽高120px,格式webp.

)

+ 54
- 0
super_cloud_issuance/md/file.go View File

@@ -0,0 +1,54 @@
package md

// 用户拥有上传权限的目录, 目录ID

const (
FILE_DIR_FEEDBACK = "feedback"
FILE_DIR_AVATAR = "avatar"
FILE_DIR_QRCODE = "qrcode"
FILE_DIR_STYLE = "style"
)

var (
FileUserDir = map[string]string{
FILE_DIR_FEEDBACK: "4", // 用户反馈
FILE_DIR_AVATAR: "5", // 用户头像
FILE_DIR_QRCODE: "6", // 用户微信二维码
FILE_DIR_STYLE: "7", // 用户样式
}
)

// 文件回调信息
type FileCallback struct {
Uid string `json:"uid"`
DirId string `json:"dir_id"`
Provider string `json:"provider"` // 供应商
FileName string `json:"fname"` // 原文件名
FileSize string `json:"fsize"`
Hash string `json:"hash"`
Bucket string `json:"bucket"`
Mime string `json:"mime"`
Width string `json:"w,omitempty"`
Height string `json:"h,omitempty"`
Time string `json:"time"` // 默认一个小时内要上传完毕,否则超时
Sign string `json:"sign"` // 签名
}

type FileList struct {
Path string `json:"path"`
DirId int `json:"dir_id"`
FileName string `json:"f_name"` // 显示名称
StgName string `json:"stg_name"` // 存储名字
Ext string `json:"ext"` // 后缀名, png,jpg等
FileSize string `json:"f_size"`
Provider string `json:"provider"` // 存储供应商
Hash string `json:"hash"`
Bucket string `json:"bucket"`
Width int `json:"w"`
Height int `json:"h"`
Mime string `json:"mime"`
IsAdm bool `json:"is_adm"` //是否管理后台上传
IsDir bool `json:"is_dir"` //是否文件夹
CreateAt int `json:"create_at"`
Url string `json:"url"`
}

+ 183
- 0
super_cloud_issuance/md/md_api.go View File

@@ -0,0 +1,183 @@
package md

type CurlResponse struct {
Status string `json:"status"`
Data interface{} `json:"data"`
Msg string `json:"msg"`
}

type CurlResponseForCircle struct { //朋友圈相关接口响应
Code string `json:"code"`
Data interface{} `json:"data"`
Message string `json:"message"`
}

type RobotCreateRequest struct {
Month int `json:"month"` //新增月份,默认1
RobotType string `json:"robot_type"` //机器人类型 1 发单机器人 2转发机器人 3 返利机器人 4全能机器人 5小型机器人 6发圈机器人
WechatRobot string `json:"wechatrobot"` //微信号
Remark string `json:"remark"` //备注
}
type RobotCreateResponse struct {
Id float64 `json:"id"`
Uid float64 `json:"uid"`
WechatRobot string `json:"wechatrobot"`
//NickName string `json:"nickname"`
LoginStatus float64 `json:"login_status"`
EndTime int64 `json:"end_time"` //到期时间
Remark string `json:"remark"`
WcId string `json:"wc_id"` //微信实例id
IsEnabled float64 `json:"is_enabled"` //0 正常 1暂停 2已过期
}

type RobotQrcodeMacLoginRequest struct {
RobotId int `json:"robot_id"` //机器人id
}
type RobotQrcodeMacLoginResponse struct {
WId string `json:"wId"` //实例id
QrCodeUrl string `json:"qrCodeUrl"`
}

type RobotAsyncMacLoginRequest struct {
WId string `json:"wId"` //实例id
RobotId int `json:"robot_id"` //机器人id
}
type RobotAsyncMacLoginResponse struct {
WId string `json:"wId"` //实例id
WcId string `json:"wcId"` //微信id
NickName string `json:"nickName"` //微信昵称
HeadUrl string `json:"headUrl"` //微信头像
}

type RobotForceOfflineRequest struct {
RobotId int `json:"robot_id"` //机器人id
}

type RobotSecondLoginRequest struct {
RobotId int `json:"robot_id"` //机器人id
}
type RobotSecondLoginResponse struct {
WId string `json:"wId"` //实例id
WcId string `json:"wcId"` //微信id
NickName string `json:"nickName"` //微信昵称
HeadUrl string `json:"headUrl"` //微信头像
}

type RobotChangeRequest struct {
RobotId int `json:"robot_id"` //机器人id
Month int `json:"month"` //续费月数
//WechatRobot int `json:"wechatrobot"` //微信号 更换号的时候传 (TODO::暂时用不到)
}
type RobotChangeResponse struct {
Uid float64 `json:"uid"`
WechatRobot string `json:"wechatrobot"`
LoginStatus float64 `json:"login_status"`
EndTime int64 `json:"end_time"` //到期时间
Remark string `json:"remark"`
WcId string `json:"wc_id"` //微信实例id
IsEnabled float64 `json:"is_enabled"` //0 正常 1暂停 2已过期
}

type RobotResetRequest struct {
RobotId int `json:"robot_id"` //机器人id
}

type RobotRoomListRequest struct {
RobotId int `json:"robot_id"` //机器人id
//RoomContactSeq int `json:"room_contact_seq"` // 首次传0, 后面接口返回, 不传默认全部
//WxContactSeq int `json:"wx_contact_seq"` // 首次传0, 后面接口返回, 不传默认全部
}
type RobotRoomListResponse []string

type RobotRoomDetailRequest struct {
RobotId int `json:"robot_id"` //机器人id
RoomId string `json:"room_id"` // 群的id ,多个用逗号隔开
}
type RobotRoomDetailResponse struct {
ChatRoomId string `json:"chatRoomId"`
NickName string `json:"nickName"`
ChatRoomOwner string `json:"chatRoomOwner"`
BigHeadImgUrl string `json:"bigHeadImgUrl"`
SmallHeadImgUrl string `json:"smallHeadImgUrl"`
V1 string `json:"v1"`
MemberCount string `json:"memberCount"`
ChatRoomMembers []ChatRoomMember `json:"chatRoomMembers"`
}
type ChatRoomMember struct {
UserName string `json:"userName"`
NikeName string `json:"nikeName"`
InviterUserName string `json:"inviterUserName"`
}

type RobotMacSendCardRequest struct {
RobotId int `json:"robot_id"` //机器人id
WxId string `json:"wx_id"` //发送微信好友/群id。一般wxid_开头
Title string `json:"title"` //标题
Url string `json:"url"` //链接
Description string `json:"description"` //描述
ThumbUrl string `json:"thumbUrl"` //图片
}

type RobotMacSendUriRequest struct {
RobotId int `json:"robot_id"` //机器人id
WxId string `json:"toWxId"` //发送微信好友/群id。一般wxid_开头
PicUrl string `json:"pic_url"` //图片地址
}

type RobotMacSendTextRequest struct {
RobotId int `json:"robot_id"` //机器人id
WxId string `json:"toWxId"` //发送微信好友/群id。一般wxid_开头
Content string `json:"content"` //内容
}

type RobotMacSendRecvImageRequest struct {
RobotId int `json:"robot_id"` //机器人id
WxId string `json:"wx_id"` //发送微信好友/群id。一般wxid_开头
Content string `json:"content"` //消息xml内容
}

type RobotMacSendRecvVideoRequest struct {
RobotId int `json:"robot_id"` //机器人id
WxId string `json:"wx_id"` //发送微信好友/群id。一般wxid_开头
Content string `json:"content"` //消息xml内容
}

type RobotMacSendCircleRequest struct {
RobotId int `json:"robot_id"` //机器人id
PicUrl string `json:"pic_url"` //图片url,多个请用;分隔
Content string `json:"content"` //文案
}

type GetUserInfoResponse struct {
User interface{} `json:"user"`
State int `json:"state"` //状态(0:未开通 1:未绑定 2:未登录 3:已登录)
EndTime string `json:"end_time"` //到期时间
OpenTime string `json:"open_time"` //开通时间
BalanceDay int `json:"balance_day"` //剩余天数
WcNickname string `json:"wc_nickname"` //微信昵称
WcHeadUrl string `json:"wc_head_url"` //微信头像
GroupNum int `json:"group_num"` //最大群数
AlreadyBindGroupNum int `json:"already_bind_group_num"` //已绑定群数
}

type RobotMacGetChatRoomMemberRequest struct {
RobotId int `json:"robot_id"` //机器人id
RoomId string `json:"room_id"` // 群的id
}

type RobotMacGetChatRoomMemberResponseV1 struct {
UserName string `json:"userName"` //微信号
NickName string `json:"nickName"` //昵称
DisplayName string `json:"displayName"` //群昵称
BigHeadImgUrl string `json:"bigHeadImgUrl"` //头像
SmallHeadImgUrl string `json:"smallHeadImgUrl"` //头像(缩略图)
InviteUser string `json:"inviteUser"` //邀请人微信号
}
type RobotMacGetChatRoomMemberResponse struct {
UserName string `json:"user_name"` //微信号
NickName string `json:"nick_name"` //昵称
DisplayName string `json:"display_name"` //群昵称
BigHeadImgUrl string `json:"big_head_img_url"` //头像
SmallHeadImgUrl string `json:"small_head_img_url"` //头像(缩略图)
InviteUser string `json:"invite_user"` //邀请人微信号
}

+ 18
- 0
super_cloud_issuance/md/md_call_back.go View File

@@ -0,0 +1,18 @@
package md

type CallbackRequest struct {
Account string `json:"account"` //账号
MessageType int `json:"messageType"` //消息类型(0:好友请求 1:群邀请 2: 群名片 3:个人名片 4:下线 5:私聊文本消息 6:私聊图片消息 7:聊视频消息 8:私聊语音消息 9:群聊文本消息 10:群聊图片消息 11:群聊视频消息 12:群语音消息 13:私其他类型消息 4:群聊其他类型消)
RobotId int `json:"robotId"` //机器人id
WcId string `json:"wcId"` //微信号
Data struct {
Content string `json:"content"` //消息体
FromGroup string `json:"fromGroup"` //发送群号
FromUser string `json:"fromUser"` //发送微信号
ToUser string `json:"toUser"` //接收微信号
MsgId string `json:"msgId"` //消息id
MsgType string `json:"msgType"` //其他消息具体类型(47:表示动图 )
IsGroup bool `json:"isGroup"` //是否为群组消息
Timestamp string `json:"timestamp"` //时间
} `json:"data"`
}

+ 143
- 0
super_cloud_issuance/md/mod.go View File

@@ -0,0 +1,143 @@
package md

type MultiNav struct {
CateName string `json:"cate_name"`
CateTag string `json:"cate_tag"`
Data CommModData `json:"data"`
ID string `json:"id"`
Img string `json:"img"`
ImgURL string `json:"img_url"`
Index int64 `json:"index"`
IsEnd string `json:"is_end"`
IsJump string `json:"is_jump"`
Name string `json:"name"`
RequiredLogin string `json:"required_login"`
RequiredTaobaoAuth string `json:"required_taobao_auth"`
RightIcon string `json:"right_icon"`
RightIconURL string `json:"right_icon_url"`
SkipIdentifier string `json:"skip_identifier"`
SkipName string `json:"skip_name"`
SubTitle string `json:"sub_title"`
Title string `json:"title"`
TypeListKey string `json:"type_list_key"`
URL string `json:"url"`
}

// 公共data数据
type CommModData struct {
AdvInfo string `json:"adv_info"`
AlipayUrl string `json:"alipay_url"`
AlipayAppid string `json:"alipay_appid"`
AdvType string `json:"adv_type"`
IsCanBuy string `json:"is_can_buy"`
IsShowCouponList string `json:"is_show_coupon_list"`
UserCouponAmount string `json:"user_coupon_amount"`
Coupon string `json:"coupon"`
Url string `json:"url"`
AppId string `json:"app_id"`
ActivityId string `json:"activity_id"`
Id string `json:"id"`
AdName string `json:"ad_name"`
AndroidAdID string `json:"android_ad_id"`
AndroidMediaID string `json:"android_media_id"`
AutoClickAd string `json:"auto_click_ad"`
Autoplay string `json:"autoplay"`
BrandID string `json:"brand_id"`
Conditions string `json:"conditions"`
CreateAt string `json:"create_at"`
EndTime string `json:"end_time"`
Img string `json:"img"`
IosAdID string `json:"ios_ad_id"`
IosMediaID string `json:"ios_media_id"`
IsRecommend interface{} `json:"is_recommend"`
LevelLimitID string `json:"level_limit_id"`
LevelLimitName string `json:"level_limit_name"`
LevelWeight string `json:"level_weight"`
NeedLocation int64 `json:"need_location"`
SdkType string `json:"sdk_type"`
Type string `json:"type"`
SourceType string `json:"source_type"`
StartTime string `json:"start_time"`
UpdateAt string `json:"update_at"`
VisitCount string `json:"visit_count"`
CountingDown string `json:"counting_down" `
FunctionSkipType string `json:"function_skip_type"`
OpenType string `json:"open_type" ` //app 应用内打开 browser 系统浏览器打开
GoodsId string `json:"goods_id"`
GoodsType string `json:"goods_type"`
SecondAdvList AdvCommModData `json:"second_adv_list"`
ThirdAdvList AdvCommModData `json:"third_adv_list"`
LevelType string `json:"level_type"`
//IsShowConditionPop string `json:"is_show_condition_pop"`
//ShowConditionStr string `json:"show_condition_str"`
//ShowConditionSkip SkipData `json:"show_condition_skip"`
}

// 公共data数据
type AdvCommModData struct {
Id string `json:"id"`
AdName string `json:"ad_name"`
AndroidAdID string `json:"android_ad_id"`
AndroidMediaID string `json:"android_media_id"`
AutoClickAd string `json:"auto_click_ad"`
Autoplay string `json:"autoplay"`
IosAdID string `json:"ios_ad_id"`
IosMediaID string `json:"ios_media_id"`
SdkType string `json:"sdk_type"`
AdvType string `json:"adv_type"`
}
type ShowCondition struct {
IsShowConditionPop string `json:"is_show_condition_pop"`
ShowConditionStr string `json:"show_condition_str"`
ShowConditionSkip SkipData `json:"show_condition_skip"`
}
type NextCommModData struct {
Url string `json:"url"`
AppId string `json:"app_id"`
AlipayUrl string `json:"alipay_url"`
AlipayAppid string `json:"alipay_appid"`
ActivityId string `json:"activity_id"`
Id string `json:"id"`
AdName string `json:"ad_name"`
AndroidAdID string `json:"android_ad_id"`
AndroidMediaID string `json:"android_media_id"`
AutoClickAd string `json:"auto_click_ad"`
Autoplay string `json:"autoplay"`
BrandID string `json:"brand_id"`
Conditions string `json:"conditions"`
CreateAt string `json:"create_at"`
EndTime string `json:"end_time"`
Img string `json:"img"`
IosAdID string `json:"ios_ad_id"`
IosMediaID string `json:"ios_media_id"`
IsRecommend interface{} `json:"is_recommend"`
LevelLimitID string `json:"level_limit_id"`
LevelLimitName string `json:"level_limit_name"`
LevelWeight string `json:"level_weight"`
NeedLocation int64 `json:"need_location"`
SdkType string `json:"sdk_type"`
SourceType string `json:"source_type"`
StartTime string `json:"start_time"`
UpdateAt string `json:"update_at"`
VisitCount string `json:"visit_count"`
CountingDown string `json:"counting_down" `
LevelType string `json:"level_type"`
OpenType string `json:"open_type" ` //app 应用内打开 browser 系统浏览器打开
}
type SkipData struct {
SkipName string `json:"skip_name"`
SkipIdentifier string `json:"skip_identifier"`
RequiredLogin string `json:"required_login"`
RequiredTaobaoAuth string `json:"required_taobao_auth"`
IsJump string `json:"is_jump"`
Data NextCommModData `json:"data"`
}

type NewSelectList struct {
Key string `json:"key"`
Name string `json:"name"`
}
type NewValList struct {
Val string `json:"val"`
Name string `json:"name"`
}

+ 14
- 0
super_cloud_issuance/md/mq.go View File

@@ -0,0 +1,14 @@
package md

const RobotQrcodeMacLoginQueue = "super_cloud_issuance_async_mlogin"
const SuperCloudIssuanceMsgCallBackQueue = "super_cloud_issuance_msg_call_back" //超级云发单消息回调

type SuperCloudIssuanceAsyncMLogin struct {
UserId string `json:"user_id"` //用户id
MasterId string `json:"master_id"` //站长id
WId string `json:"wId"` //实例id
RobotId int `json:"robot_id"` //机器人id
QrCodeUrl string `json:"qrCodeUrl"`
}

const SuperCloudIssuanceMsgCallBackExchange = "zhios.super.cloud.issuance.msg.callback.exchange"

+ 49
- 0
super_cloud_issuance/md/pay.go View File

@@ -0,0 +1,49 @@
package md

const (
BALANCE_PAY = "balance_pay"
ALIPAY = "alipay"
WX_PAY = "wxpay"
FB_PAY_ALI = "fb_pay_ali"
FB_PAY_WX = "fb_pay_wx"
FB_PAY_WX_SUB = "fb_pay_wx_sub"
SuperCloudIssuancePackage = "super_cloud_issuance_package"
ONE_CALLBACK_URL = "%s/api/v1/superCloudIssuance/pay/callback?master_id=%s&order_type=%s&pay_method=%s"
)

var NeedPayPart = map[string]string{
SuperCloudIssuancePackage: "云发单套餐",
}

var PayMethodIDToName = map[int]string{
1: "余额支付",
2: "支付宝支付",
3: "微信支付",
18: "乐刷支付宝支付",
19: "乐刷微信支付",
}
var PayStateToName = map[int]string{
0: "未支付",
1: "已支付",
2: "支付失败",
}

// PayMethodIDs 支付方式ID
var PayMethodIDs = map[string]int{
BALANCE_PAY: 1,
ALIPAY: 2,
WX_PAY: 3,
FB_PAY_ALI: 18,
FB_PAY_WX: 19,
FB_PAY_WX_SUB: 19,
}

type BuyPackageReq struct {
PackageId int `json:"package_id"` //套餐id
}

type PayRechargeResp struct {
MainOrdId string
Total string
Uid string
}

+ 38
- 0
super_cloud_issuance/md/platform.go View File

@@ -0,0 +1,38 @@
package md

const (
/*********** DEVICE ***********/
PLATFORM_WX_APPLET = "wx_applet" // 小程序
PLATFORM_TOUTIAO_APPLET = "toutiao_applet"
PLATFORM_TIKTOK_APPLET = "tiktok_applet"
PLATFORM_BAIDU_APPLET = "baidu_applet"
PLATFORM_ALIPAY_APPLET = "alipay_applet"
PLATFORM_WAP = "wap" //h5
PLATFORM_ANDROID = "android"
PLATFORM_IOS = "ios"
PLATFORM_JSAPI = "jsapi" // 公众号
)

const WX_PAY_BROWSER = "wx_pay_browser" // 用于判断显示支付方式

var PlatformList = map[string]struct{}{
PLATFORM_WX_APPLET: {},
PLATFORM_TOUTIAO_APPLET: {},
PLATFORM_TIKTOK_APPLET: {},
PLATFORM_BAIDU_APPLET: {},
PLATFORM_ALIPAY_APPLET: {},
PLATFORM_WAP: {},
PLATFORM_ANDROID: {},
PLATFORM_IOS: {},
}

var PlatformMap = map[string]string{
"android": "2",
"ios": "2",
"wap": "4", // 和小程序公用模板
"wx_applet": "4", //微信小程序
"tiktok_applet": "4",
"baidu_applet": "4",
"alipay_applet": "4",
"toutiao_applet": "4",
}

+ 42
- 0
super_cloud_issuance/md/split_db.go View File

@@ -0,0 +1,42 @@
package md

import (
"regexp"

"xorm.io/xorm"
)

type DbInfo struct {
User string
Psw string
Name string
Host string
}

func SplitDbInfo(eg *xorm.Engine) *DbInfo {
if eg == nil {
return &DbInfo{
User: "nil",
Psw: "nil",
Host: "nil",
Name: "nil",
}
}
pattern := `(\w+):(.*)@tcp\(([\w\.\-\:\_]+)\)\/(\w+)`
reg := regexp.MustCompile(pattern).FindStringSubmatch(eg.DataSourceName())

if len(reg) < 5 {
return &DbInfo{
User: "unknown",
Psw: "unknown",
Host: "unknown",
Name: "unknown",
}
}
return &DbInfo{
User: reg[1],
Psw: reg[2],
Host: reg[3],
Name: reg[4],
}
}

+ 39
- 0
super_cloud_issuance/md/user_info.go View File

@@ -0,0 +1,39 @@
package md

import (
"applet/app/db/model"
)

type UserInfoResponse struct {
Avatar string `json:"avatar"`
NickName string `json:"nickname"`
Gender string `json:"gender"`
Birthday string `json:"birthday"`
RegisterTime string `json:"register_time"`
FileBucketURL string `json:"file_bucket_url"`
FileFormat string `json:"file_format"`
IsNoChange string `json:"is_no_change"`
IsUpLoadWx string `json:"is_upload_wx"`
}

type User struct {
Info *model.User
Profile *model.UserProfile
Level *model.UserLevel
Tags []string
}

type UserRelation struct {
Uid int
CurUid int
Diff int // 与当前用户级别差
Level int // 用户当前等级
OldDiff int // 旧的级别
}

type UserTree struct {
Uid int `json:"uid"`
Nickname string `json:"nickname"`
Phone string `json:"phone"`
Children []*UserTree `json:"children"`
}

+ 30
- 0
super_cloud_issuance/md/wxpay.go View File

@@ -0,0 +1,30 @@
package md

type WxPayParams struct {
Subject string `json:"subject" binding:"required"`
Amount string `json:"amount" binding:"required"`
OrderType string `json:"order_type" binding:"required"`
OrdId string `json:"ord_id"`
}

type WxPayCallback struct {
AppId string `json:"appid"`
BankType string `json:"bank_type"`
CashFee string `json:"cash_fee"`
FeeType string `json:"fee_type"`
IsSubscribe string `json:"is_subscribe"`
MasterID string `json:"master_id"`
MchID string `json:"mch_id"`
NonceStr string `json:"nonce_str"`
Openid string `json:"openid"`
OrderType string `json:"order_type"`
OutTradeNo string `json:"out_trade_no"`
PayMethod string `json:"pay_method"`
ResultCode string `json:"result_code"`
ReturnCode string `json:"return_code"`
Sign string `json:"sign"`
TimeEnd string `json:"time_end"`
TotalFee string `json:"total_fee"`
TradeType string `json:"trade_type"`
TransactionID string `json:"transaction_id"`
}

+ 89
- 0
super_cloud_issuance/svc/copy_writing.go View File

@@ -0,0 +1,89 @@
package svc

import (
"applet/app/utils"
"applet/super_cloud_issuance/lib/baidu"
"applet/super_cloud_issuance/lib/zhimeng"
"github.com/gin-gonic/gin"
"github.com/tidwall/gjson"
"math/rand"
"strings"
)

func GetContent(c *gin.Context, content string, ProductCopy, ProductTitle,
ProductOriginalPrice, ProductCouponPrice, ProductCoupon, taokou, shorturl, goodsContent string) string {
inviteLink := InviteLinks(c)
user := GetUser(c)
content = strings.Replace(content, "{商品文案}", ProductCopy, 1)
content = strings.Replace(content, "{商品标题}", ProductTitle, 1)
content = strings.Replace(content, "{原价}", ProductOriginalPrice, 1)
content = strings.Replace(content, "{现价}", ProductCouponPrice, 1)
content = strings.Replace(content, "{优惠券}", ProductCoupon, 1)
content = strings.Replace(content, "{文案}", goodsContent, 1)
if user.Profile.CustomInviteCode != "" {
content = strings.Replace(content, "{邀请码}", user.Profile.CustomInviteCode, 1)
} else {
content = strings.Replace(content, "{邀请码}", user.Profile.InviteCode, 1)
}
content = strings.Replace(content, "{邀请注册链接}", inviteLink, 1)
content = strings.Replace(content, "{下载链接}", ImageFormat(c, SysCfgGet(c, "app_android_download_url")), 1)
content = strings.Replace(content, "{应用宝下载链接}", SysCfgGet(c, "app_treasure_url"), 1)
content = strings.Replace(content, "{口令}", taokou, 1)
content = strings.Replace(content, "{商品链接}", shorturl, 1)

if taokou != "" {
content = utils.IntToStr(rand.Intn(9)) + content
}
return content
}

func InviteLinks(c *gin.Context) string {
user := GetUser(c)
//downLoadRoute := "/#/zy-landing-page/pages/lading-page-download/lading-page-download?invited_code="
registerRoute := "/#/zy-landing-page/pages/landing-page-login/landing-page-login?invited_code="
h5Domain := GetWebSiteDomainInfo(c, "wap")
var inviteLink = ""
//if user.Profile.CustomInviteCode != "" {
// inviteLink = h5Domain + downLoadRoute + user.Profile.CustomInviteCode
//} else {
// inviteLink = h5Domain + downLoadRoute + user.Profile.InviteCode
//}
//urlType := gjson.Get(mdata, "url_type").String()
if user.Profile.CustomInviteCode != "" {
inviteLink = h5Domain + registerRoute + user.Profile.CustomInviteCode
} else {
inviteLink = h5Domain + registerRoute + user.Profile.InviteCode
}
//判断生成短链
inviteLink = CommShareShorUrl(c, inviteLink)
return inviteLink
}

// 公共处理链接转换短链
func CommShareShorUrl(c *gin.Context, shareUrl string) string {
val := SysCfgFind(c, "share_link_type")
if val["share_link_type"] == "1" { //百度短链
shareUrl, _ = baidu.ShortenUrl(shareUrl)
} else if val["share_link_type"] == "2" { //快站短链
shareUrl = KuaiZhanShortURL(c, shareUrl)
}
return shareUrl
}

// KuaiZhanShortURL is 快站短链
func KuaiZhanShortURL(c *gin.Context, url string) string {
args := map[string]interface{}{
"appkey": SysCfgGet(c, "third_zm_app_key"),
"secret_key": SysCfgGet(c, "third_zm_app_key"),
"url": utils.Base64StdEncode(url),
}
resp, err := zhimeng.Send("kuaizhan", "short_url", args)
if err != nil {
return ""
}
kurl := gjson.GetBytes(resp, "data.shortUrl").String()
if kurl == "" {
kurl = url
}
return kurl
}

+ 14
- 0
super_cloud_issuance/svc/svc_auth.go View File

@@ -0,0 +1,14 @@
package svc

import (
"applet/super_cloud_issuance/md"
"github.com/gin-gonic/gin"
)

func GetUser(c *gin.Context) *md.User {
user, _ := c.Get("user")
if user == nil {
return nil
}
return user.(*md.User)
}

+ 369
- 0
super_cloud_issuance/svc/svc_cloud_issuance.go View File

@@ -0,0 +1,369 @@
package svc

import (
"applet/app/cfg"
"applet/app/db"
"applet/cloud_issuance/enum"
"applet/mall/utils"
"applet/super_cloud_issuance/md"
"applet/super_cloud_issuance/tool/super_cloud_issuance"
"code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement"
"encoding/json"
"github.com/gin-gonic/gin"
"strconv"
"strings"
)

type CloudIssuanceService struct {
Context *gin.Context `json:"context"`
RequestMethodName string `json:"request_method_name"`
RequestClientIp string `json:"request_client_ip"`
}

func (svcCloudIssuance *CloudIssuanceService) Set(c *gin.Context, methodName, clientIp string) { // set方法
svcCloudIssuance.Context = c
svcCloudIssuance.RequestMethodName = methodName
svcCloudIssuance.RequestClientIp = clientIp
}

func (svcCloudIssuance *CloudIssuanceService) RobotCreate(args md.RobotCreateRequest) (err error, result md.RobotCreateResponse) { // 添加机器人
if !cfg.Prd {
//TODO::测试环境不用买
return
}
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"month": strconv.Itoa(args.Month),
"robot_type": args.RobotType,
"wechatrobot": args.WechatRobot,
"remark": args.Remark,
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}

//result, ok := data.Data.(md.RobotCreateResponse)
//if !ok {
// err = errors.New("返回的结果 can not convert")
//}
return
}

func (svcCloudIssuance *CloudIssuanceService) QrcodeMacLogin(args md.RobotQrcodeMacLoginRequest) (err error, result md.RobotQrcodeMacLoginResponse) { // 获取登录二维码
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotAsyncMacLogin(args md.RobotAsyncMacLoginRequest) (err error, result md.RobotAsyncMacLoginResponse) { // 同步登录状态
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"wId": args.WId,
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotForceOffline(args md.RobotForceOfflineRequest) (err error) { // 下线机器人
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
})
_, err = svcCloudIssuance.SendPost(url, args)
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotSecondLogin(args md.RobotSecondLoginRequest) (err error, result md.RobotSecondLoginResponse) { // 二次登录
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotChange(args md.RobotChangeRequest) (err error, result md.RobotChangeResponse) { // 机器人修改/续费
if !cfg.Prd {
//TODO::测试环境不用买
return
}
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"month": strconv.Itoa(args.Month),
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotReset(args md.RobotResetRequest) (err error) { // 重置机器人
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
})
_, err = svcCloudIssuance.SendPost(url, args)
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotRoomListV1(args md.RobotRoomListRequest) (err error, result []md.RobotRoomDetailResponse) { // 群组列表
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
utils.FilePutContents("RobotRoomListV1", utils.SerializeStr(map[string]interface{}{
"args": args,
"resp": data,
}))

return
}

func (svcCloudIssuance *CloudIssuanceService) RobotRoomList(args md.RobotRoomListRequest) (err error, result []md.RobotRoomDetailResponse) { // 群组列表
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
utils.FilePutContents("RobotRoomList", utils.SerializeStr(map[string]interface{}{
"args": args,
"resp": data,
}))
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
var list = md.RobotRoomListResponse{}
err = json.Unmarshal(resByte, &list)
if err != nil {
return
}

//TODO::每次最多5个 调用"群组详情"接口
i := 0
var tmpList = md.RobotRoomListResponse{}
var tmpResult []md.RobotRoomDetailResponse
for i < len(list) {
tmpList = append(tmpList, list[i])
i++
if len(tmpList) == 1 {
roomId := strings.Join(tmpList, ",")
requestUrl := super_cloud_issuance.HttpBuild(enum.RobotRoomDetailMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"room_id": roomId,
})
data, err = svcCloudIssuance.SendPost(requestUrl, md.RobotRoomDetailRequest{
RobotId: args.RobotId,
RoomId: roomId,
})
resByte, err = json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &tmpResult)
if err != nil {
return
}
result = append(result, tmpResult...)
tmpList = md.RobotRoomListResponse{}
}
}

if len(tmpList) > 0 {
roomId := strings.Join(list, ",")
requestUrl := super_cloud_issuance.HttpBuild(enum.RobotRoomDetailMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"room_id": roomId,
})
data, err = svcCloudIssuance.SendPost(requestUrl, md.RobotRoomDetailRequest{
RobotId: args.RobotId,
RoomId: roomId,
})
resByte, err = json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &tmpResult)
if err != nil {
return
}
result = append(result, tmpResult...)
tmpList = md.RobotRoomListResponse{}
}

return
}

func (svcCloudIssuance *CloudIssuanceService) RobotMacGetChatRoomMember(args md.RobotMacGetChatRoomMemberRequest) (err error, result []md.RobotMacGetChatRoomMemberResponseV1) { // 获取群成员
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"room_id": args.RoomId,
})
data, err := svcCloudIssuance.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotMacSendCard(args md.RobotMacSendCardRequest) (err error) { // 发送链接消息
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"wx_id": args.WxId,
"title": args.Title,
"url": args.Url,
"description": args.Description,
"thumbUrl": args.ThumbUrl,
})
_, err = svcCloudIssuance.SendPost(url, args)
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotMacSendUri(args md.RobotMacSendUriRequest) (err error) { // 发送uri图片消息
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"toWxId": args.WxId,
"pic_url": args.PicUrl,
})
_, err = svcCloudIssuance.SendPost(url, args)
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotMacSendText(args md.RobotMacSendTextRequest) (err error) { // 发送文本消息
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"toWxId": args.WxId,
"content": args.Content,
})
resp, err := svcCloudIssuance.SendPost(url, args)
if args.RobotId == 487259 {
utils.FilePutContents("RobotMacSendText_487259", utils.SerializeStr(resp))
}
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotMacSendRecvImage(args md.RobotMacSendRecvImageRequest) (err error) { // 发送文本消息
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"wx_id": args.WxId,
"content": args.Content,
})
_, err = svcCloudIssuance.SendPost(url, args)
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotMacSendRecvVideo(args md.RobotMacSendRecvVideoRequest) (err error) { // 发送文本消息
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"wx_id": args.WxId,
"content": args.Content,
})
_, err = svcCloudIssuance.SendPost(url, args)
return
}

func (svcCloudIssuance *CloudIssuanceService) RobotMacSendCircle(args md.RobotMacSendCircleRequest) (err error) { // 下线机器人
url := super_cloud_issuance.HttpBuild(svcCloudIssuance.RequestMethodName, svcCloudIssuance.RequestClientIp, map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"pic_url": args.PicUrl,
"content": args.Content,
})
_, err = svcCloudIssuance.SendPostForCircle(url, args)
return
}

func (svcCloudIssuance *CloudIssuanceService) SendPost(url string, args interface{}) (data md.CurlResponse, err error) {
data, err = super_cloud_issuance.SendPost(url, args)
if data.Status == "1123" && data.Msg == "当前机器人不在线" && svcCloudIssuance.Context != nil {
masterId := svcCloudIssuance.Context.GetString("mid")
engine := db.DBs[masterId]
user := GetUser(svcCloudIssuance.Context)
superCloudIssuanceUserRobotDb := implement.NewSuperCloudIssuanceUserRobotDb(engine, user.Info.Uid, masterId)
robot, err := superCloudIssuanceUserRobotDb.GetSuperCloudIssuanceUserRobot()
if err != nil {
panic(err)
}
robot.LoginStatus = enum.NotLogin
superCloudIssuanceUserRobotDb.SaveSuperCloudIssuanceUserRobot(robot.Id, robot, "login_status")
}
return
}

func (svcCloudIssuance *CloudIssuanceService) SendPostForCircle(url string, args interface{}) (data md.CurlResponseForCircle, err error) {
data, err = super_cloud_issuance.SendPostForCircle(url, args)
if data.Code == "1123" && data.Message == "当前机器人不在线" && svcCloudIssuance.Context != nil {
masterId := svcCloudIssuance.Context.GetString("mid")
engine := db.DBs[masterId]
user := GetUser(svcCloudIssuance.Context)
superCloudIssuanceUserRobotDb := implement.NewSuperCloudIssuanceUserRobotDb(engine, user.Info.Uid, masterId)
robot, err := superCloudIssuanceUserRobotDb.GetSuperCloudIssuanceUserRobot()
if err != nil {
panic(err)
}
robot.LoginStatus = enum.NotLogin
superCloudIssuanceUserRobotDb.SaveSuperCloudIssuanceUserRobot(robot.Id, robot, "login_status")
}
return
}

+ 11
- 0
super_cloud_issuance/svc/svc_db.go View File

@@ -0,0 +1,11 @@
package svc

import (
"applet/app/db"
"github.com/gin-gonic/gin"
"xorm.io/xorm"
)

func MasterDb(c *gin.Context) *xorm.Engine {
return db.DBs[c.GetString("mid")]
}

+ 210
- 0
super_cloud_issuance/svc/svc_deal_call_back.go View File

@@ -0,0 +1,210 @@
package svc

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils/cache"
"applet/mall/utils"
db2 "applet/super_cloud_issuance/db"
"applet/super_cloud_issuance/enum"
"applet/super_cloud_issuance/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/chain_transfer"
"code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement"
"code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models"
"fmt"
"github.com/gin-gonic/gin"
"time"
)

type DealSuperCloudIssuanceCallBackService struct {
Context *gin.Context `json:"context"`
}

func (dealSuperCloudIssuanceCallBackService *DealSuperCloudIssuanceCallBackService) Set(c *gin.Context) { // set方法
dealSuperCloudIssuanceCallBackService.Context = c
}

func (dealSuperCloudIssuanceCallBackService *DealSuperCloudIssuanceCallBackService) DealCallBack(c *gin.Context, req md.CallbackRequest) {
//1、初始化云发单类
cloudIssuanceService := CloudIssuanceService{}
engine := db.DBs[dealSuperCloudIssuanceCallBackService.Context.GetString("mid")]

//2、判断是否为群组消息
if req.Data.IsGroup {
//2、判断消息类型
switch req.MessageType {
case 9:
dealSuperCloudIssuanceCallBackService.DealSourceGroupMessage(req.Data.FromGroup, req)

//群聊文本消息
bindId := dealSuperCloudIssuanceCallBackService.IsNeedDealGroupMessage(req.Data.FromGroup, req.Data.FromUser, req.RobotId)
if bindId == 0 {
return
}
//3、查询需转发的群
superCloudIssuanceUserRobotBindFollowGroupDb := implement.NewSuperCloudIssuanceUserRobotBindFollowGroupDb(engine)
cloudIssuanceUserRobotBindFollowGroups, err := superCloudIssuanceUserRobotBindFollowGroupDb.GetCloudIssuanceUserRobotBindFollowGroupByBindId(bindId)
if err != nil {
fmt.Println("DealCallBack_err::::", err.Error())
return
}
cache.NewRedis(cfg.RedisAddr)
cloudIssuanceUserRobotBindFollowDb := implement.NewSuperCloudIssuanceUserRobotBindFollowDb(engine)
cloudIssuanceUserRobotBindFollow, err := cloudIssuanceUserRobotBindFollowDb.GetCloudIssuanceUserRobotBindFollow(bindId)
for _, cloudIssuanceUserRobotBindFollowGroup := range cloudIssuanceUserRobotBindFollowGroups {
fmt.Println(cloudIssuanceUserRobotBindFollowGroup)
cloudIssuanceService.Set(nil, enum.RobotMacSendTextMethodName, "127.0.0.1")
//转链
if cloudIssuanceUserRobotBindFollow.Uid > 0 {
args := map[string]string{
"uid": utils.IntToStr(cloudIssuanceUserRobotBindFollow.Uid),
"platform": "",
"master_id": c.GetString("mid"),
"content": req.Data.Content,
}
utils.FilePutContents("cloud", utils.SerializeStr(args))
chain := chain_transfer.TurnChain(MasterDb(c), db.Db, db2.ZhimengDb, args)
utils.FilePutContents("cloud", utils.SerializeStr(chain))
if chain.Count != "" {
req.Data.Content = chain.Count
}
}
utils.FilePutContents("cloud", req.Data.Content)
err = cloudIssuanceService.RobotMacSendText(md.RobotMacSendTextRequest{
RobotId: req.RobotId,
WxId: cloudIssuanceUserRobotBindFollowGroup.FollowChatRoomId,
Content: req.Data.Content,
})
if err != nil {
fmt.Println("DealCallBack_err::::", err.Error())
return
}
}
break
case 10:
dealSuperCloudIssuanceCallBackService.DealSourceGroupMessage(req.Data.FromGroup, req)

//群聊图片消息
bindId := dealSuperCloudIssuanceCallBackService.IsNeedDealGroupMessage(req.Data.FromGroup, req.Data.FromUser, req.RobotId)
if bindId == 0 {
return
}
//3、查询需转发的群
superCloudIssuanceUserRobotBindFollowGroupDb := implement.NewSuperCloudIssuanceUserRobotBindFollowGroupDb(engine)
cloudIssuanceUserRobotBindFollowGroups, err := superCloudIssuanceUserRobotBindFollowGroupDb.GetCloudIssuanceUserRobotBindFollowGroupByBindId(bindId)
if err != nil {
fmt.Println("DealCallBack_err::::", err.Error())
return
}
for _, cloudIssuanceUserRobotBindFollowGroup := range cloudIssuanceUserRobotBindFollowGroups {
cloudIssuanceService.Set(nil, enum.RobotMacSendRecvImageMethodName, "127.0.0.1")
err = cloudIssuanceService.RobotMacSendRecvImage(md.RobotMacSendRecvImageRequest{
RobotId: req.RobotId,
WxId: cloudIssuanceUserRobotBindFollowGroup.FollowChatRoomId,
Content: req.Data.Content,
})
if err != nil {
fmt.Println("DealCallBack_err::::", err.Error())
return
}
}
break
case 11:
dealSuperCloudIssuanceCallBackService.DealSourceGroupMessage(req.Data.FromGroup, req)

//群聊视屏消息
bindId := dealSuperCloudIssuanceCallBackService.IsNeedDealGroupMessage(req.Data.FromGroup, req.Data.FromUser, req.RobotId)
if bindId == 0 {
return
}
//3、查询需转发的群
superCloudIssuanceUserRobotBindFollowGroupDb := implement.NewSuperCloudIssuanceUserRobotBindFollowGroupDb(engine)
cloudIssuanceUserRobotBindFollowGroups, err := superCloudIssuanceUserRobotBindFollowGroupDb.GetCloudIssuanceUserRobotBindFollowGroupByBindId(bindId)
if err != nil {
fmt.Println("DealCallBack_err::::", err.Error())
return
}
for _, cloudIssuanceUserRobotBindFollowGroup := range cloudIssuanceUserRobotBindFollowGroups {
cloudIssuanceService.Set(nil, enum.RobotMacSendRecvViedoMethodName, "127.0.0.1")
err = cloudIssuanceService.RobotMacSendRecvVideo(md.RobotMacSendRecvVideoRequest{
RobotId: req.RobotId,
WxId: cloudIssuanceUserRobotBindFollowGroup.FollowChatRoomId,
Content: req.Data.Content,
})
if err != nil {
fmt.Println("DealCallBack_err::::", err.Error())
return
}
}
break
}
}
}

func (dealSuperCloudIssuanceCallBackService *DealSuperCloudIssuanceCallBackService) IsNeedDealGroupMessage(fromGroup, fromUser string, robotId int) (bindId int) {
//查询 "发送群号" 是否被监听
superCloudIssuanceUserRobotBindFollowDb := implement.NewSuperCloudIssuanceUserRobotBindFollowDb(db.DBs[dealSuperCloudIssuanceCallBackService.Context.GetString("mid")])
cloudIssuanceUserRobotBindFollow, err := superCloudIssuanceUserRobotBindFollowDb.GetCloudIssuanceUserRobotBindFollowByChatRoomId(fromGroup, robotId)
if err != nil {
fmt.Println("IsNeedDealGroupMessage_Err:::::", err.Error())
return
}
if cloudIssuanceUserRobotBindFollow == nil {
return
}

//查询 "发送微信号" 是否被监听
superCloudIssuanceUserRobotBindFollowUserDb := implement.NewSuperCloudIssuanceUserRobotBindFollowUserDb(db.DBs[dealSuperCloudIssuanceCallBackService.Context.GetString("mid")])
cloudIssuanceUserRobotBindFollowUser, err := superCloudIssuanceUserRobotBindFollowUserDb.GetCloudIssuanceUserRobotBindFollowUserByWxId(fromUser)
if err != nil {
fmt.Println("IsNeedDealGroupMessage_Err:::::", err.Error())
return
}
if cloudIssuanceUserRobotBindFollowUser == nil {
return
}

bindId = cloudIssuanceUserRobotBindFollow.ActivateGroupId
return
}

func (dealSuperCloudIssuanceCallBackService *DealSuperCloudIssuanceCallBackService) DealSourceGroupMessage(fromGroup string, req md.CallbackRequest) (err error) {
engine := db.DBs[dealSuperCloudIssuanceCallBackService.Context.GetString("mid")]
//查询 "发送群号" 是否为源头群
superCloudIssuanceUserRobotWithActivateGroupDb := implement.NewSuperCloudIssuanceUserRobotWithActivateGroupDb(engine)
superCloudIssuanceUserRobotWithActivateGroup, err := superCloudIssuanceUserRobotWithActivateGroupDb.GetSuperCloudIssuanceUserRobotWithActivateGroupByChatRoomId(fromGroup, req.RobotId)
if err != nil {
fmt.Println("DealSourceGroupMessage_Err:::::", err.Error())
return
}
if superCloudIssuanceUserRobotWithActivateGroup == nil {
return
}
activateGroupId := superCloudIssuanceUserRobotWithActivateGroup.Id

superCloudIssuanceUserRobotBindSourceDb := implement.NewSuperCloudIssuanceUserRobotBindSourceDb(engine)
superCloudIssuanceUserRobotBindSource, err := superCloudIssuanceUserRobotBindSourceDb.GetSuperCloudIssuanceUserRobotBindSource(activateGroupId)
if err != nil {
fmt.Println("DealSourceGroupMessage_Err:::::", err.Error())
return
}
if superCloudIssuanceUserRobotBindSource != nil {
superCloudIssuanceUserRobotBindSourceMessageLog := models.SuperCloudIssuanceUserRobotBindSourceMessageLog{
ActivateGroupId: superCloudIssuanceUserRobotBindSource.ActivateGroupId,
MessageType: req.MessageType,
Timestamp: utils.StrToInt64(req.Data.Timestamp),
Content: req.Data.Content,
CreateAt: time.Now().Format("2006-01-02 15:04:05"),
UpdateAt: time.Now().Format("2006-01-02 15:04:05"),
}

superCloudIssuanceUserRobotBindSourceMessageLogDb := implement.NewSuperCloudIssuanceUserRobotBindSourceMessageLogDb(engine)
_, err = superCloudIssuanceUserRobotBindSourceMessageLogDb.InsertSuperCloudIssuanceUserRobotBindSourceMessageLog(&superCloudIssuanceUserRobotBindSourceMessageLog)
if err != nil {
fmt.Println("DealSourceGroupMessage_Err:::::", err.Error())
return err
}
}

return
}

+ 58
- 0
super_cloud_issuance/svc/svc_domain_info.go View File

@@ -0,0 +1,58 @@
package svc

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"github.com/gin-gonic/gin"
"github.com/tidwall/gjson"
"strings"
)

// 获取指定类型的域名:admin、wap、api
func GetWebSiteDomainInfo(c *gin.Context, domainType string) string {
if domainType == "" {
domainType = "wap"
}

domainSetting := SysCfgGet(c, "domain_setting")

domainTypePath := domainType + ".type"
domainSslPath := domainType + ".isOpenHttps"
domainPath := domainType + ".domain"

domainTypeValue := gjson.Get(domainSetting, domainTypePath).String()
domainSslValue := gjson.Get(domainSetting, domainSslPath).String()
domain := gjson.Get(domainSetting, domainPath).String()

scheme := "http://"
if domainSslValue == "1" {
scheme = "https://"
}

// 有自定义域名 返回自定义的
if domainTypeValue == "own" && domain != "" {
return scheme + domain
}
// 否则返回官方的
official, err := db.GetOfficialDomainInfoByType(db.Db, c.GetString("mid"), domainType)
if err != nil {
_ = logx.Errorf("Get Official Domain Fail! %s", err)
return ""
}
if strings.Contains(official, "http") {
return official
}
return scheme + official
}

// 获取指定类型的域名对应的masterId:admin、wap、api
func GetWebSiteDomainMasterId(domainType string, host string) string {
obj := new(model.UserAppDomain)
has, err := db.Db.Where("domain=? and type=?", host, domainType).Get(obj)
if err != nil || !has {
return ""
}
return utils.AnyToString(obj.Uuid)
}

+ 71
- 0
super_cloud_issuance/svc/svc_file_img_format.go View File

@@ -0,0 +1,71 @@
package svc

import (
"applet/app/utils"
"fmt"
"strings"

"github.com/gin-gonic/gin"
)

//ImageFormat is 格式化 图片
func ImageFormat(c *gin.Context, name string) string {
if strings.Contains(name, "https:") || strings.Contains(name, "http:") {
return name
}
scheme := SysCfgGet(c, "file_bucket_scheme")
domain := SysCfgGet(c, "file_bucket_host")
return fmt.Sprintf("%s://%s/%s", scheme, domain, name)
}

//OffImageFormat is 格式化官方 图片
func OffImageFormat(c *gin.Context, name string) string {
if strings.Contains(name, "https:") || strings.Contains(name, "http:") {
return name
}
return fmt.Sprintf("%s://%s/%s", "http", "ossq.izhyin.cn", name)
}

// ImageBucket is 获取域名
func ImageBucket(c *gin.Context) (string, string) {
return SysCfgGet(c, "file_bucket_scheme"), SysCfgGet(c, "file_bucket_host")
}

// ImageBucketNew is 获取域名
func ImageBucketNew(c *gin.Context) (string, string, string, map[string]string) {
var list = make(map[string]string, 0)
for i := 1; i < 10; i++ {
keys := "file_bucket_sub_host" + utils.IntToStr(i)
list[keys] = SysCfgGet(c, keys)
}
return SysCfgGet(c, "file_bucket_scheme"), SysCfgGet(c, "file_bucket_host"), SysCfgGet(c, "file_bucket_sub_host"), list
}

// ImageFormatWithBucket is 格式化成oss 域名
func ImageFormatWithBucket(scheme, domain, name string) string {
if strings.Contains(name, "http") {
return name
}
return fmt.Sprintf("%s://%s/%s", scheme, domain, name)
}

// ImageFormatWithBucket is 格式化成oss 域名
func ImageFormatWithBucketNew(scheme, domain, subDomain string, moreSubDomain map[string]string, name string) string {
if strings.Contains(name, "http") {
return name
}
if strings.Contains(name, "{{subhost}}") && subDomain != "" { //读副域名 有可能是其他平台的
domain = subDomain
}
//为了兼容一些客户自营商城导到不同系统 并且七牛云不一样
for i := 1; i < 10; i++ {
keys := "file_bucket_sub_host" + utils.IntToStr(i)
if strings.Contains(name, "{{subhost"+utils.IntToStr(i)+"}}") && moreSubDomain[keys] != "" {
domain = moreSubDomain[keys]
}
name = strings.ReplaceAll(name, "{{subhost"+utils.IntToStr(i)+"}}", "")
}
name = strings.ReplaceAll(name, "{{host}}", "")
name = strings.ReplaceAll(name, "{{subhost}}", "")
return fmt.Sprintf("%s://%s/%s", scheme, domain, name)
}

+ 103
- 0
super_cloud_issuance/svc/svc_file_img_upload.go View File

@@ -0,0 +1,103 @@
package svc

import (
"applet/app/e"
"applet/app/utils"
"applet/super_cloud_issuance/lib/qiniu"
"applet/super_cloud_issuance/md"
"applet/super_cloud_issuance/utils/logx"
"fmt"
"strings"

"github.com/gin-gonic/gin"
)

// 请求文件上传
func ImgReqUpload(c *gin.Context, uid, dirName, fname, callbackUrl string, fsize int64) (interface{}, error) {
ext := utils.FileExt(fname)
if err := initStg(c, fsize, ext); err != nil {
return nil, err
}
// logx.Warn(uid)
newName := dirName + "_" + fmt.Sprintf("%010s", uid)

// if dirName == md.FILE_DIR_FEEDBACK || dirName == md.FILE_DIR_STYLE {
// newName += "_" + utils.FormatNanoUnix() + utils.RandString(4, "0123456789")
// }
// 默认都加时间戳
newName += "_" + utils.FormatNanoUnix() + utils.RandString(4, "0123456789")
newName += ".png" // 因为可能存在多种图像格式,这里统一后缀为png

f := &md.FileCallback{
Uid: uid,
DirId: md.FileUserDir[dirName],
FileName: newName,
}
// logx.Warn(f.Uid)
return qiniu.ReqImgUpload(f, callbackUrl), nil
}

func initStg(c *gin.Context, fsize int64, ext string) error {
// 获取上传配置
stgInfo := SysCfgFind(
c,
md.KEY_CFG_FILE_BUCKET,
md.KEY_CFG_FILE_HOST,
md.KEY_CFG_FILE_AK,
md.KEY_CFG_FILE_SK,
md.KEY_CFG_FILE_PVD,
md.KEY_CFG_FILE_REGION,
md.KEY_CFG_FILE_MAX_SIZE,
md.KEY_CFG_FILE_EXT,
md.KEY_CFG_FILE_SCHEME,
md.KEY_CFG_FILE_AVATAR_THUMBNAIL,
)
//?imageView2/1/w/120/h/120/format/webp/interlace/1
if stgInfo == nil {
return e.NewErrCode(e.ERR_CFG)
}
// todo 目前仅支持七牛
if v, ok := stgInfo[md.KEY_CFG_FILE_PVD]; !ok || v != "qiniu" {
return e.NewErrCode(e.ERR_CFG)
}
if v, ok := stgInfo[md.KEY_CFG_FILE_REGION]; !ok || v == "" {
return e.NewErrCode(e.ERR_CFG)
}
if v, ok := stgInfo[md.KEY_CFG_FILE_AK]; !ok || v == "" {
return e.NewErrCode(e.ERR_CFG)
}
if v, ok := stgInfo[md.KEY_CFG_FILE_SK]; !ok || v == "" {
return e.NewErrCode(e.ERR_CFG)
}
if v, ok := stgInfo[md.KEY_CFG_FILE_BUCKET]; !ok || v == "" {
return e.NewErrCode(e.ERR_CFG)
}
if v, ok := stgInfo[md.KEY_CFG_FILE_SCHEME]; !ok || v == "" {
stgInfo[md.KEY_CFG_FILE_SCHEME] = "http"
SysCfgSet(c, md.KEY_CFG_FILE_SCHEME, stgInfo[md.KEY_CFG_FILE_SCHEME], "文件域名HTTP协议")
}
qiniu.Init(stgInfo[md.KEY_CFG_FILE_AK], stgInfo[md.KEY_CFG_FILE_SK], stgInfo[md.KEY_CFG_FILE_BUCKET], stgInfo[md.KEY_CFG_FILE_REGION], stgInfo[md.KEY_CFG_FILE_SCHEME])
if v, ok := stgInfo[md.KEY_CFG_FILE_HOST]; !ok || v == "" {
var err error
stgInfo[md.KEY_CFG_FILE_HOST], err = qiniu.BucketGetDomain(stgInfo[md.KEY_CFG_FILE_BUCKET])
if err != nil {
logx.Error(err)
return e.NewErrCode(e.ERR_CFG)
}
SysCfgSet(c, md.KEY_CFG_FILE_HOST, stgInfo[md.KEY_CFG_FILE_HOST], "文件域名地址")
}
// 头像缩略图参数
if v, ok := stgInfo[md.KEY_CFG_FILE_AVATAR_THUMBNAIL]; !ok || v == "" {
SysCfgSet(c, md.KEY_CFG_FILE_AVATAR_THUMBNAIL, "?imageView2/1/w/200/h/200/format/png", "文件用户头像缩略图参数")
}

// 检查文件大小限制
if v, ok := stgInfo[md.KEY_CFG_FILE_MAX_SIZE]; ok && v != "" && utils.StrToInt64(v) < fsize {
return e.NewErrCode(e.ERR_FILE_MAX_SIZE)
}
// 检查文件后缀
if v, ok := stgInfo[md.KEY_CFG_FILE_EXT]; ok && v != "" && !strings.Contains(v, ext) {
return e.NewErrCode(e.ERR_FILE_EXT)
}
return nil
}

+ 68
- 0
super_cloud_issuance/svc/svc_fin_user_flow.go View File

@@ -0,0 +1,68 @@
package svc

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"time"
"xorm.io/xorm"
)

// 开始写入流水
func FlowInsert(eg *xorm.Engine, uid int, paidPrice string, orderAction int, ordId int64, id int64, goodsId int, ItemTitle string, ordType string, types int, beforeAmount string, afterAmount string) {
session := eg.NewSession()

now := time.Now()
if err := db.FinUserFlowInsertOneWithSession(
session,
&model.FinUserFlow{
Type: types,
Uid: uid,
Amount: paidPrice,
BeforeAmount: beforeAmount,
AfterAmount: afterAmount,
OrdType: ordType,
OrdId: utils.Int64ToStr(ordId),
OrdAction: orderAction,
OrdDetail: utils.IntToStr(goodsId),
State: 2,
OtherId: id,
OrdTitle: ItemTitle,
OrdTime: int(now.Unix()),
CreateAt: now,
UpdateAt: now,
}); err != nil {
_ = session.Rollback()
_ = logx.Warn(err)
return
}
}

// 开始写入流水
func SessionFlowInsert(session *xorm.Session, uid int, paidPrice string, orderAction int, ordId int64, id int64, goodsId int, ItemTitle string, ordType string, types int, beforeAmount string, afterAmount string) {
now := time.Now()
if err := db.FinUserFlowInsertOneWithSession(
session,
&model.FinUserFlow{
Type: types,
Uid: uid,
Amount: paidPrice,
BeforeAmount: beforeAmount,
AfterAmount: afterAmount,
OrdType: ordType,
OrdId: utils.Int64ToStr(ordId),
OrdAction: orderAction,
OrdDetail: utils.IntToStr(goodsId),
State: 2,
OtherId: id,
OrdTitle: ItemTitle,
OrdTime: int(now.Unix()),
CreateAt: now,
UpdateAt: now,
}); err != nil {
_ = session.Rollback()
_ = logx.Warn(err)
return
}
}

+ 85
- 0
super_cloud_issuance/svc/svc_redis_mutex_lock.go View File

@@ -0,0 +1,85 @@
package svc

import (
"applet/app/md"
"applet/app/utils"
"applet/app/utils/cache"
"errors"
"fmt"
"math/rand"
"reflect"
"time"
)

const redisMutexLockExpTime = 15

// TryGetDistributedLock 分布式锁获取
// requestId 用于标识请求客户端,可以是随机字符串,需确保唯一
func TryGetDistributedLock(lockKey, requestId string, isNegative bool) bool {
if isNegative { // 多次尝试获取
retry := 1
for {
ok, err := cache.Do("SET", lockKey, requestId, "EX", redisMutexLockExpTime, "NX")
// 获取锁成功
if err == nil && ok == "OK" {
return true
}
// 尝试多次没获取成功
if retry > 10 {
return false
}
time.Sleep(time.Millisecond * time.Duration(rand.Intn(1000)))
retry += 1
}
} else { // 只尝试一次
ok, err := cache.Do("SET", lockKey, requestId, "EX", redisMutexLockExpTime, "NX")
// 获取锁成功
if err == nil && ok == "OK" {
return true
}

return false
}
}

// ReleaseDistributedLock 释放锁,通过比较requestId,用于确保客户端只释放自己的锁,使用lua脚本保证操作的原子型
func ReleaseDistributedLock(lockKey, requestId string) (bool, error) {
luaScript := `
if redis.call("get",KEYS[1]) == ARGV[1]
then
return redis.call("del",KEYS[1])
else
return 0
end`

do, err := cache.Do("eval", luaScript, 1, lockKey, requestId)
fmt.Println(reflect.TypeOf(do))
fmt.Println(do)

if utils.AnyToInt64(do) == 1 {
return true, err
} else {
return false, err
}
}

func GetDistributedLockRequestId(prefix string) string {
return prefix + utils.IntToStr(rand.Intn(100000000))
}

// HandleBalanceDistributedLock 处理余额更新时获取锁和释放锁 如果加锁成功,使用语句 ` defer cb() ` 释放锁
func HandleBalanceDistributedLock(masterId, uid, requestIdPrefix string) (cb func(), err error) {
// 获取余额更新锁
balanceLockKey := fmt.Sprintf(md.UserFinValidUpdateLock, masterId, uid)
requestId := GetDistributedLockRequestId(requestIdPrefix)
balanceLockOk := TryGetDistributedLock(balanceLockKey, requestId, true)
if !balanceLockOk {
return nil, errors.New("系统繁忙,请稍后再试")
}

cb = func() {
_, _ = ReleaseDistributedLock(balanceLockKey, requestId)
}

return cb, nil
}

+ 137
- 0
super_cloud_issuance/svc/svc_sys_cfg_get.go View File

@@ -0,0 +1,137 @@
package svc

import (
"applet/app/db"
"applet/app/utils/cache"
"applet/super_cloud_issuance/md"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"strings"
"xorm.io/xorm"
)

// 单挑记录获取
func SysCfgGet(c *gin.Context, key string) string {
mid := c.GetString("mid")
eg := db.DBs[mid]
return db.SysCfgGetWithDb(eg, mid, key)
}

// 多条记录获取
func SysCfgFind(c *gin.Context, keys ...string) map[string]string {
e := db.DBs[c.GetString("mid")]
res := map[string]string{}
cacheKey := fmt.Sprintf(md.AppCfgCacheKey, c.GetString("mid"))
err := cache.GetJson(cacheKey, &res)
if err != nil || len(res) == 0 {
cfgList, _ := db.SysCfgGetAll(e)
if cfgList == nil {
return nil
}
for _, v := range *cfgList {
res[v.Key] = v.Val
}
// 先不设置缓存
cache.SetJson(cacheKey, res, md.CfgCacheTime)
}
if len(keys) == 0 {
return res
}
tmp := map[string]string{}
for _, v := range keys {
if val, ok := res[v]; ok {
tmp[v] = val
} else {
tmp[v] = ""
}
}
return tmp
}

// 多条记录获取
func EgSysCfgFind(keys ...string) map[string]string {
var e *xorm.Engine
res := map[string]string{}
if len(res) == 0 {
cfgList, _ := db.SysCfgGetAll(e)
if cfgList == nil {
return nil
}
for _, v := range *cfgList {
res[v.Key] = v.Val
}
// 先不设置缓存
// cache.SetJson(md.KEY_SYS_CFG_CACHE, res, 60)
}
if len(keys) == 0 {
return res
}
tmp := map[string]string{}
for _, v := range keys {
if val, ok := res[v]; ok {
tmp[v] = val
} else {
tmp[v] = ""
}
}
return tmp
}

// 清理系统配置信息
func SysCfgCleanCache() {
cache.Del(md.KEY_SYS_CFG_CACHE)
}

// 写入系统设置
func SysCfgSet(c *gin.Context, key, val, memo string) bool {
cfg, err := db.SysCfgGetOne(db.DBs[c.GetString("mid")], key)
if err != nil || cfg == nil {
return db.SysCfgInsert(db.DBs[c.GetString("mid")], key, val, memo)
}
if memo != "" && cfg.Memo != memo {
cfg.Memo = memo
}
SysCfgCleanCache()
return db.SysCfgUpdate(db.DBs[c.GetString("mid")], key, val, cfg.Memo)
}

// 支付配置
func SysCfgFindPayment(c *gin.Context) ([]map[string]string, error) {
platform := c.GetHeader("platform")
payCfg := SysCfgFind(c, "pay_wx_pay_img", "pay_ali_pay_img", "pay_balance_img", "pay_type")
if payCfg["pay_wx_pay_img"] == "" || payCfg["pay_ali_pay_img"] == "" || payCfg["pay_balance_img"] == "" || payCfg["pay_type"] == "" {
return nil, errors.New("lack of payment config")
}
payCfg["pay_wx_pay_img"] = ImageFormat(c, payCfg["pay_wx_pay_img"])
payCfg["pay_ali_pay_img"] = ImageFormat(c, payCfg["pay_ali_pay_img"])
payCfg["pay_balance_img"] = ImageFormat(c, payCfg["pay_balance_img"])

var result []map[string]string

if strings.Contains(payCfg["pay_type"], "aliPay") && platform != md.PLATFORM_WX_APPLET {
item := make(map[string]string)
item["pay_channel"] = "alipay"
item["img"] = payCfg["pay_ali_pay_img"]
item["name"] = "支付宝支付"
result = append(result, item)
}

if strings.Contains(payCfg["pay_type"], "wxPay") {
item := make(map[string]string)
item["pay_channel"] = "wx"
item["img"] = payCfg["pay_wx_pay_img"]
item["name"] = "微信支付"
result = append(result, item)
}

if strings.Contains(payCfg["pay_type"], "walletPay") {
item := make(map[string]string)
item["pay_channel"] = "fin"
item["img"] = payCfg["pay_balance_img"]
item["name"] = "余额支付"
result = append(result, item)
}

return result, nil
}

+ 26
- 0
super_cloud_issuance/svc/svc_validate_common.go View File

@@ -0,0 +1,26 @@
package svc

import (
"applet/app/e"
"applet/app/utils"
"applet/app/utils/logx"
"encoding/json"
"fmt"
"github.com/go-playground/validator/v10"
)

// HandleValidateErr 通用请求参数错误处理
func HandleValidateErr(err error) error {
switch err.(type) {
case *json.UnmarshalTypeError:
return e.NewErr(e.ERR_UNMARSHAL, "参数格式错误")
case validator.ValidationErrors:
errs := err.(validator.ValidationErrors)
transMsgMap := errs.Translate(utils.ValidatorTrans)
transMsgOne := transMsgMap[utils.GetOneKeyOfMapString(transMsgMap)]
return e.NewErr(e.ERR_INVALID_ARGS, transMsgOne)
default:
_ = logx.Error(err)
return e.NewErr(e.ERR, fmt.Sprintf("validate request params, err:%v\n", err))
}
}

+ 101
- 0
super_cloud_issuance/tool/super_cloud_issuance/api.go View File

@@ -0,0 +1,101 @@
package super_cloud_issuance

import (
"applet/app/md"
"applet/app/utils"
"encoding/json"
"errors"
"fmt"
"sort"
"time"
)

const (
RequestUrl = "http://router.itaokecms.com/api?app_key=%s&v=1.0&format=json&sign_method=md5&method=%s&timestamp=%s&domain=%s&client=%s&partner_id=%s&sign=%s"
AppKey = "1091808433"
AppSecret = "bed35c10-ecf1-2d06-477b-f821c227198b"
Domain = "hairuyi.com"
PartnerId = "top-sdk-php-20190618"
)

func SendPost(url string, args interface{}) (data md.CurlResponse, err error) {
post, err := utils.CurlPost(url, utils.Serialize(args), map[string]string{})
err = json.Unmarshal(post, &data)
utils.FilePutContents("cloud_issuance_send_resp", utils.SerializeStr(map[string]interface{}{
"time": time.Now().Format("2006-01-02 15:04:05.000"),
"url": url,
"args": args,
"resp": data,
}))
if err != nil {
return
}
if data.Status != "0000" {
err = errors.New(data.Msg)
return
}
return data, err
}

func SendPostForCircle(url string, args interface{}) (data md.CurlResponseForCircle, err error) {
post, err := utils.CurlPost(url, utils.Serialize(args), map[string]string{})
err = json.Unmarshal(post, &data)
utils.FilePutContents("cloud_issuance_send_resp_for_circle", utils.SerializeStr(map[string]interface{}{
"time": time.Now().Format("2006-01-02 15:04:05.000"),
"url": url,
"args": args,
"resp": data,
}))
if err != nil {
return
}
if data.Code != "1000" {
err = errors.New(data.Message)
return
}
return data, err
}

func HttpBuild(methodName, clientIP string, params map[string]string) (httpUrl string) {
timestamp := utils.AnyToString(time.Now().Unix())
params["app_key"] = AppKey
params["v"] = "1.0"
params["format"] = "json"
params["sign_method"] = "md5"
params["method"] = methodName
params["timestamp"] = timestamp
params["domain"] = Domain
params["client"] = clientIP
params["partner_id"] = PartnerId
sign := httpBuildQuery(params, true)
sign = AppSecret + httpBuildQuery(params, true) + AppSecret
sign = utils.MD5ToUpper32(sign)
httpUrl = fmt.Sprintf(RequestUrl, AppKey, methodName, timestamp, Domain, clientIP, PartnerId, sign)
return
}

func httpBuildQuery(args map[string]string, sortAsc ...bool) string {
str := ""
if len(args) == 0 {
return str
}
if len(sortAsc) > 0 {
keys := make([]string, 0, len(args))
for k := range args {
keys = append(keys, k)
}
if sortAsc[0] {
sort.Strings(keys)
} else {
sort.Sort(sort.Reverse(sort.StringSlice(keys)))
}
for _, k := range keys {
str += k + args[k]
}
} else {
for k, v := range args {
str += k + v
}
}
return str
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save