@@ -26,6 +26,7 @@ type Config struct { | |||
WxappletFilepath WxappletFilepathCfg `yaml:"wxapplet_filepath"` | |||
Local bool | |||
AppComm AppCommCfg `yaml:"app_comm"` | |||
ZhimengDB DBCfg `yaml:"zhimeng_db"` | |||
} | |||
// 公共模块 | |||
@@ -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 | |||
} |
@@ -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 | |||
@@ -98,6 +98,8 @@ func initConsumes() { | |||
//////////////////////////////////////// autoRepaid ///////////////////////////////////////////////////// | |||
jobs[consumeMd.InstallmentPaymentAutoRepaidConsumeFunName] = InstallmentPaymentAutoRepaidConsume //分期付 - 自动扣款 | |||
////////////////////////////////////// SuperCloudIssuance ///////////////////////////////////////////////////// | |||
//jobs[consumeMd.SuperCloudIssuanceMsgCallBackFunName] = SuperCloudIssuanceMsgCallBackConsume | |||
} | |||
func Run() { | |||
@@ -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" | |||
@@ -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") | |||
} |
@@ -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' | |||
@@ -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 | |||
@@ -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 | |||
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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{}) | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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 { | |||
}*/ |
@@ -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("查询有误!") | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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"` | |||
} |
@@ -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)"` | |||
} |
@@ -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"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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)"` | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} | |||
} | |||
} |
@@ -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 | |||
} | |||
} | |||
} |
@@ -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 | |||
} | |||
} | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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 '' "` | |||
} |
@@ -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 "` | |||
} |
@@ -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 | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 "未知" | |||
} | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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) | |||
} |
@@ -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) | |||
} |
@@ -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 | |||
} |
@@ -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) | |||
} |
@@ -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 : 待上传文件 | |||
*/ |
@@ -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) | |||
} |
@@ -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 | |||
} |
@@ -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"` | |||
} |
@@ -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 | |||
) |
@@ -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. | |||
) |
@@ -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"` | |||
} |
@@ -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"` //邀请人微信号 | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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" |
@@ -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 | |||
} |
@@ -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", | |||
} |
@@ -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], | |||
} | |||
} |
@@ -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"` | |||
} |
@@ -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"` | |||
} |
@@ -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 | |||
} |
@@ -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) | |||
} |
@@ -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 | |||
} |
@@ -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")] | |||
} |
@@ -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 | |||
} |
@@ -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) | |||
} |
@@ -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) | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} | |||
} |
@@ -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 | |||
} |
@@ -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 | |||
} |
@@ -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)) | |||
} | |||
} |
@@ -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×tamp=%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 | |||
} |