Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"confkv.go",
"dao.go",
"resource.go",
"titans.go",
"tree.go",
"user_resource.go",
],
importpath = "go-common/app/service/live/resource/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/live/resource/api/grpc/v1:go_default_library",
"//app/service/live/resource/api/http/v1:go_default_library",
"//app/service/live/resource/conf:go_default_library",
"//app/service/live/resource/lrucache:go_default_library",
"//app/service/live/resource/model:go_default_library",
"//library/database/orm:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
"//vendor/github.com/siddontang/go-mysql/mysql:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,141 @@
package dao
import (
"context"
"encoding/json"
v1pb "go-common/app/service/live/resource/api/grpc/v1"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_findConfkvSQL = "SELECT `value` FROM `confkv` WHERE `key` = ?"
_addConfkvSQL = "INSERT INTO `confkv` (`key`,`value`) VALUES (?,?)"
_updateConfkvSQL = "UPDATE `confkv` SET `value`=? WHERE `key`=?"
)
const (
_confLiveCheck = "live_check"
_platformAndroid = "android"
_platformIos = "ios"
)
// GetLiveCheck live.app-interface call
// cache -> db
func (d *Dao) GetLiveCheck(c context.Context, platform, system, mobile string) (isLive int64) {
isLive = int64(1)
inst := 0
res, ok := d.sCache[inst].Get(cacheLiveCheckKey(platform, system, mobile))
if !ok {
value, err := d.ConfKv(c, _confLiveCheck)
if err != nil {
log.Error("[LiveCheck] get live check error by from source")
return
}
if value == "" {
log.Error("[LiveCheck] get live check error by source data empty")
return
}
list := &v1pb.GetLiveCheckListResp{}
err = json.Unmarshal([]byte(value), list)
if err != nil {
log.Error("[LiveCheck] get live check error by source data wrong format")
return
}
log.Info("[LiveCheck] live_check list is %v", list)
switch platform {
case _platformAndroid:
for _, v := range list.Android {
if v.System == system {
for _, m := range v.Mobile {
if m == mobile {
isLive = int64(0)
}
}
}
}
case _platformIos:
for _, v := range list.Ios {
if v.System == system {
for _, m := range v.Mobile {
log.Info("[LiveCheck] range m %v mobile %v", m, mobile)
if m == mobile {
isLive = int64(0)
}
}
}
}
}
d.sCache[inst].Put(cacheLiveCheckKey(platform, system, mobile), isLive)
return
}
isLive = res.(int64)
return
}
// ConfKv get data from cache if miss will call source method, then add to cache.
func (d *Dao) ConfKv(c context.Context, key string) (value string, err error) {
inst := 0
res, ok := d.sCache[inst].Get(cacheConfKey(key))
if !ok {
log.Info("[LiveCheck] conf cache miss")
value, err = d.RawConfKv(c, key)
if err != nil {
return
}
d.sCache[inst].Put(cacheConfKey(key), value)
return
}
log.Info("[LiveCheck] conf cache hit")
value = res.(string)
return
}
// SetLiveCheck set live_check conf
func (d *Dao) SetLiveCheck(c context.Context, value string) (err error) {
err = d.AddOrUpdateConfKv(c, _confLiveCheck, value)
return
}
// GetLiveCheckList get live_check conf
func (d *Dao) GetLiveCheckList(c context.Context) (value string, err error) {
value, err = d.RawConfKv(c, _confLiveCheck)
return
}
// RawConfKv get conf
func (d *Dao) RawConfKv(c context.Context, key string) (value string, err error) {
row := d.db.QueryRow(c, _findConfkvSQL, key)
if err = row.Scan(&value); err != nil {
if err == sql.ErrNoRows {
err = nil
return
}
log.Error("[SelectConfKv] row.Scan() error(%v)", err)
}
return
}
// AddOrUpdateConfKv add or update conf
func (d *Dao) AddOrUpdateConfKv(c context.Context, key string, value string) (err error) {
oldValue, err := d.RawConfKv(c, key)
if err != nil {
return
}
if oldValue != "" {
//update
log.Info("[LiveCheck] update db value %v", value)
if _, err = d.db.Exec(c, _updateConfkvSQL, value, key); err != nil {
log.Error("[AddOrUpdateConfKv] UpdateConfKv:db.Exec(%v,$v) error(%v)", key, value, err)
}
return
}
//add
log.Info("[LiveCheck] add db value %v", value)
if _, err = d.db.Exec(c, _addConfkvSQL, key, value); err != nil {
log.Error("[AddOrUpdateConfKv] AddConfKv:db.Exec(%v,$v) error(%v)", key, value, err)
}
return
}

View File

@@ -0,0 +1,98 @@
package dao
import (
"context"
"fmt"
"go-common/library/net/http/blademaster"
"math/rand"
"time"
"go-common/app/service/live/resource/conf"
"go-common/app/service/live/resource/lrucache"
"go-common/library/database/orm"
xsql "go-common/library/database/sql"
"github.com/jinzhu/gorm"
)
const (
_prefixResource = "live:res:"
_prefixLiveCheck = "live:check:"
_prefixConf = "live:conf:"
)
func cacheResourceKey(typ string, platform string, build int64) string {
return fmt.Sprintf("%s:%s:%s:%d", _prefixResource, typ, platform, build)
}
func cacheLiveCheckKey(platform, system, mobile string) string {
return fmt.Sprintf("%s:%s:%s:%s", _prefixLiveCheck, platform, system, mobile)
}
func cacheConfKey(key string) string {
return fmt.Sprintf("%s:%s", _prefixConf, key)
}
// Dao dao
type Dao struct {
c *conf.Config
db *xsql.DB
rsDB *gorm.DB
rsDBReader *gorm.DB
sCache []*lrucache.SyncCache
client *blademaster.Client
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
if c.CacheCapacity <= 0 {
c.CacheCapacity = 100
}
if c.CacheBucket <= 0 {
c.CacheBucket = 100
}
if c.CacheInstCnt <= 0 {
c.CacheInstCnt = 10
}
if c.CacheTimeout <= 0 {
c.CacheTimeout = 60
}
sCache := make([]*lrucache.SyncCache, c.CacheInstCnt)
for i := range sCache {
sCache[i] = lrucache.NewSyncCache(c.CacheCapacity, c.CacheBucket, c.CacheTimeout)
}
dao = &Dao{
c: c,
db: xsql.NewMySQL(c.MySQL),
rsDB: orm.NewMySQL(c.DB.Resource),
rsDBReader: orm.NewMySQL(c.DB.ResourceReader),
sCache: sCache,
client: blademaster.NewClient(c.HttpClient),
}
rand.Seed(time.Now().UnixNano())
return
}
// mysql log
func (d *Dao) initORM() {
d.rsDB.LogMode(true)
d.rsDB.LogMode(true)
}
// Close close the resource.
func (d *Dao) Close() {
d.db.Close()
d.rsDB.Close()
d.rsDBReader.Close()
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) (err error) {
// TODO: if you need use mc,redis, please add
if err = d.db.Ping(c); err != nil {
return
}
return
//return d.pingRedis(c)
}

View File

@@ -0,0 +1,315 @@
package dao
import (
"context"
"database/sql"
"fmt"
"math/rand"
"strconv"
"strings"
"time"
"go-common/app/service/live/resource/model"
"go-common/library/log"
"github.com/siddontang/go-mysql/mysql"
)
const (
_addResourceSQL = "INSERT INTO resource (`platform`,`build`,`limit_type`,`start_time`,`end_time`,`type`,`title`,`image_info`) values(?,?,?,?,?,?,?,?)"
)
// AddResource -
func (d *Dao) AddResource(c context.Context, insert *model.Resource) (row int64, err error) {
types := strings.Split(insert.Type, ",")
for _, t := range types {
insert.Type = t
row, err = d.addDBResource(c, insert)
if err != nil {
return row, err
}
}
return
}
// EditResource -
func (d *Dao) EditResource(c context.Context, id int64, update map[string]interface{}) (row int64, err error) {
return d.editDBResource(c, id, update)
}
// GetResourceList -
func (d *Dao) GetResourceList(c context.Context, typ string, page int64, pageSize int64) (resp []model.Resource, err error) {
return d.getDBResourceList(c, typ, page, pageSize)
}
// GetResourceListEx -
func (d *Dao) GetResourceListEx(c context.Context, typ []string, page int64, pageSize int64, devPlatform string, status string, startTime string, endTime string) (resp []model.Resource, count int64, err error) {
return d.getDBResourceListEx(c, typ, page, pageSize, devPlatform, status, startTime, endTime)
}
// OfflineResource -
func (d *Dao) OfflineResource(c context.Context, id int64) (row int64, err error) {
return d.offlineDBResource(c, id)
}
// SelectById -
func (d *Dao) SelectById(c context.Context, id int64) (resp *model.Resource, err error) {
return d.selectDBById(c, id)
}
// GetInfo -
func (d *Dao) GetInfo(ctx context.Context, typ string, platform string, build int64) (resp *model.Resource, err error) {
inst := rand.Intn(d.c.CacheInstCnt)
res, ok := d.sCache[inst].Get(cacheResourceKey(typ, platform, build))
if !ok {
resp, err = d.getDBInfo(ctx, typ, platform, build)
if err != nil {
return
}
var resNew []model.Resource
resNew = append(resNew, *resp)
d.sCache[inst].Put(cacheResourceKey(typ, platform, build), resNew)
return
}
r := res.([]model.Resource)
if len(r) > 0 {
return &r[0], nil
}
return nil, nil
}
// GetBanner -
func (d *Dao) GetBanner(ctx context.Context, platform string, build int64, t string) (resp []model.Resource, err error) {
inst := rand.Intn(d.c.CacheInstCnt)
res, ok := d.sCache[inst].Get(cacheResourceKey(t, platform, build))
if !ok {
resp, err = d.getDBBanner(ctx, platform, build, t)
if err != nil {
return
}
d.sCache[inst].Put(cacheResourceKey(t, platform, build), resp)
return
}
resp = res.([]model.Resource)
return
}
// SelectByTypeAndPlatform -
func (d *Dao) SelectByTypeAndPlatform(ctx context.Context, typ string, platform string) (resp *model.Resource, err error) {
return d.selectDBByTypeAndPlatform(ctx, typ, platform)
}
// GetDBCount -
func (d *Dao) GetDBCount(ctx context.Context, typ string) (resp int64, err error) {
return d.getDBCount(ctx, typ)
}
// get data from db source
// addSResource add resource to mysql
func (d *Dao) addDBResource(c context.Context, insert *model.Resource) (row int64, err error) {
if insert == nil {
return
}
var reply sql.Result
if _, err = d.db.Begin(c); err != nil {
log.Error("db.begin error(%v)", err)
return
}
reply, err = d.db.Exec(c, _addResourceSQL, insert.Platform, insert.Build, insert.LimitType, insert.StartTime, insert.EndTime, insert.Type, insert.Title, insert.ImageInfo)
if err != nil {
log.Error("resource.addSResource d.db.Exec err: %v", err)
return
}
row, err = reply.LastInsertId()
return
}
func (d *Dao) editDBResource(c context.Context, id int64, update map[string]interface{}) (row int64, err error) {
if update == nil || id < 0 {
return
}
var tx = d.rsDB
tableInfo := &model.Resource{}
var reply = tx.Model(tableInfo).Where("id=?", id).Update(update)
log.Info("effected rows: %d, id : %d", reply.RowsAffected, id)
if reply.Error != nil {
log.Error("resource.editResource error: %v", err)
return
}
row = reply.RowsAffected
return
}
func (d *Dao) getDBResourceList(c context.Context, typ string, page int64, pageSize int64) (resp []model.Resource, err error) {
if typ == "" {
return
}
var tx = d.rsDBReader
tableInfo := &model.Resource{}
err = tx.Model(tableInfo).
Select("`id`,`platform`,`build`,`limit_type`,`start_time`,`end_time`,`title`,`image_info`").
Where("type=?", typ).
Order("id DESC").
Limit(pageSize).
Offset((page - 1) * pageSize).
Find(&resp).Error
if err != nil {
log.Error("resource.editResource error: %v", err)
return
}
return
}
func (d *Dao) getDBResourceListEx(c context.Context, typ []string, page int64, pageSize int64, devPlatform string, status string, startTime string, endTime string) (resp []model.Resource, count int64, err error) {
if len(typ) <= 0 {
return
}
whereStr := "1=1"
for i, t := range typ {
if i != 0 {
whereStr += " or "
} else {
whereStr += " and ("
}
whereStr += fmt.Sprintf("`type` like \"%s%%\"", mysql.Escape(t))
}
whereStr += ")"
if devPlatform != "" {
whereStr += fmt.Sprintf(" and `platform`=\"%s\"", mysql.Escape(devPlatform))
}
if status != "" {
var i int
if i, err = strconv.Atoi(status); err != nil {
return
}
now := time.Now().Format("2006-01-02 15:04:05")
switch i {
case 0:
whereStr += fmt.Sprintf(" and `start_time`>=\"%s\"", now)
case 1:
whereStr += fmt.Sprintf(" and `start_time`<=\"%s\" and `end_time`>=\"%s\"", now, now)
case -1:
whereStr += fmt.Sprintf(" and `end_time`<=\"%s\"", now)
}
}
if startTime != "" {
whereStr += fmt.Sprintf(" and `start_time`>=\"%s\"", mysql.Escape(startTime))
}
if endTime != "" {
whereStr += fmt.Sprintf(" and `end_time`<=\"%s\"", mysql.Escape(endTime))
}
var tx = d.rsDBReader
tableInfo := &model.Resource{}
err = tx.Model(tableInfo).
Select("`id`,`platform`,`build`,`limit_type`,`start_time`,`end_time`,`title`,`image_info`,`type`").
Where(whereStr).
Order("id DESC").
Limit(pageSize).
Offset((page - 1) * pageSize).
Find(&resp).Error
if err != nil {
log.Error("resource.editResource error: %v", err)
return
}
err = tx.Model(tableInfo).
Select("`id`").
Where(whereStr).
Count(&count).Error
if err != nil {
log.Error("resource.editResource error: %v", err)
return
}
return
}
func (d *Dao) getDBCount(c context.Context, typ string) (resp int64, err error) {
if typ == "" {
return
}
var tx = d.rsDBReader
tableInfo := &model.Resource{}
err = tx.Model(tableInfo).
Select("`id`").
Where("type=?", typ).
Count(&resp).Error
if err != nil {
log.Error("resource.editResource error: %v", err)
return
}
return
}
func (d *Dao) offlineDBResource(c context.Context, id int64) (row int64, err error) {
if id == 0 {
return
}
reply, err := d.SelectById(c, id)
if err != nil || reply == nil {
log.Error("resource.OfflineResource select error: %v reply %v", err, reply)
return
}
var tx = d.rsDB
tableInfo := &model.Resource{}
var updateReply = tx.Model(tableInfo).Where("id=?", id).Update("end_time", time.Now())
if updateReply.Error != nil {
log.Error("resource.OfflineResource update error: %v", err)
return
}
return
}
func (d *Dao) selectDBById(c context.Context, id int64) (resp *model.Resource, err error) {
if id == 0 {
return
}
resp = &model.Resource{}
var tx = d.rsDBReader
var reply = tx.Model(&model.Resource{}).Where("id=?", id).Find(resp)
if reply.Error != nil {
log.Error("resource.SelectById error: %v", err)
return
}
return
}
func (d *Dao) getDBInfo(ctx context.Context, typ string, platform string, build int64) (resp *model.Resource, err error) {
if platform == "" || build == 0 {
return
}
resp = &model.Resource{}
var tx = d.rsDBReader
now := time.Now()
var reply = tx.Model(&model.Resource{}).Where("start_time<? and end_time>? and type=? and `platform`=? and ((`limit_type`=0 and `build`<=?) or (`limit_type`=1 and `build`=?) or (`limit_type`=2 and `build`>=?))", now, now, typ, platform, build, build, build).Limit(1).Find(resp)
if reply.Error != nil {
log.Error("resource.GetInfo error: %v", err)
return
}
return
}
func (d *Dao) getDBBanner(ctx context.Context, platform string, build int64, t string) (resp []model.Resource, err error) {
if platform == "" || build == 0 || t == "" {
return
}
var tx = d.rsDBReader
var reply = tx.Model(&model.Resource{}).Where("`start_time`<? and `end_time`>? and `type`=? and (`platform`='' or `platform`=?) and ((`limit_type`=0 and `build`<=?) or (`limit_type`=1 and `build`=?) or (`limit_type`=2 and `build`>=?))", time.Now(), time.Now(), t, platform, build, build, build).Order("mtime DESC").Find(&resp)
if reply.Error != nil {
log.Error("resource.GetBanner error: %v", err)
return
}
return
}
func (d *Dao) selectDBByTypeAndPlatform(ctx context.Context, typ string, platform string) (resp *model.Resource, err error) {
if typ == "" || platform == "" {
return
}
resp = &model.Resource{}
var tx = d.rsDBReader
now := time.Now()
var reply = tx.Model(&model.Resource{}).Where("`type`=? and `end_time`>? and `platform`=? ", typ, now, platform).Limit(1).Find(resp)
if reply.Error != nil {
resp = nil
log.Error("resource.SelectByTypeAndPlatform error: %v", err)
return
}
return
}

View File

@@ -0,0 +1,429 @@
package dao
import (
"context"
"github.com/jinzhu/gorm"
"go-common/app/service/live/resource/api/http/v1"
"go-common/app/service/live/resource/model"
"go-common/library/database/sql"
"go-common/library/ecode"
"go-common/library/log"
xtime "time"
)
var (
_statusDel = 4
_statusOn = 1
_statusOff = 2
)
// CheckParams 校验key及team
func (d *Dao) CheckParams(c context.Context, team int64, keyword string) (err error) {
err = nil
if "" == keyword {
err = ecode.ResourceParamErr
}
return err
}
// TeamKeyword 用于封装业务参数结构
type TeamKeyword struct {
Team int64
Keyword string
}
// SelectByTeamIndex 单个key的value查询
func (d *Dao) SelectByTeamIndex(c context.Context, team int64, keyword string, id int64) (res *model.SundryConfig, err error) {
res = &model.SundryConfig{}
resMid := &model.SundyConfigObject{}
if 0 != id {
err = d.rsDB.Model(&model.SundyConfigObject{}).Where("id=?", id).Where("status != ?", _statusDel).Find(&resMid).Error
} else {
err = d.rsDB.Model(&model.SundyConfigObject{}).Where("team=?", team).Where("keyword=?", keyword).Where("status != ?", _statusDel).Find(&resMid).Error
}
if err != nil && err != gorm.ErrRecordNotFound {
log.Error("[live.titans.dao| selectByGroupIndex] d.db.Exec err: %v", err)
return
}
res.Id = resMid.Id
res.Team = resMid.Team
res.Keyword = resMid.Keyword
res.Value = resMid.Value
res.Status = resMid.Status
res.Ctime = resMid.Ctime.Time().Format("2006-01-02 15:04:05")
res.Mtime = resMid.Mtime.Time().Format("2006-01-02 15:04:05")
err = nil
return
}
// SelectByParams 管理后台通过条件查询
func (d *Dao) SelectByParams(c context.Context, id int64, team int64, keyword string, name string, status int64, page int64, pageSize int64) (res []*model.SundryConfig, count int64, err error) {
var (
Items []*model.SundyConfigObject
)
condition := d.rsDB
//模型配置
if -1 == team {
condition = condition.Where("team = ?", 0)
}
//除模型配置外的全部配置
if 0 == team {
condition = condition.Where("team != ?", 0)
}
if 0 != team && -1 != team {
condition = condition.Where("team = ?", team)
}
if 0 != id {
condition = condition.Where("id = ?", id)
}
if "" != keyword {
condition = condition.Where("keyword = ?", keyword)
}
if "" != name {
condition = condition.Where("name like '%" + name + "%'")
}
if 0 != status {
condition = condition.Where("status = ?", status)
}
condition = condition.Where("status != ?", _statusDel)
sModel := condition.Model(&model.SundryConfig{})
sModel.Count(&count)
iOffset := (page - 1) * pageSize
err = sModel.Offset(iOffset).Limit(pageSize).Order("mtime DESC, id DESC").Find(&Items).Error
if err != nil && err != gorm.ErrRecordNotFound {
log.Error("[live.titans.dao| select by params] d.db.Exec err: %v", err)
return
}
for _, v := range Items {
item := &model.SundryConfig{
Id: v.Id,
Team: v.Team,
Keyword: v.Keyword,
Name: v.Name,
Value: v.Value,
Ctime: v.Ctime.Time().Format("2006-01-02 15:04:05"),
Mtime: v.Mtime.Time().Format("2006-01-02 15:04:05"),
Status: v.Status,
}
res = append(res, item)
}
return
}
// InsertRecord 管理后台插入/编辑一条记录
func (d *Dao) InsertRecord(c context.Context, team int64, keyword string, value string, name string, status int64, oid int64) (id int64, count int64, err error) {
//创建模板
if team == -1 {
team = 0
}
//查询唯一索引
err = d.rsDB.Model(&model.SundryConfig{}).Where("team=? and keyword=? and id != ?", team, keyword, oid).Count(&count).Error
if nil != err {
return
}
if 0 != count {
return
}
setMaps := &model.InsertMaps{
Team: team,
Keyword: keyword,
Value: value,
Name: name,
Status: status,
}
newRecord := &model.SundryConfig{}
//编辑
if oid != 0 {
err = d.rsDB.Model(&model.SundryConfig{}).Where("id = ?", oid).Update(setMaps).Error
id = oid
return
}
setMaps.Status = int64(_statusOff)
err = d.rsDB.Create(setMaps).Error
if err != nil {
log.Error("[live.titans.dao| insertRecord] d.db.Exec err: %v", err)
return
}
d.rsDB.Where("keyword = ?", keyword).Find(&newRecord)
id = newRecord.Id
return
}
// SelectByLikes 业务方的请求sql
func (d *Dao) SelectByLikes(c context.Context, teams []int64, teamKeys []*TeamKeyword) (Items []*model.SundyConfigObject, err error) {
Items = []*model.SundyConfigObject{}
if len(teams) == 0 && len(teamKeys) == 0 {
return
}
/** sql 式执行
sql := "select * from ap_sundry_config where status = 1"
if len(teams) != 0 {
teamStr := ""
for i, num := range teams {
teamStr += strconv.Itoa(int(num))
if i+1 != len(teams) {
teamStr += ","
}
}
sql += " and team in (" + teamStr + ") "
}
if len(teamKeys) != 0 {
for _, v := range teamKeys {
sql = sql + " or (team =" + strconv.Itoa(int(v.Team)) + " and keyword = '" + v.Keyword + "') "
}
}
rows, err := d.db.Query(c, sql)
if err != nil {
return
}
for rows.Next() {
resMid := &model.SundyConfigObject{}
rows.Scan(&resMid.Id, &resMid.Team, &resMid.Keyword, &resMid.Name, &resMid.Value, &resMid.Ctime, &resMid.Mtime, &resMid.Status)
Items = append(Items, resMid)
}*/
/** orm **/
condition := d.rsDB.Where("status = ?", 1)
if len(teams) != 0 {
condition = condition.Where("team in (?)", teams)
}
if len(teamKeys) != 0 {
for _, v := range teamKeys {
condition = condition.Or("team = ? and keyword = ?", v.Team, v.Keyword)
}
}
err = condition.Find(&Items).Error
return
}
// FormatTime 时间格式化
func (d *Dao) FormatTime(c context.Context, timeStrUtc string) (timeStr string) {
ctime, _ := xtime.ParseInLocation("2006-01-02T15:04:05+08:00", timeStrUtc, xtime.Local)
timeStr = ctime.Format("2006-01-02 15:04:05")
return timeStr
}
// InsertServiceConfig 插入服务配置
func (d *Dao) InsertServiceConfig(c context.Context, oid int64, treeName string, treePath string, treeId int64, service string, keyword string, template int64, name string, value string, status int64) (id int64, err error) {
checkRes := &model.ServiceConfigObject{}
err = d.rsDB.Model(&model.ServiceConfigObject{}).Where("tree_id=?", treeId).Where("keyword=?", keyword).Find(&checkRes).Error
if err != nil && err != gorm.ErrRecordNotFound {
log.Error("[live.titans.dao| insertServiceRecord] d.db.Exec err: %v", err)
return
}
if 0 != checkRes.Id && oid != checkRes.Id {
id = -1
return
}
if oid != 0 {
//编辑
updateMaps := &model.UpdateServiceConfig{
Service: service,
Keyword: keyword,
Template: template,
Value: value,
Name: name,
Status: status,
}
err = d.rsDB.Model(&model.ServiceConfigObject{}).Where("id=?", oid).Update(updateMaps).Error
id = oid
} else {
setMaps := &model.InsertServiceConfig{
TreeName: treeName,
TreePath: treePath,
TreeId: treeId,
Service: service,
Keyword: keyword,
Template: template,
Value: value,
Name: name,
Status: status,
}
err = d.rsDB.Model(&model.ServiceConfigObject{}).Create(setMaps).Error
newRecord := &model.ServiceConfigObject{}
d.rsDB.Model(&model.ServiceConfigObject{}).Where("tree_id = ?", treeId).Where("keyword=?", keyword).Find(&newRecord)
id = newRecord.Id
}
return
}
// GetServiceConfig 通过tree_id 获取配置
func (d *Dao) GetServiceConfig(c context.Context, treeId int64) (value map[string]string, err error) {
value = make(map[string]string)
res := []*model.ServiceConfigObject{}
err = d.rsDB.Model(&model.ServiceConfigObject{}).Where("tree_id = ?", treeId).Where("status= ?", _statusOn).Find(&res).Error
if err != nil && err != gorm.ErrRecordNotFound {
return
}
for _, v := range res {
value[v.Keyword] = v.Value
}
return
}
// GetServiceConfigList 管理后台获取服务配置列表
func (d *Dao) GetServiceConfigList(c context.Context, treeName string, treeId int64, keyword string, service string, page int64, pageSize int64, name string, status int64) (list []*v1.MList, totalNum int64, err error) {
list = []*v1.MList{}
Items := make([]*model.ServiceConfigObject, 0)
totalNum = 0
condition := d.rsDB
condition = condition.Where("tree_name=?", treeName)
if 1 == status {
condition = condition.Where("status=?", status)
}
if status != 0 && status != int64(_statusOn) {
condition = condition.Where("status !=? ", _statusOn)
}
if 0 != treeId {
condition = condition.Where("tree_id =? ", treeId)
}
if "" != name {
condition = condition.Where("name like '%" + name + "%'")
}
if "" != keyword {
condition = condition.Where("keyword like '%" + keyword + "%'")
}
if "" != service {
condition = condition.Where("service =?", service)
}
sModel := condition.Model(&model.ServiceConfigObject{})
sModel.Count(&totalNum)
iOffset := (page - 1) * pageSize
err = sModel.Offset(iOffset).Limit(pageSize).Order("mtime DESC, id DESC").Find(&Items).Error
if nil != err {
log.Error("sql error select by params")
return
}
for _, v := range Items {
item := &v1.MList{
Id: v.Id,
TreeName: v.TreeName,
TreePath: v.TreePath,
TreeId: v.TreeId,
Service: v.Service,
Keyword: v.Keyword,
Template: v.Template,
Name: v.Name,
Value: v.Value,
Ctime: v.Ctime.Time().Format("2006-01-02 15:04:05"),
Mtime: v.Mtime.Time().Format("2006-01-02 15:04:05"),
Status: v.Status,
}
list = append(list, item)
}
return
}
// GetTreeIds 获取treeName对应的tree_ids
func (d *Dao) GetTreeIds(c context.Context, treeName string) (list []int64, err error) {
list = make([]int64, 0)
query := "select distinct tree_id from ap_services_config where status=1 and tree_name = ?"
rows, err := d.db.Query(c, query, treeName)
if err != nil && err != sql.ErrNoRows {
log.Error("[live.titans.dao| getDiscoveryIds] d.db.Exec err: %v", err)
return
}
defer rows.Close()
for rows.Next() {
item := &model.ServiceModel{}
err = rows.Scan(&item.TreeId)
if err != nil {
return
}
if item.TreeId != 0 {
list = append(list, item.TreeId)
}
}
return
}
// GetEasyRecord 获取运营配置
func (d *Dao) GetEasyRecord(c context.Context, treeName string) (list *v1.MList) {
list = &v1.MList{}
query := "select id, value from ap_services_config where tree_name = ? and tree_id = 0"
rows := d.db.QueryRow(c, query, treeName)
err := rows.Scan(&list.Id, &list.Value)
if err != nil {
log.Error("[live.titans.dao| GetEasyRecord] d.db.Exec err: %v", err)
return
}
return
}
// SetEasyRecord 设置运营配置
func (d *Dao) SetEasyRecord(c context.Context, treeName string, value string, id int64) (nId int64, err error) {
record := &model.InsertServiceConfig{
TreeName: treeName,
TreePath: treeName,
TreeId: 0,
Name: treeName + "运营操作列表",
Value: value,
Status: int64(_statusOn),
}
nId = id
if id != 0 {
err = d.rsDB.Model(&model.ServiceConfigObject{}).Where("id = ?", id).Update(record).Error
} else {
err = d.rsDB.Model(&model.ServiceConfigObject{}).Create(record).Error
if err != nil {
return
}
newRecord := &model.ServiceConfigObject{}
err = d.rsDB.Model(&model.ServiceConfigObject{}).Where("tree_name = ?", treeName).Where("tree_id = ?", 0).Find(&newRecord).Error
if err != nil {
return
}
nId = newRecord.Id
}
return
}
// GetListByIds 通过ids获取配置列表
func (d *Dao) GetListByIds(c context.Context, ids []int64) (list []*model.ServiceModel, err error) {
list = []*model.ServiceModel{}
Items := make([]*model.ServiceConfigObject, 0)
condition := d.rsDB
condition = condition.Where("id in (?)", ids)
sModel := condition.Model(&model.ServiceConfigObject{})
err = sModel.Find(&Items).Error
if nil != err {
log.Error("sql error select by params")
return
}
for _, v := range Items {
item := &model.ServiceModel{
Id: v.Id,
TreeName: v.TreeName,
TreePath: v.TreePath,
TreeId: v.TreeId,
Service: v.Service,
Keyword: v.Keyword,
Template: v.Template,
Name: v.Name,
Value: v.Value,
Ctime: v.Ctime.Time().Format("2006-01-02 15:04:05"),
Mtime: v.Mtime.Time().Format("2006-01-02 15:04:05"),
Status: v.Status,
}
list = append(list, item)
}
return
}

View File

@@ -0,0 +1,200 @@
package dao
import (
"bytes"
"context"
"fmt"
"go-common/app/service/live/resource/model"
"go-common/library/ecode"
"go-common/library/log"
"net/http"
"strings"
"time"
)
var (
tokenURI = "http://easyst.bilibili.co/v1/token"
dataURI = "http://easyst.bilibili.co/v1/node/apptree"
authURI = "http://easyst.bilibili.co/v1/auth"
nodeURI = "http://easyst.bilibili.co/v1/node/bilibili%s"
appsURI = "http://easyst.bilibili.co/v1/node/role/app"
prefix = []byte("bilibili.")
)
// Token get Token.
func (d *Dao) Token(c context.Context, body string) (msg map[string]interface{}, err error) {
var (
req *http.Request
)
if req, err = http.NewRequest("POST", tokenURI, strings.NewReader(body)); err != nil {
log.Error("Token url(%s) error(%v)", tokenURI, err)
return
}
var res struct {
Code int `json:"code"`
Data map[string]interface{} `json:"data"`
Message string `json:"message"`
Status int `json:"status"`
}
if err = d.client.Do(c, req, &res); err != nil {
log.Error("d.Token url(%s) res(%+v) err(%v)", tokenURI, res, err)
return
}
if res.Code != 90000 {
err = fmt.Errorf("error code :%d", res.Code)
log.Error("Status url(%s) res(%v)", tokenURI, res)
return
}
msg = res.Data
return
}
// Auth get Token.
func (d *Dao) Auth(c context.Context, cookie string) (msg map[string]interface{}, err error) {
var (
req *http.Request
)
if req, err = http.NewRequest("GET", authURI, nil); err != nil {
log.Error("Token url(%s) error(%v)", tokenURI, err)
return
}
req.Header.Set("Cookie", cookie)
var res struct {
Code int `json:"code"`
Data map[string]interface{} `json:"data"`
Message string `json:"message"`
Status int `json:"status"`
}
if err = d.client.Do(c, req, &res); err != nil {
log.Error("d.Token url(%s) res($s) err(%v)", tokenURI, res, err)
return
}
if res.Code != 90000 {
err = fmt.Errorf("error code :%d", res.Code)
log.Error("Status url(%s) res(%v)", tokenURI, res)
return
}
msg = res.Data
return
}
// Tree get service tree.
func (d *Dao) Tree(c context.Context, token string) (data interface{}, err error) {
var (
req *http.Request
tmp map[string]interface{}
ok bool
)
if req, err = http.NewRequest("GET", dataURI, nil); err != nil {
log.Error("Status url(%s) error(%v)", dataURI, err)
return
}
req.Header.Set("X-Authorization-Token", token)
req.Header.Set("Content-Type", "application/json")
var res struct {
Code int `json:"code"`
Data map[string]map[string]interface{} `json:"data"`
Message string `json:"message"`
Status int `json:"status"`
}
if err = d.client.Do(c, req, &res); err != nil {
log.Error("d.Status url(%s) res($s) err(%v)", dataURI, res, err)
return
}
if res.Code != 90000 {
err = fmt.Errorf("error code :%d", res.Code)
log.Error("Status url(%s) res(%v)", dataURI, res)
return
}
if tmp, ok = res.Data["bilibili"]; ok {
data, ok = tmp["children"]
}
if !ok {
err = ecode.NothingFound
}
return
}
// Role get service tree.
func (d *Dao) Role(c context.Context, user, token string) (nodes *model.CacheData, err error) {
var (
req *http.Request
)
if req, err = http.NewRequest("GET", appsURI, nil); err != nil {
log.Error("Status url(%s) error(%v)", dataURI, err)
return
}
req.Header.Set("X-Authorization-Token", token)
req.Header.Set("Content-Type", "application/json")
var res struct {
Code int `json:"code"`
Data []*model.RoleNode `json:"data"`
Message string `json:"message"`
Status int `json:"status"`
}
if err = d.client.Do(c, req, &res); err != nil {
log.Error("d.Status url(%s) res($s) err(%v)", dataURI, res, err)
return
}
if res.Code != 90000 {
err = fmt.Errorf("error code :%d", res.Code)
log.Error("Status url(%s) res(%v)", dataURI, res)
return
}
nodes = &model.CacheData{Data: make(map[int64]*model.RoleNode)}
nodes.CTime = time.Now()
for _, node := range res.Data {
if bytes.Equal(prefix, []byte(node.Path)[0:9]) {
node.Path = string([]byte(node.Path)[9:])
}
nodes.Data[node.ID] = node
}
return
}
// NodeTree get service tree.
func (d *Dao) NodeTree(c context.Context, token, bu, team string) (nodes []*model.Node, err error) {
var (
req *http.Request
node string
)
if len(bu) != 0 {
node = "." + bu
}
if len(team) != 0 {
node = "." + team
}
if len(node) == 0 {
nodes = append(nodes, &model.Node{Name: "main", Path: "main"})
nodes = append(nodes, &model.Node{Name: "ai", Path: "ai"})
return
}
if req, err = http.NewRequest("GET", fmt.Sprintf(nodeURI, node), nil); err != nil {
log.Error("Status url(%s) error(%v)", dataURI, err)
return
}
req.Header.Set("X-Authorization-Token", token)
req.Header.Set("Content-Type", "application/json")
var res struct {
Code int `json:"code"`
Data *model.Res `json:"data"`
Message string `json:"message"`
Status int `json:"status"`
}
if err = d.client.Do(c, req, &res); err != nil {
log.Error("d.Status url(%s) res($s) err(%v)", dataURI, res, err)
return
}
if res.Code != 90000 {
err = fmt.Errorf("error code :%d", res.Code)
log.Error("Status url(%s) error(%v)", dataURI, err)
return
}
for _, tnode := range res.Data.Data {
if bytes.Equal(prefix, []byte(tnode.Path)[0:9]) {
tnode.Path = string([]byte(tnode.Path)[9:])
}
nodes = append(nodes, &model.Node{Name: tnode.Name, Path: tnode.Path})
}
return
}

View File

@@ -0,0 +1,187 @@
package dao
import (
"context"
"database/sql"
"go-common/app/service/live/resource/model"
"go-common/library/ecode"
"go-common/library/log"
"time"
"github.com/jinzhu/gorm"
)
var (
addSql = "INSERT INTO `user_resource`(`res_type`,`custom_id`,`title`,`url`,`weight`,`status`,`creator`) values (?,?,?,?,?,?,?);"
rowFields = "`id`, `res_type`,`custom_id`,`title`,`url`,`weight`,`status`,`creator`,UNIX_TIMESTAMP(`ctime`), UNIX_TIMESTAMP(`mtime`)"
)
// AddUserResource 添加用户资源到DB
func (d *Dao) AddUserResource(c context.Context, res *model.UserResource) (newRes model.UserResource, err error) {
if res == nil {
return
}
var reply sql.Result
if _, err = d.db.Begin(c); err != nil {
log.Error("初始化DB错误(%v)", err)
return
}
reply, err = d.db.Exec(c, addSql, res.ResType, res.CustomID, res.Title, res.URL, res.Weight, res.Status, res.Creator)
if err != nil {
log.Error("执行SQL语句 err: %v", err)
return
}
lastID_, _ := reply.LastInsertId()
newRes, err = d.GetUserResourceInfoByID(c, int32(lastID_))
return
}
// EditUserResource 编辑已有资源
func (d *Dao) EditUserResource(c context.Context, resType int32, customID int32, update map[string]interface{}) (effectRow int32, newRes model.UserResource, err error) {
if update == nil {
return
}
var tx = d.rsDB
tableInfo := &model.UserResource{}
var reply = tx.Model(tableInfo).
Where("`res_type` = ? AND `custom_id` = ?", resType, customID).
Update(update)
log.Info("effected rows: %d, res_type : %d custom_id : %d", reply.RowsAffected, resType, customID)
if reply.Error != nil {
log.Error("resource.editResource error: %v", err)
return
}
effectRow = int32(reply.RowsAffected)
newRes, err = d.GetUserResourceInfo(c, resType, customID)
return
}
// SetUserResourceStatus 设置资源状态
func (d *Dao) SetUserResourceStatus(c context.Context, resType int32, customID int32, status int32) (effectRow int32, err error) {
update := make(map[string]interface{})
update["status"] = status
effectRow, _, err = d.EditUserResource(c, resType, customID, update)
if err != nil {
log.Error("修改资源状态: %v", err)
}
return
}
// GetMaxCustomID 根据资源类型获取当前最大的资源ID
func (d *Dao) GetMaxCustomID(c context.Context, resType int32) (maxCustomID int32, err error) {
tableInfo := &model.UserResource{}
var ret sql.NullInt64
err = d.rsDB.Model(tableInfo).Debug().
Select("max(custom_id) as mcid").
Where("res_type=?", resType).
Row().Scan(&ret)
if err != nil {
log.Error("查找最大的资源ID res_type : %d : %v", resType, err)
return
}
maxCustomID = int32(ret.Int64)
log.Info("类型为 %d 最大的资源ID是 %d", resType, maxCustomID)
return
}
// getRowResult Helper方法
func getRowResult(queryResult *gorm.DB) (res model.UserResource, err error) {
var count int32
err = queryResult.Count(&count).Error
if err != nil {
log.Error("user_resource.GetUserResourceInfoByID %v", err)
err = ecode.SeltResErr
return
}
if count == 0 {
log.Info("user_resource.getRowResult 查询结果为空")
err = ecode.SeltResErr
return
}
var retID, retResType, retCustomID, retWeight, retStatus, retCtime, retMtime sql.NullInt64
var retTitle, retURL, retCreator sql.NullString
err = queryResult.Row().Scan(&retID, &retResType, &retCustomID, &retTitle, &retURL, &retWeight, &retStatus, &retCreator, &retCtime, &retMtime)
if err != nil {
log.Error("resource.GetUserResourceInfoByID error: %v", err)
err = ecode.SeltResErr
return
}
res.ID = int32(retID.Int64)
res.ResType = int32(retResType.Int64)
res.CustomID = int32(retCustomID.Int64)
res.Title = retTitle.String
res.URL = retURL.String
res.Weight = int32(retWeight.Int64)
res.Status = int32(retStatus.Int64)
res.Creator = retCreator.String
res.Ctime = time.Unix(retCtime.Int64, 0)
res.Ctime = time.Unix(retMtime.Int64, 0)
return
}
// GetUserResourceInfo 获取单个配置
func (d *Dao) GetUserResourceInfo(c context.Context, resType int32, customID int32) (res model.UserResource, err error) {
tableInfo := &model.UserResource{}
queryResult := d.rsDBReader.Model(tableInfo).Select(rowFields).
Where("res_type=? AND custom_id=?", resType, customID)
res, err = getRowResult(queryResult)
return
}
// GetUserResourceInfoByID 根据ID获取单个配置
func (d *Dao) GetUserResourceInfoByID(c context.Context, id int32) (res model.UserResource, err error) {
tableInfo := &model.UserResource{}
queryResult := d.rsDBReader.Model(tableInfo).Select(rowFields).
Where("id=?", id)
res, err = getRowResult(queryResult)
return
}
// ListUserResourceInfo 获取配置列表
func (d *Dao) ListUserResourceInfo(c context.Context, resType int32, page int32, pageSize int32) (list []model.UserResource, err error) {
var tx = d.rsDBReader
tableInfo := &model.UserResource{}
err = tx.Model(tableInfo).
Select("`id`, `res_type`,`custom_id`,`title`,`url`,`weight`,`status`,`creator`,`ctime`, `mtime`").
Where("res_type=?", resType).
Order("id ASC").
Limit(pageSize).
Offset((page - 1) * pageSize).
Find(&list).Error
if err != nil {
log.Error("resource.editResource error: %v", err)
return
}
return
}