@@ -154,7 +154,7 @@ var Rotation3D = window.Rotation3D = function (_opts) { | |||||
* y y起点 + (尺寸 * 正弦 * y压缩) - 元素宽度一半 | * y y起点 + (尺寸 * 正弦 * y压缩) - 元素宽度一半 | ||||
*/ | */ | ||||
Rotation3D.prototype.itemStyle = function($item, index, rotation) { | Rotation3D.prototype.itemStyle = function($item, index, rotation) { | ||||
// console.log(rotation) | |||||
console.log("itemStyle=" + rotation + " index=" + index); | |||||
var parseSXY = circleMath.parseSXY(rotation, this); | var parseSXY = circleMath.parseSXY(rotation, this); | ||||
var scale = parseSXY.scale; | var scale = parseSXY.scale; | ||||
var x = parseSXY.x; | var x = parseSXY.x; | ||||
@@ -219,7 +219,7 @@ Rotation3D.prototype.itemStyle = function($item, index, rotation) { | |||||
*/ | */ | ||||
Rotation3D.prototype.lineStyle = function($line, index, rotation) { | Rotation3D.prototype.lineStyle = function($line, index, rotation) { | ||||
var rotate = circleMath.parseRotate(rotation, this) | var rotate = circleMath.parseRotate(rotation, this) | ||||
// console.log(rotate) | |||||
console.log("lineStyle=" + rotation + " index=" + index); | |||||
$line.css({ | $line.css({ | ||||
transform: 'rotate(' + rotate + 'deg)', | transform: 'rotate(' + rotate + 'deg)', | ||||
@@ -235,7 +235,7 @@ Rotation3D.prototype.lineStyle = function($line, index, rotation) { | |||||
Rotation3D.prototype.goTo = function (index) { | Rotation3D.prototype.goTo = function (index) { | ||||
var self = this; | var self = this; | ||||
this.currenIndex = index; | this.currenIndex = index; | ||||
console.log('currenIndex', index); | |||||
console.log('goTo currenIndex', index); | |||||
/** | /** | ||||
* 1.计算floatIndex,用于控死amdiff | * 1.计算floatIndex,用于控死amdiff | ||||
*/ | */ | ||||
@@ -293,7 +293,7 @@ Rotation3D.prototype.scheduleNextFrame = function () { | |||||
*/ | */ | ||||
Rotation3D.prototype.render = function () { | Rotation3D.prototype.render = function () { | ||||
var self=this; | var self=this; | ||||
// 图形间隔:弧度 | // 图形间隔:弧度 | ||||
var spacing = 2 * Math.PI / this.$item.length; | var spacing = 2 * Math.PI / this.$item.length; | ||||
var itemRotation = this.rotation; | var itemRotation = this.rotation; | ||||
@@ -319,6 +319,7 @@ Rotation3D.prototype.onAutoPlay = function () { | |||||
if (self.currenIndex < 0) { | if (self.currenIndex < 0) { | ||||
self.currenIndex = self.length - 1 | self.currenIndex = self.length - 1 | ||||
} | } | ||||
console.log("autoPlayTimer...."); | |||||
self.goTo(self.currenIndex); | self.goTo(self.currenIndex); | ||||
self.currenIndex--; //倒叙 | self.currenIndex--; //倒叙 | ||||
}, this.autoPlayDelay) | }, this.autoPlayDelay) | ||||
@@ -330,12 +331,12 @@ Rotation3D.prototype.onAutoPlay = function () { | |||||
Rotation3D.prototype.onDrag = function () { | Rotation3D.prototype.onDrag = function () { | ||||
var self = this; | var self = this; | ||||
var startX, startY, moveX, moveY, endX, endY; | var startX, startY, moveX, moveY, endX, endY; | ||||
console.log("onDrag...."); | |||||
// 拖拽:三个事件-按下 移动 抬起 | // 拖拽:三个事件-按下 移动 抬起 | ||||
//按下 | //按下 | ||||
this.$rotation.mousedown(function (e) { | this.$rotation.mousedown(function (e) { | ||||
startX = e.pageX; startY = e.pageY; | startX = e.pageX; startY = e.pageY; | ||||
console.log("mousedown...."); | |||||
// 移动 | // 移动 | ||||
$(document).mousemove(function (e) { | $(document).mousemove(function (e) { | ||||
// console.log('移动'); | // console.log('移动'); | ||||
@@ -347,7 +348,7 @@ Rotation3D.prototype.onDrag = function () { | |||||
$(document).mouseup(function (e) { | $(document).mouseup(function (e) { | ||||
endX = e.pageX; endY = e.pageY; | endX = e.pageX; endY = e.pageY; | ||||
moveX = endX - startX; moveY = endY - startY; | moveX = endX - startX; moveY = endY - startY; | ||||
console.log("mouseup...."); | |||||
// 每40旋转一步 | // 每40旋转一步 | ||||
var moveIndex = parseInt(Math.abs(moveX) / 50) | var moveIndex = parseInt(Math.abs(moveX) / 50) | ||||
console.log('moveIndex',moveIndex) | console.log('moveIndex',moveIndex) | ||||
@@ -0,0 +1,22 @@ | |||||
package models | |||||
import "code.gitea.io/gitea/modules/log" | |||||
func GetAllStatusCloudBrain() map[string]int { | |||||
sess := x.NewSession() | |||||
defer sess.Close() | |||||
cloudbrains := make([]*CloudbrainInfo, 0) | |||||
if err := sess.Table(&Cloudbrain{}).Unscoped(). | |||||
Find(&cloudbrains); err != nil { | |||||
log.Info("find error.") | |||||
} | |||||
cloudBrainStatusResult := make(map[string]int) | |||||
for _, cloudbrain := range cloudbrains { | |||||
if _, ok := cloudBrainStatusResult[cloudbrain.Status]; !ok { | |||||
cloudBrainStatusResult[cloudbrain.Status] = 1 | |||||
} else { | |||||
cloudBrainStatusResult[cloudbrain.Status] += 1 | |||||
} | |||||
} | |||||
return cloudBrainStatusResult | |||||
} |
@@ -1,8 +1,6 @@ | |||||
package models | package models | ||||
import ( | import ( | ||||
"fmt" | |||||
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
"xorm.io/xorm" | "xorm.io/xorm" | ||||
) | ) | ||||
@@ -22,7 +20,6 @@ var customMigrations = []CustomMigration{ | |||||
} | } | ||||
var customMigrationsStatic = []CustomMigrationStatic{ | var customMigrationsStatic = []CustomMigrationStatic{ | ||||
{"Delete organization user history data ", deleteNotDisplayUser}, | |||||
{"update issue_fixed_rate to 1 if num_issues is 0 ", updateIssueFixedRate}, | {"update issue_fixed_rate to 1 if num_issues is 0 ", updateIssueFixedRate}, | ||||
} | } | ||||
@@ -36,7 +33,6 @@ func MigrateCustom(x *xorm.Engine) { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
func MigrateCustomStatic(x *xorm.Engine, static *xorm.Engine) { | func MigrateCustomStatic(x *xorm.Engine, static *xorm.Engine) { | ||||
@@ -58,24 +54,6 @@ func syncTopicStruct(x *xorm.Engine) error { | |||||
return err | return err | ||||
} | } | ||||
func deleteNotDisplayUser(x *xorm.Engine, static *xorm.Engine) error { | |||||
querySQL := "select id,name from public.user where type=1" | |||||
rows, err := x.Query(querySQL) | |||||
if err != nil { | |||||
log.Info("select db failed,err:", err) | |||||
return err | |||||
} | |||||
for i, userRow := range rows { | |||||
log.Info("delete zuzi user, i=" + fmt.Sprint(i) + " userName=" + string(userRow["name"])) | |||||
deleteSql := "delete from user_business_analysis where id=" + string(userRow["id"]) + " and name='" + string(userRow["name"]) + "'" | |||||
static.Exec(deleteSql) | |||||
} | |||||
return nil | |||||
} | |||||
func updateIssueFixedRate(x *xorm.Engine, static *xorm.Engine) error { | func updateIssueFixedRate(x *xorm.Engine, static *xorm.Engine) error { | ||||
updateSQL := "update repo_statistic set issue_fixed_rate=1.0 where num_issues=0" | updateSQL := "update repo_statistic set issue_fixed_rate=1.0 where num_issues=0" | ||||
_, err := static.Exec(updateSQL) | _, err := static.Exec(updateSQL) | ||||
@@ -1,10 +1,12 @@ | |||||
package models | package models | ||||
import ( | import ( | ||||
"code.gitea.io/gitea/modules/log" | |||||
"errors" | "errors" | ||||
"fmt" | "fmt" | ||||
"sort" | "sort" | ||||
"strings" | |||||
"code.gitea.io/gitea/modules/log" | |||||
"code.gitea.io/gitea/modules/timeutil" | "code.gitea.io/gitea/modules/timeutil" | ||||
"xorm.io/builder" | "xorm.io/builder" | ||||
@@ -179,7 +181,7 @@ func SearchDatasetCondition(opts *SearchDatasetOptions) builder.Cond { | |||||
func generateFilterCond(opts *SearchDatasetOptions, cond builder.Cond) builder.Cond { | func generateFilterCond(opts *SearchDatasetOptions, cond builder.Cond) builder.Cond { | ||||
if len(opts.Keyword) > 0 { | if len(opts.Keyword) > 0 { | ||||
cond = cond.And(builder.Or(builder.Like{"dataset.title", opts.Keyword}, builder.Like{"dataset.description", opts.Keyword})) | |||||
cond = cond.And(builder.Or(builder.Like{"LOWER(dataset.title)", strings.ToLower(opts.Keyword)}, builder.Like{"LOWER(dataset.description)", strings.ToLower(opts.Keyword)})) | |||||
} | } | ||||
if len(opts.Category) > 0 { | if len(opts.Category) > 0 { | ||||
@@ -157,6 +157,7 @@ func init() { | |||||
new(UserBusinessAnalysisCurrentMonth), | new(UserBusinessAnalysisCurrentMonth), | ||||
new(UserBusinessAnalysisCurrentWeek), | new(UserBusinessAnalysisCurrentWeek), | ||||
new(UserBusinessAnalysisYesterday), | new(UserBusinessAnalysisYesterday), | ||||
new(UserBusinessAnalysisLastWeek), | |||||
new(UserLoginLog), | new(UserLoginLog), | ||||
new(UserMetrics), | new(UserMetrics), | ||||
new(UserAnalysisPara), | new(UserAnalysisPara), | ||||
@@ -160,7 +160,11 @@ func UpdateOrgStatistics() { | |||||
has, _ := x.Get(orgStat) | has, _ := x.Get(orgStat) | ||||
orgStat.NumScore = numScore | orgStat.NumScore = numScore | ||||
if has { | |||||
count, err := GetPublicRepositoryCount(&org) | |||||
if err != nil || count == 0 { | |||||
x.ID(orgStat.ID).Delete(new(OrgStatistic)) | |||||
} else if has { | |||||
x.ID(orgStat.ID).Cols("num_score").Update(&orgStat) | x.ID(orgStat.ID).Cols("num_score").Update(&orgStat) | ||||
} else { | } else { | ||||
x.Insert(orgStat) | x.Insert(orgStat) | ||||
@@ -211,7 +211,7 @@ func setKeyContributerDict(contributorDistinctDict map[string]int, email string, | |||||
} | } | ||||
} | } | ||||
func GetAllUserKPIStats() (map[string]*git.UserKPIStats, error) { | |||||
func GetAllUserKPIStats(startTime time.Time, endTime time.Time) (map[string]*git.UserKPIStats, error) { | |||||
authors := make(map[string]*git.UserKPIStats) | authors := make(map[string]*git.UserKPIStats) | ||||
repositorys, err := GetAllRepositoriesByFilterCols("owner_name", "name") | repositorys, err := GetAllRepositoriesByFilterCols("owner_name", "name") | ||||
if err != nil { | if err != nil { | ||||
@@ -219,7 +219,7 @@ func GetAllUserKPIStats() (map[string]*git.UserKPIStats, error) { | |||||
} | } | ||||
for _, repository := range repositorys { | for _, repository := range repositorys { | ||||
authorsOneRepo, err1 := git.GetUserKPIStats(repository.RepoPath()) | |||||
authorsOneRepo, err1 := git.GetUserKPIStats(repository.RepoPath(), startTime, endTime) | |||||
if err1 != nil { | if err1 != nil { | ||||
log.Warn("get user kpi status err:"+repository.RepoPath(), err1.Error()) | log.Warn("get user kpi status err:"+repository.RepoPath(), err1.Error()) | ||||
continue | continue | ||||
@@ -407,15 +407,147 @@ func QueryUserStaticDataAll(opts *UserBusinessAnalysisQueryOptions) ([]*UserBusi | |||||
return userBusinessAnalysisReturnList, allCount | return userBusinessAnalysisReturnList, allCount | ||||
} | } | ||||
func QueryUserStaticDataForUserDefine(opts *UserBusinessAnalysisQueryOptions, wikiCountMap map[string]int) ([]*UserBusinessAnalysis, int64) { | |||||
log.Info("start to count other user info data") | |||||
sess := x.NewSession() | |||||
defer sess.Close() | |||||
currentTimeNow := time.Now() | |||||
log.Info("current time:" + currentTimeNow.Format("2006-01-02 15:04:05")) | |||||
start_unix := opts.StartTime | |||||
end_unix := opts.EndTime | |||||
CountDate := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 1, 0, 0, currentTimeNow.Location()) | |||||
DataDate := currentTimeNow.Format("2006-01-02 15:04") | |||||
CodeMergeCountMap := queryPullRequest(start_unix, end_unix) | |||||
CommitCountMap := queryCommitAction(start_unix, end_unix, 5) | |||||
IssueCountMap := queryCreateIssue(start_unix, end_unix) | |||||
CommentCountMap := queryComment(start_unix, end_unix) | |||||
FocusRepoCountMap := queryWatch(start_unix, end_unix) | |||||
StarRepoCountMap := queryStar(start_unix, end_unix) | |||||
WatchedCountMap, WatchOtherMap := queryFollow(start_unix, end_unix) | |||||
StartTime := time.Unix(start_unix, 0) | |||||
EndTime := time.Unix(end_unix, 0) | |||||
CommitCodeSizeMap, err := GetAllUserKPIStats(StartTime, EndTime) | |||||
if err != nil { | |||||
log.Info("query commit code errr.") | |||||
} else { | |||||
log.Info("query commit code size, len=" + fmt.Sprint(len(CommitCodeSizeMap))) | |||||
CommitCodeSizeMapJson, _ := json.Marshal(CommitCodeSizeMap) | |||||
log.Info("CommitCodeSizeMapJson=" + string(CommitCodeSizeMapJson)) | |||||
} | |||||
CommitDatasetSizeMap, CommitDatasetNumMap := queryDatasetSize(start_unix, end_unix) | |||||
SolveIssueCountMap := querySolveIssue(start_unix, end_unix) | |||||
CreateRepoCountMap := queryUserCreateRepo(start_unix, end_unix) | |||||
LoginCountMap := queryLoginCount(start_unix, end_unix) | |||||
OpenIIndexMap := queryUserRepoOpenIIndex(start_unix, end_unix) | |||||
CloudBrainTaskMap, CloudBrainTaskItemMap := queryCloudBrainTask(start_unix, end_unix) | |||||
AiModelManageMap := queryUserModel(start_unix, end_unix) | |||||
CollectDataset, CollectedDataset := queryDatasetStars(start_unix, end_unix) | |||||
RecommendDataset := queryRecommedDataSet(start_unix, end_unix) | |||||
CollectImage, CollectedImage := queryImageStars(start_unix, end_unix) | |||||
RecommendImage := queryRecommedImage(start_unix, end_unix) | |||||
statictisSess := xStatistic.NewSession() | |||||
defer statictisSess.Close() | |||||
cond := "type != 1 and is_active=true" | |||||
count, err := sess.Where(cond).Count(new(User)) | |||||
ParaWeight := getParaWeight() | |||||
ResultList := make([]*UserBusinessAnalysis, 0) | |||||
var indexTotal int64 | |||||
indexTotal = 0 | |||||
for { | |||||
sess.Select("`user`.*").Table("user").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
userList := make([]*User, 0) | |||||
sess.Find(&userList) | |||||
for i, userRecord := range userList { | |||||
var dateRecord UserBusinessAnalysis | |||||
dateRecord.ID = userRecord.ID | |||||
log.Info("i=" + fmt.Sprint(i) + " userName=" + userRecord.Name) | |||||
dateRecord.CountDate = CountDate.Unix() | |||||
dateRecord.DataDate = DataDate | |||||
dateRecord.Email = userRecord.Email | |||||
dateRecord.RegistDate = userRecord.CreatedUnix | |||||
dateRecord.Name = userRecord.Name | |||||
dateRecord.UserLocation = userRecord.Location | |||||
dateRecord.GiteaAgeMonth = subMonth(currentTimeNow, userRecord.CreatedUnix.AsTime()) | |||||
dateRecord.CodeMergeCount = getMapValue(dateRecord.ID, CodeMergeCountMap) | |||||
dateRecord.CommitCount = getMapValue(dateRecord.ID, CommitCountMap) | |||||
dateRecord.IssueCount = getMapValue(dateRecord.ID, IssueCountMap) | |||||
dateRecord.CommentCount = getMapValue(dateRecord.ID, CommentCountMap) | |||||
dateRecord.FocusRepoCount = getMapValue(dateRecord.ID, FocusRepoCountMap) | |||||
dateRecord.StarRepoCount = getMapValue(dateRecord.ID, StarRepoCountMap) | |||||
dateRecord.WatchedCount = getMapValue(dateRecord.ID, WatchedCountMap) | |||||
dateRecord.FocusOtherUser = getMapValue(dateRecord.ID, WatchOtherMap) | |||||
if _, ok := CommitCodeSizeMap[dateRecord.Email]; !ok { | |||||
dateRecord.CommitCodeSize = 0 | |||||
} else { | |||||
dateRecord.CommitCodeSize = int(CommitCodeSizeMap[dateRecord.Email].CommitLines) | |||||
} | |||||
dateRecord.CommitDatasetSize = getMapValue(dateRecord.ID, CommitDatasetSizeMap) | |||||
dateRecord.CommitDatasetNum = getMapValue(dateRecord.ID, CommitDatasetNumMap) | |||||
dateRecord.SolveIssueCount = getMapValue(dateRecord.ID, SolveIssueCountMap) | |||||
dateRecord.EncyclopediasCount = getMapKeyStringValue(dateRecord.Name, wikiCountMap) | |||||
dateRecord.CreateRepoCount = getMapValue(dateRecord.ID, CreateRepoCountMap) | |||||
dateRecord.LoginCount = getMapValue(dateRecord.ID, LoginCountMap) | |||||
if _, ok := OpenIIndexMap[dateRecord.ID]; !ok { | |||||
dateRecord.OpenIIndex = 0 | |||||
} else { | |||||
dateRecord.OpenIIndex = OpenIIndexMap[dateRecord.ID] | |||||
} | |||||
dateRecord.CloudBrainTaskNum = getMapValue(dateRecord.ID, CloudBrainTaskMap) | |||||
dateRecord.GpuDebugJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_GpuDebugJob", CloudBrainTaskItemMap) | |||||
dateRecord.NpuDebugJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_NpuDebugJob", CloudBrainTaskItemMap) | |||||
dateRecord.GpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_GpuTrainJob", CloudBrainTaskItemMap) | |||||
dateRecord.NpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_NpuTrainJob", CloudBrainTaskItemMap) | |||||
dateRecord.NpuInferenceJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_NpuInferenceJob", CloudBrainTaskItemMap) | |||||
dateRecord.GpuBenchMarkJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_GpuBenchMarkJob", CloudBrainTaskItemMap) | |||||
dateRecord.CloudBrainRunTime = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_CloudBrainRunTime", CloudBrainTaskItemMap) | |||||
dateRecord.CommitModelCount = getMapValue(dateRecord.ID, AiModelManageMap) | |||||
dateRecord.CollectDataset = getMapValue(dateRecord.ID, CollectDataset) | |||||
dateRecord.CollectedDataset = getMapValue(dateRecord.ID, CollectedDataset) | |||||
dateRecord.RecommendDataset = getMapValue(dateRecord.ID, RecommendDataset) | |||||
dateRecord.CollectImage = getMapValue(dateRecord.ID, CollectImage) | |||||
dateRecord.CollectedImage = getMapValue(dateRecord.ID, CollectedImage) | |||||
dateRecord.RecommendImage = getMapValue(dateRecord.ID, RecommendImage) | |||||
dateRecord.UserIndexPrimitive = getUserIndex(dateRecord, ParaWeight) | |||||
ResultList = append(ResultList, &dateRecord) | |||||
} | |||||
indexTotal += PAGE_SIZE | |||||
if indexTotal >= count { | |||||
break | |||||
} | |||||
} | |||||
log.Info("query user define,count=" + fmt.Sprint(len(ResultList))) | |||||
return ResultList, int64(len(ResultList)) | |||||
} | |||||
func QueryUserStaticDataPage(opts *UserBusinessAnalysisQueryOptions) ([]*UserBusinessAnalysis, int64) { | func QueryUserStaticDataPage(opts *UserBusinessAnalysisQueryOptions) ([]*UserBusinessAnalysis, int64) { | ||||
log.Info("query startTime =" + fmt.Sprint(opts.StartTime) + " endTime=" + fmt.Sprint(opts.EndTime) + " isAll=" + fmt.Sprint(opts.IsAll)) | log.Info("query startTime =" + fmt.Sprint(opts.StartTime) + " endTime=" + fmt.Sprint(opts.EndTime) + " isAll=" + fmt.Sprint(opts.IsAll)) | ||||
statictisSess := xStatistic.NewSession() | statictisSess := xStatistic.NewSession() | ||||
defer statictisSess.Close() | defer statictisSess.Close() | ||||
currentTimeNow := time.Now() | |||||
pageStartTime := getLastCountDate() | |||||
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()).Unix() | |||||
//currentTimeNow := time.Now() | |||||
//pageStartTime := getLastCountDate() | |||||
//pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()).Unix() | |||||
var cond = builder.NewCond() | var cond = builder.NewCond() | ||||
if len(opts.UserName) > 0 { | if len(opts.UserName) > 0 { | ||||
@@ -424,10 +556,10 @@ func QueryUserStaticDataPage(opts *UserBusinessAnalysisQueryOptions) ([]*UserBus | |||||
) | ) | ||||
} | } | ||||
cond = cond.And( | cond = cond.And( | ||||
builder.Gte{"count_date": pageStartTime}, | |||||
builder.Gte{"count_date": opts.StartTime}, | |||||
) | ) | ||||
cond = cond.And( | cond = cond.And( | ||||
builder.Lte{"count_date": pageEndTime}, | |||||
builder.Lte{"count_date": opts.EndTime}, | |||||
) | ) | ||||
count, err := statictisSess.Where(cond).Count(new(UserBusinessAnalysis)) | count, err := statictisSess.Where(cond).Count(new(UserBusinessAnalysis)) | ||||
@@ -447,7 +579,7 @@ func QueryUserStaticDataPage(opts *UserBusinessAnalysisQueryOptions) ([]*UserBus | |||||
} | } | ||||
userBusinessAnalysisList := make([]*UserBusinessAnalysis, 0) | userBusinessAnalysisList := make([]*UserBusinessAnalysis, 0) | ||||
if err := statictisSess.Table("user_business_analysis").Where(cond).OrderBy("id desc"). | |||||
if err := statictisSess.Table("user_business_analysis").Where(cond).OrderBy("count_date,id desc"). | |||||
Find(&userBusinessAnalysisList); err != nil { | Find(&userBusinessAnalysisList); err != nil { | ||||
return nil, 0 | return nil, 0 | ||||
} | } | ||||
@@ -532,10 +664,8 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS | |||||
log.Info("truncate all data from table: " + tableName) | log.Info("truncate all data from table: " + tableName) | ||||
statictisSess.Exec("TRUNCATE TABLE " + tableName) | statictisSess.Exec("TRUNCATE TABLE " + tableName) | ||||
StartTimeNextDay := pageStartTime.AddDate(0, 0, 1) | |||||
EndTimeNextDay := pageEndTime.AddDate(0, 0, 1) | |||||
log.Info("pageStartTime:" + pageStartTime.Format("2006-01-02 15:04:05") + " nextDay:" + StartTimeNextDay.Format("2006-01-02 15:04:05")) | |||||
log.Info("pageEndTime time:" + pageEndTime.Format("2006-01-02 15:04:05") + " nextDay:" + EndTimeNextDay.Format("2006-01-02 15:04:05")) | |||||
log.Info("pageStartTime:" + pageStartTime.Format("2006-01-02 15:04:05")) | |||||
log.Info("pageEndTime time:" + pageEndTime.Format("2006-01-02 15:04:05")) | |||||
start_unix := pageStartTime.Unix() | start_unix := pageStartTime.Unix() | ||||
end_unix := pageEndTime.Unix() | end_unix := pageEndTime.Unix() | ||||
@@ -551,7 +681,15 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS | |||||
FocusRepoCountMap := queryWatch(start_unix, end_unix) | FocusRepoCountMap := queryWatch(start_unix, end_unix) | ||||
StarRepoCountMap := queryStar(start_unix, end_unix) | StarRepoCountMap := queryStar(start_unix, end_unix) | ||||
WatchedCountMap, WatchOtherMap := queryFollow(start_unix, end_unix) | WatchedCountMap, WatchOtherMap := queryFollow(start_unix, end_unix) | ||||
CommitCodeSizeMap := queryCommitCodeSize(StartTimeNextDay.Unix(), EndTimeNextDay.Unix()) | |||||
CommitCodeSizeMap, err := GetAllUserKPIStats(pageStartTime, pageEndTime) | |||||
if err != nil { | |||||
log.Info("query commit code errr.") | |||||
} else { | |||||
log.Info("query commit code size, len=" + fmt.Sprint(len(CommitCodeSizeMap))) | |||||
CommitCodeSizeMapJson, _ := json.Marshal(CommitCodeSizeMap) | |||||
log.Info("CommitCodeSizeMapJson=" + string(CommitCodeSizeMapJson)) | |||||
} | |||||
//CommitCodeSizeMap := queryCommitCodeSize(StartTimeNextDay.Unix(), EndTimeNextDay.Unix()) | |||||
CommitDatasetSizeMap, CommitDatasetNumMap := queryDatasetSize(start_unix, end_unix) | CommitDatasetSizeMap, CommitDatasetNumMap := queryDatasetSize(start_unix, end_unix) | ||||
SolveIssueCountMap := querySolveIssue(start_unix, end_unix) | SolveIssueCountMap := querySolveIssue(start_unix, end_unix) | ||||
CreateRepoCountMap := queryUserCreateRepo(start_unix, end_unix) | CreateRepoCountMap := queryUserCreateRepo(start_unix, end_unix) | ||||
@@ -605,7 +743,12 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS | |||||
dateRecordAll.FocusOtherUser = getMapValue(dateRecordAll.ID, WatchOtherMap) | dateRecordAll.FocusOtherUser = getMapValue(dateRecordAll.ID, WatchOtherMap) | ||||
dateRecordAll.StarRepoCount = getMapValue(dateRecordAll.ID, StarRepoCountMap) | dateRecordAll.StarRepoCount = getMapValue(dateRecordAll.ID, StarRepoCountMap) | ||||
dateRecordAll.WatchedCount = getMapValue(dateRecordAll.ID, WatchedCountMap) | dateRecordAll.WatchedCount = getMapValue(dateRecordAll.ID, WatchedCountMap) | ||||
dateRecordAll.CommitCodeSize = getMapValue(dateRecordAll.ID, CommitCodeSizeMap) | |||||
if _, ok := CommitCodeSizeMap[dateRecordAll.Email]; !ok { | |||||
dateRecordAll.CommitCodeSize = 0 | |||||
} else { | |||||
dateRecordAll.CommitCodeSize = int(CommitCodeSizeMap[dateRecordAll.Email].CommitLines) | |||||
} | |||||
//dateRecordAll.CommitCodeSize = getMapValue(dateRecordAll.ID, CommitCodeSizeMap) | |||||
dateRecordAll.CommitDatasetSize = getMapValue(dateRecordAll.ID, CommitDatasetSizeMap) | dateRecordAll.CommitDatasetSize = getMapValue(dateRecordAll.ID, CommitDatasetSizeMap) | ||||
dateRecordAll.CommitDatasetNum = getMapValue(dateRecordAll.ID, CommitDatasetNumMap) | dateRecordAll.CommitDatasetNum = getMapValue(dateRecordAll.ID, CommitDatasetNumMap) | ||||
dateRecordAll.SolveIssueCount = getMapValue(dateRecordAll.ID, SolveIssueCountMap) | dateRecordAll.SolveIssueCount = getMapValue(dateRecordAll.ID, SolveIssueCountMap) | ||||
@@ -626,6 +769,7 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS | |||||
dateRecordAll.NpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_NpuTrainJob", CloudBrainTaskItemMap) | dateRecordAll.NpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_NpuTrainJob", CloudBrainTaskItemMap) | ||||
dateRecordAll.NpuInferenceJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_NpuInferenceJob", CloudBrainTaskItemMap) | dateRecordAll.NpuInferenceJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_NpuInferenceJob", CloudBrainTaskItemMap) | ||||
dateRecordAll.GpuBenchMarkJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_GpuBenchMarkJob", CloudBrainTaskItemMap) | dateRecordAll.GpuBenchMarkJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_GpuBenchMarkJob", CloudBrainTaskItemMap) | ||||
dateRecordAll.CloudBrainRunTime = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_CloudBrainRunTime", CloudBrainTaskItemMap) | |||||
dateRecordAll.CommitModelCount = getMapValue(dateRecordAll.ID, AiModelManageMap) | dateRecordAll.CommitModelCount = getMapValue(dateRecordAll.ID, AiModelManageMap) | ||||
dateRecordAll.CollectDataset = getMapValue(dateRecordAll.ID, CollectDataset) | dateRecordAll.CollectDataset = getMapValue(dateRecordAll.ID, CollectDataset) | ||||
dateRecordAll.CollectedDataset = getMapValue(dateRecordAll.ID, CollectedDataset) | dateRecordAll.CollectedDataset = getMapValue(dateRecordAll.ID, CollectedDataset) | ||||
@@ -733,7 +877,12 @@ func RefreshUserStaticAllTabel(wikiCountMap map[string]int, userMetrics map[stri | |||||
pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) | pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) | ||||
refreshUserStaticTable(wikiCountMap, "user_business_analysis_current_week", pageStartTime, pageEndTime, userMetrics) | refreshUserStaticTable(wikiCountMap, "user_business_analysis_current_week", pageStartTime, pageEndTime, userMetrics) | ||||
pageEndTime = pageStartTime | |||||
pageStartTime = pageStartTime.AddDate(0, 0, -7) | |||||
refreshUserStaticTable(wikiCountMap, "user_business_analysis_last_week", pageStartTime, pageEndTime, userMetrics) | |||||
pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -30) | pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -30) | ||||
pageEndTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) | |||||
refreshUserStaticTable(wikiCountMap, "user_business_analysis_last30_day", pageStartTime, pageEndTime, userMetrics) | refreshUserStaticTable(wikiCountMap, "user_business_analysis_last30_day", pageStartTime, pageEndTime, userMetrics) | ||||
pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -1) | pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -1) | ||||
@@ -774,7 +923,7 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
StarRepoCountMap := queryStar(start_unix, end_unix) | StarRepoCountMap := queryStar(start_unix, end_unix) | ||||
WatchedCountMap, WatchOtherMap := queryFollow(start_unix, end_unix) | WatchedCountMap, WatchOtherMap := queryFollow(start_unix, end_unix) | ||||
CommitCodeSizeMap, err := GetAllUserKPIStats() | |||||
CommitCodeSizeMap, err := GetAllUserKPIStats(startTime, endTime) | |||||
if err != nil { | if err != nil { | ||||
log.Info("query commit code errr.") | log.Info("query commit code errr.") | ||||
} else { | } else { | ||||
@@ -825,7 +974,7 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
dateRecord.Name = userRecord.Name | dateRecord.Name = userRecord.Name | ||||
dateRecord.GiteaAgeMonth = subMonth(currentTimeNow, userRecord.CreatedUnix.AsTime()) | dateRecord.GiteaAgeMonth = subMonth(currentTimeNow, userRecord.CreatedUnix.AsTime()) | ||||
dateRecord.DataDate = DataDate | dateRecord.DataDate = DataDate | ||||
dateRecord.UserLocation = userRecord.Location | |||||
dateRecord.CodeMergeCount = getMapValue(dateRecord.ID, CodeMergeCountMap) | dateRecord.CodeMergeCount = getMapValue(dateRecord.ID, CodeMergeCountMap) | ||||
dateRecord.CommitCount = getMapValue(dateRecord.ID, CommitCountMap) | dateRecord.CommitCount = getMapValue(dateRecord.ID, CommitCountMap) | ||||
dateRecord.IssueCount = getMapValue(dateRecord.ID, IssueCountMap) | dateRecord.IssueCount = getMapValue(dateRecord.ID, IssueCountMap) | ||||
@@ -878,15 +1027,7 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
log.Info("has activity." + userRecord.Name) | log.Info("has activity." + userRecord.Name) | ||||
addUserToMap(userNewAddActivity, userRecord.CreatedUnix, dateRecord.ID) | addUserToMap(userNewAddActivity, userRecord.CreatedUnix, dateRecord.ID) | ||||
} | } | ||||
if userRecord.IsActive { | |||||
continue | |||||
} | |||||
statictisSess.Delete(&dateRecord) | |||||
_, err = statictisSess.Insert(&dateRecord) | |||||
if err != nil { | |||||
log.Info("insert daterecord failed." + err.Error()) | |||||
return err | |||||
} | |||||
} | } | ||||
indexTotal += PAGE_SIZE | indexTotal += PAGE_SIZE | ||||
@@ -971,7 +1112,7 @@ func setUserMetrics(userMetrics map[string]int, user *User, start_time int64, en | |||||
//HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` | //HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` | ||||
//TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | //TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | ||||
//TotalHasActivityUser | //TotalHasActivityUser | ||||
regist_time := user.CreatedUnix.AsTime().Unix() | |||||
regist_time := int64(user.CreatedUnix) | |||||
if regist_time >= start_time && regist_time <= end_time { | if regist_time >= start_time && regist_time <= end_time { | ||||
if user.IsActive { | if user.IsActive { | ||||
userMetrics["ActivateRegistUser"] = getMapKeyStringValue("ActivateRegistUser", userMetrics) + 1 | userMetrics["ActivateRegistUser"] = getMapKeyStringValue("ActivateRegistUser", userMetrics) + 1 | ||||
@@ -1013,7 +1154,7 @@ func getUserIndexFromAnalysisAll(dateRecord UserBusinessAnalysisAll, ParaWeight | |||||
// 登录次数 0.10 | // 登录次数 0.10 | ||||
result = float64(dateRecord.CodeMergeCount) * getParaWeightValue("CodeMergeCount", ParaWeight, 0.2) | result = float64(dateRecord.CodeMergeCount) * getParaWeightValue("CodeMergeCount", ParaWeight, 0.2) | ||||
result += float64(dateRecord.CommitCount) * getParaWeightValue("CommitCount", ParaWeight, 0.2) | result += float64(dateRecord.CommitCount) * getParaWeightValue("CommitCount", ParaWeight, 0.2) | ||||
log.Info("1 result=" + fmt.Sprint(result)) | |||||
//log.Info("1 result=" + fmt.Sprint(result)) | |||||
result += float64(dateRecord.IssueCount) * getParaWeightValue("IssueCount", ParaWeight, 0.2) | result += float64(dateRecord.IssueCount) * getParaWeightValue("IssueCount", ParaWeight, 0.2) | ||||
result += float64(dateRecord.CommentCount) * getParaWeightValue("CommentCount", ParaWeight, 0.2) | result += float64(dateRecord.CommentCount) * getParaWeightValue("CommentCount", ParaWeight, 0.2) | ||||
result += float64(dateRecord.FocusRepoCount) * getParaWeightValue("FocusRepoCount", ParaWeight, 0.1) | result += float64(dateRecord.FocusRepoCount) * getParaWeightValue("FocusRepoCount", ParaWeight, 0.1) | ||||
@@ -1096,7 +1237,7 @@ func getUserIndex(dateRecord UserBusinessAnalysis, ParaWeight map[string]float64 | |||||
// 登录次数 0.10 | // 登录次数 0.10 | ||||
result = float64(dateRecord.CodeMergeCount) * getParaWeightValue("CodeMergeCount", ParaWeight, 0.2) | result = float64(dateRecord.CodeMergeCount) * getParaWeightValue("CodeMergeCount", ParaWeight, 0.2) | ||||
result += float64(dateRecord.CommitCount) * getParaWeightValue("CommitCount", ParaWeight, 0.2) | result += float64(dateRecord.CommitCount) * getParaWeightValue("CommitCount", ParaWeight, 0.2) | ||||
log.Info("2 result=" + fmt.Sprint(result)) | |||||
//log.Info("2 result=" + fmt.Sprint(result)) | |||||
result += float64(dateRecord.IssueCount) * getParaWeightValue("IssueCount", ParaWeight, 0.2) | result += float64(dateRecord.IssueCount) * getParaWeightValue("IssueCount", ParaWeight, 0.2) | ||||
result += float64(dateRecord.CommentCount) * getParaWeightValue("CommentCount", ParaWeight, 0.2) | result += float64(dateRecord.CommentCount) * getParaWeightValue("CommentCount", ParaWeight, 0.2) | ||||
result += float64(dateRecord.FocusRepoCount) * getParaWeightValue("FocusRepoCount", ParaWeight, 0.1) | result += float64(dateRecord.FocusRepoCount) * getParaWeightValue("FocusRepoCount", ParaWeight, 0.1) | ||||
@@ -1640,7 +1781,7 @@ func queryImageStars(start_unix int64, end_unix int64) (map[int64]int, map[int64 | |||||
var indexTotal int64 | var indexTotal int64 | ||||
indexTotal = 0 | indexTotal = 0 | ||||
for { | for { | ||||
sess.Select("id,uid,dataset_id").Table(new(ImageStar)).Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
sess.Select("id,uid,image_id").Table(new(ImageStar)).Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
imageStarList := make([]*ImageStar, 0) | imageStarList := make([]*ImageStar, 0) | ||||
sess.Find(&imageStarList) | sess.Find(&imageStarList) | ||||
log.Info("query imageStarList size=" + fmt.Sprint(len(imageStarList))) | log.Info("query imageStarList size=" + fmt.Sprint(len(imageStarList))) | ||||
@@ -1908,7 +2049,7 @@ func queryCloudBrainTask(start_unix int64, end_unix int64) (map[int64]int, map[s | |||||
var indexTotal int64 | var indexTotal int64 | ||||
indexTotal = 0 | indexTotal = 0 | ||||
for { | for { | ||||
sess.Select("id,job_type,user_id,duration,train_job_duration,type").Table("cloudbrain").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
sess.Select("id,job_type,user_id,duration,train_job_duration,type").Table("cloudbrain").Unscoped().Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
cloudTaskList := make([]*Cloudbrain, 0) | cloudTaskList := make([]*Cloudbrain, 0) | ||||
sess.Find(&cloudTaskList) | sess.Find(&cloudTaskList) | ||||
log.Info("query cloudbrain size=" + fmt.Sprint(len(cloudTaskList))) | log.Info("query cloudbrain size=" + fmt.Sprint(len(cloudTaskList))) | ||||
@@ -394,6 +394,72 @@ type UserBusinessAnalysisYesterday struct { | |||||
RecommendImage int `xorm:"NOT NULL DEFAULT 0"` | RecommendImage int `xorm:"NOT NULL DEFAULT 0"` | ||||
} | } | ||||
type UserBusinessAnalysisLastWeek struct { | |||||
ID int64 `xorm:"pk"` | |||||
CountDate int64 `xorm:"pk"` | |||||
//action :ActionMergePullRequest // 11 | |||||
CodeMergeCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//action :ActionCommitRepo | |||||
CommitCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//issue // 10 | |||||
IssueCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//comment table current date | |||||
CommentCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//watch table current date | |||||
FocusRepoCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//star table current date | |||||
StarRepoCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//follow table | |||||
WatchedCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
// user table | |||||
GiteaAgeMonth int `xorm:"NOT NULL DEFAULT 0"` | |||||
// | |||||
CommitCodeSize int `xorm:"NOT NULL DEFAULT 0"` | |||||
//attachement table | |||||
CommitDatasetSize int `xorm:"NOT NULL DEFAULT 0"` | |||||
//0 | |||||
CommitModelCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//issue, issueassignees | |||||
SolveIssueCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//baike | |||||
EncyclopediasCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//user | |||||
RegistDate timeutil.TimeStamp `xorm:"NOT NULL"` | |||||
//repo | |||||
CreateRepoCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//login count, from elk | |||||
LoginCount int `xorm:"NOT NULL DEFAULT 0"` | |||||
//openi index | |||||
OpenIIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
//user | |||||
Email string `xorm:"NOT NULL"` | |||||
//user | |||||
Name string `xorm:"NOT NULL"` | |||||
DataDate string `xorm:"NULL"` | |||||
CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
UserIndexPrimitive float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
UserLocation string `xorm:"NULL"` | |||||
FocusOtherUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
CollectDataset int `xorm:"NOT NULL DEFAULT 0"` | |||||
CollectedDataset int `xorm:"NOT NULL DEFAULT 0"` | |||||
RecommendDataset int `xorm:"NOT NULL DEFAULT 0"` | |||||
CollectImage int `xorm:"NOT NULL DEFAULT 0"` | |||||
CollectedImage int `xorm:"NOT NULL DEFAULT 0"` | |||||
RecommendImage int `xorm:"NOT NULL DEFAULT 0"` | |||||
} | |||||
type UserAnalysisPara struct { | type UserAnalysisPara struct { | ||||
Key string `xorm:"NOT NULL"` | Key string `xorm:"NOT NULL"` | ||||
Value float64 `xorm:"NOT NULL DEFAULT 0"` | Value float64 `xorm:"NOT NULL DEFAULT 0"` | ||||
@@ -58,12 +58,11 @@ func SetDevelopAge(repoPath string, stats *RepoKPIStats, fromTime time.Time) err | |||||
return nil | return nil | ||||
} | } | ||||
//获取一天内的用户贡献指标 | |||||
func GetUserKPIStats(repoPath string) (map[string]*UserKPIStats, error) { | |||||
timeUntil := time.Now() | |||||
oneDayAgo := timeUntil.AddDate(0, 0, -1) | |||||
since := oneDayAgo.Format(time.RFC3339) | |||||
args := []string{"log", "--numstat", "--no-merges", "--branches=*", "--pretty=format:---%n%h%n%an%n%ae%n", "--date=iso", fmt.Sprintf("--since='%s'", since)} | |||||
func GetUserKPIStats(repoPath string, startTime time.Time, endTime time.Time) (map[string]*UserKPIStats, error) { | |||||
after := startTime.Format(time.RFC3339) | |||||
until := endTime.Format(time.RFC3339) | |||||
args := []string{"log", "--numstat", "--no-merges", "--branches=*", "--pretty=format:---%n%h%n%an%n%ae%n", "--date=iso", fmt.Sprintf("--after='%s'", after), fmt.Sprintf("--until=='%s'", until)} | |||||
stdout, err := NewCommand(args...).RunInDirBytes(repoPath) | stdout, err := NewCommand(args...).RunInDirBytes(repoPath) | ||||
if err != nil { | if err != nil { | ||||
return nil, err | return nil, err | ||||
@@ -124,6 +123,14 @@ func GetUserKPIStats(repoPath string) (map[string]*UserKPIStats, error) { | |||||
} | } | ||||
//获取一天内的用户贡献指标 | |||||
func getUserKPIStats(repoPath string) (map[string]*UserKPIStats, error) { | |||||
timeUntil := time.Now() | |||||
oneDayAgo := timeUntil.AddDate(0, 0, -1) | |||||
return GetUserKPIStats(repoPath, oneDayAgo, oneDayAgo) | |||||
} | |||||
func SetRepoKPIStats(repoPath string, fromTime time.Time, stats *RepoKPIStats, newContributers map[string]struct{}) error { | func SetRepoKPIStats(repoPath string, fromTime time.Time, stats *RepoKPIStats, newContributers map[string]struct{}) error { | ||||
since := fromTime.Format(time.RFC3339) | since := fromTime.Format(time.RFC3339) | ||||
args := []string{"log", "--numstat", "--no-merges", "HEAD", "--pretty=format:---%n%h%n%an%n%ae%n", "--date=iso", fmt.Sprintf("--since='%s'", since)} | args := []string{"log", "--numstat", "--no-merges", "HEAD", "--pretty=format:---%n%h%n%an%n%ae%n", "--date=iso", fmt.Sprintf("--since='%s'", since)} | ||||
@@ -783,6 +783,7 @@ func RenameRepoFile(repo *models.Repository, doer *models.User, opts *RenameRepo | |||||
// Check that the path given in opts.treePath is valid (not a git path) | // Check that the path given in opts.treePath is valid (not a git path) | ||||
treePath := CleanUploadFileName(opts.TreePath) | treePath := CleanUploadFileName(opts.TreePath) | ||||
treePath = strings.ReplaceAll(treePath, " ", "") | |||||
if treePath == "" { | if treePath == "" { | ||||
return models.ErrFilenameInvalid{ | return models.ErrFilenameInvalid{ | ||||
Path: opts.TreePath, | Path: opts.TreePath, | ||||
@@ -942,16 +943,16 @@ func moveAndAddFiles(oldTreePath, newTreePath string, t *TemporaryUploadReposito | |||||
} | } | ||||
//example for v(mode SHA-1 stage file) | //example for v(mode SHA-1 stage file) | ||||
//100755 d294c88235ac05d3dece028d8a65590f28ec46ac 0 custom/conf/app.ini | //100755 d294c88235ac05d3dece028d8a65590f28ec46ac 0 custom/conf/app.ini | ||||
v = strings.ReplaceAll(v, "0\t", "") | |||||
tmpArray := strings.Split(v, " ") | |||||
oldPath := tmpArray[2] | |||||
tempArray := strings.Split(v, "0\t") | |||||
leftArray := strings.Split(tempArray[0], " ") | |||||
oldPath := tempArray[1] | |||||
newPath := newTreePath + strings.TrimPrefix(oldPath, oldTreePath) | newPath := newTreePath + strings.TrimPrefix(oldPath, oldTreePath) | ||||
// mode 0 means remove file | // mode 0 means remove file | ||||
stdIn.WriteString("0 0000000000000000000000000000000000000000\t") | stdIn.WriteString("0 0000000000000000000000000000000000000000\t") | ||||
stdIn.WriteString(oldPath) | stdIn.WriteString(oldPath) | ||||
stdIn.WriteByte('\000') | stdIn.WriteByte('\000') | ||||
stdIn.WriteString(tmpArray[0] + " ") | |||||
stdIn.WriteString(tmpArray[1] + "\t") | |||||
stdIn.WriteString(leftArray[0] + " ") | |||||
stdIn.WriteString(leftArray[1] + "\t") | |||||
stdIn.WriteString(newPath) | stdIn.WriteString(newPath) | ||||
stdIn.WriteByte('\000') | stdIn.WriteByte('\000') | ||||
} | } | ||||
@@ -519,15 +519,18 @@ static.RecommendDataset=Recommended Dataset Count | |||||
static.CollectImage=Collect Image Count | static.CollectImage=Collect Image Count | ||||
static.CollectedImage=Collected Image Count | static.CollectedImage=Collected Image Count | ||||
static.RecommendImage=Recommended Image Count | static.RecommendImage=Recommended Image Count | ||||
static.email=Email | |||||
static.location=Location | |||||
static.all=All | static.all=All | ||||
static.public.user_business_analysis_current_month=Current_Month | static.public.user_business_analysis_current_month=Current_Month | ||||
static.public.user_business_analysis_current_week=Current_Week | static.public.user_business_analysis_current_week=Current_Week | ||||
static.public.user_business_analysis_last_week=Last_Week | |||||
static.public.user_business_analysis_current_year=Current_Year | static.public.user_business_analysis_current_year=Current_Year | ||||
static.public.user_business_analysis_last30_day=Last_30_day | static.public.user_business_analysis_last30_day=Last_30_day | ||||
static.public.user_business_analysis_last_month=Last_Month | static.public.user_business_analysis_last_month=Last_Month | ||||
static.public.user_business_analysis_yesterday=Yesterday | static.public.user_business_analysis_yesterday=Yesterday | ||||
static.public.user_business_analysis_all=All | static.public.user_business_analysis_all=All | ||||
static.downloadinfo=Due to the large amount of data generated in the customized time period and long calculation time, please download and export the data from the following address and export the data download address: | |||||
metrics.sheetname=User Trend Analysis | metrics.sheetname=User Trend Analysis | ||||
metrics.date=Count Date | metrics.date=Count Date | ||||
metrics.newregistuser=New registered user | metrics.newregistuser=New registered user | ||||
@@ -536,6 +539,7 @@ metrics.hasactivateuser=New contributing activities | |||||
metrics.newregistnotactiveuser=New inactive | metrics.newregistnotactiveuser=New inactive | ||||
metrics.averageuser=Average new users | metrics.averageuser=Average new users | ||||
metrics.newuseractiveindex=Activation rate of new users | metrics.newuseractiveindex=Activation rate of new users | ||||
metrics.currentdayactivity=Current day contributing activities | |||||
metrics.totalregistuser=Cumulative registered users | metrics.totalregistuser=Cumulative registered users | ||||
metrics.totalactiveduser=Cumulative activated users | metrics.totalactiveduser=Cumulative activated users | ||||
metrics.totalhasactivityuser=Cumulative active users | metrics.totalhasactivityuser=Cumulative active users | ||||
@@ -2945,6 +2949,7 @@ raw_minutes = minutes | |||||
[dropzone] | [dropzone] | ||||
default_message = Drop files or click here to upload. | default_message = Drop files or click here to upload. | ||||
default_dataset_message = Click to add files or directly drag and drop files here | |||||
invalid_input_type = You can not upload files of this type. | invalid_input_type = You can not upload files of this type. | ||||
file_too_big = File size ({{filesize}} MB) exceeds the maximum size of ({{maxFilesize}} MB). | file_too_big = File size ({{filesize}} MB) exceeds the maximum size of ({{maxFilesize}} MB). | ||||
remove_file = Remove file | remove_file = Remove file | ||||
@@ -524,15 +524,18 @@ static.RecommendDataset=被推荐数据集数 | |||||
static.CollectImage=收藏镜像数 | static.CollectImage=收藏镜像数 | ||||
static.CollectedImage=被收藏镜像数 | static.CollectedImage=被收藏镜像数 | ||||
static.RecommendImage=被推荐镜像数 | static.RecommendImage=被推荐镜像数 | ||||
static.email=Email | |||||
static.location=所在地区 | |||||
static.all=所有 | static.all=所有 | ||||
static.public.user_business_analysis_current_month=本月 | static.public.user_business_analysis_current_month=本月 | ||||
static.public.user_business_analysis_current_week=本周 | static.public.user_business_analysis_current_week=本周 | ||||
static.public.user_business_analysis_last_week=上周 | |||||
static.public.user_business_analysis_current_year=今年 | static.public.user_business_analysis_current_year=今年 | ||||
static.public.user_business_analysis_last30_day=近30天 | static.public.user_business_analysis_last30_day=近30天 | ||||
static.public.user_business_analysis_last_month=上月 | static.public.user_business_analysis_last_month=上月 | ||||
static.public.user_business_analysis_yesterday=昨天 | static.public.user_business_analysis_yesterday=昨天 | ||||
static.public.user_business_analysis_all=所有 | static.public.user_business_analysis_all=所有 | ||||
static.downloadinfo=因自定义时间段产生的数据量比较大,计算时间比较长,请您从如下地址下载导出数据,导出数据下载地址: | |||||
metrics.sheetname=用户趋势分析 | metrics.sheetname=用户趋势分析 | ||||
metrics.date=日期 | metrics.date=日期 | ||||
metrics.newregistuser=新增注册用户 | metrics.newregistuser=新增注册用户 | ||||
@@ -541,6 +544,7 @@ metrics.hasactivateuser=新增有贡献活动 | |||||
metrics.newregistnotactiveuser=新增未激活 | metrics.newregistnotactiveuser=新增未激活 | ||||
metrics.averageuser=平均新增用户 | metrics.averageuser=平均新增用户 | ||||
metrics.newuseractiveindex=新增用户激活率 | metrics.newuseractiveindex=新增用户激活率 | ||||
metrics.currentdayactivity=当日有贡献活动 | |||||
metrics.totalregistuser=累计注册用户 | metrics.totalregistuser=累计注册用户 | ||||
metrics.totalactiveduser=累计已激活 | metrics.totalactiveduser=累计已激活 | ||||
metrics.totalhasactivityuser=累计有贡献活动 | metrics.totalhasactivityuser=累计有贡献活动 | ||||
@@ -2955,6 +2959,7 @@ raw_minutes=分钟 | |||||
[dropzone] | [dropzone] | ||||
default_message=拖动文件或者点击此处上传。 | default_message=拖动文件或者点击此处上传。 | ||||
default_dataset_message=点击添加文件或直接拖拽文件到此处。 | |||||
invalid_input_type=您不能上传该类型的文件 | invalid_input_type=您不能上传该类型的文件 | ||||
file_too_big=文件体积({{filesize}} MB)超过了最大允许体积({{maxFilesize}} MB) | file_too_big=文件体积({{filesize}} MB)超过了最大允许体积({{maxFilesize}} MB) | ||||
remove_file=移除文件 | remove_file=移除文件 | ||||
@@ -5439,7 +5439,7 @@ | |||||
"gulp-tap": "^1.0.1", | "gulp-tap": "^1.0.1", | ||||
"gulp-uglify": "^3.0.1", | "gulp-uglify": "^3.0.1", | ||||
"inquirer": "^6.2.1", | "inquirer": "^6.2.1", | ||||
"jquery": "^3.4.0", | |||||
"jquery": "^3.5.1", | |||||
"less": "^3.7.0", | "less": "^3.7.0", | ||||
"map-stream": "^0.1.0", | "map-stream": "^0.1.0", | ||||
"merge-stream": "^2.0.0", | "merge-stream": "^2.0.0", | ||||
@@ -117,6 +117,7 @@ socket.onmessage = function (e) { | |||||
continue; | continue; | ||||
} | } | ||||
} | } | ||||
refresh3DInfo(record); | |||||
var recordPrefix = getMsg(record); | var recordPrefix = getMsg(record); | ||||
if(record.OpType == "6" || record.OpType == "10" || record.OpType == "12" || record.OpType == "13"){ | if(record.OpType == "6" || record.OpType == "10" || record.OpType == "12" || record.OpType == "13"){ | ||||
html += recordPrefix + actionName; | html += recordPrefix + actionName; | ||||
@@ -200,6 +201,29 @@ function getTaskLink(record){ | |||||
return re; | return re; | ||||
} | } | ||||
function refresh3DInfo(record){ | |||||
if(record.OpType == "25" || record.OpType == "29" || record.OpType == "31"){ | |||||
//cloudbrain one | |||||
var lines = $('.rotation3D__line'); | |||||
var span = $('.rotation3D__line').find("span")[0]; | |||||
console.log(span); | |||||
span.innerText =record.RefName; | |||||
//$('.rotation3D__line').find("span").eq(0).text(record.RefName) | |||||
console.log("cloudbrain one line length=" + lines.length); | |||||
//lines[0].find("span").text(record.RefName); | |||||
}else if(record.OpType == "26" || record.OpType == "27" || record.OpType == "28"){ | |||||
//cloudbrain two | |||||
var lines = $('.rotation3D__line'); | |||||
console.log("cloudbrain two line length=" + lines.length); | |||||
var span = $('.rotation3D__line').find("span")[1]; | |||||
console.log(span); | |||||
span.innerText =record.RefName; | |||||
//$('.rotation3D__line').find("span").eq(1).text(record.RefName) | |||||
//lines[1].find("span").text(record.RefName); | |||||
} | |||||
} | |||||
function getMsg(record){ | function getMsg(record){ | ||||
var html =""; | var html =""; | ||||
html += "<div class=\"swiper-slide item\">"; | html += "<div class=\"swiper-slide item\">"; | ||||
@@ -418,48 +442,57 @@ queryRecommendData(); | |||||
function queryRecommendData(){ | function queryRecommendData(){ | ||||
$.ajax({ | $.ajax({ | ||||
type:"GET", | type:"GET", | ||||
url:"/recommend/org", | |||||
url:"/recommend/home", | |||||
headers: { | headers: { | ||||
authorization:token, | authorization:token, | ||||
}, | }, | ||||
dataType:"json", | dataType:"json", | ||||
async:false, | async:false, | ||||
success:function(json){ | success:function(json){ | ||||
displayOrg(json); | |||||
displayOrg(json.org); | |||||
displayRepo(json.repo); | |||||
displayActivity(json.image); | |||||
displayCloudBrain(json.cloudbrain) | |||||
}, | }, | ||||
error:function(response) { | error:function(response) { | ||||
} | } | ||||
}); | }); | ||||
$.ajax({ | |||||
type:"GET", | |||||
url:"/recommend/repo", | |||||
headers: { | |||||
authorization:token, | |||||
}, | |||||
dataType:"json", | |||||
async:false, | |||||
success:function(json){ | |||||
displayRepo(json); | |||||
}, | |||||
error:function(response) { | |||||
} | |||||
}); | |||||
// $.ajax({ | |||||
// type:"GET", | |||||
// url:"/recommend/repo", | |||||
// headers: { | |||||
// authorization:token, | |||||
// }, | |||||
// dataType:"json", | |||||
// async:false, | |||||
// success:function(json){ | |||||
// displayRepo(json); | |||||
// }, | |||||
// error:function(response) { | |||||
// } | |||||
// }); | |||||
// $.ajax({ | |||||
// type:"GET", | |||||
// url:"/recommend/imageinfo", | |||||
// headers: { | |||||
// authorization:token, | |||||
// }, | |||||
// dataType:"json", | |||||
// async:false, | |||||
// success:function(json){ | |||||
// displayActivity(json); | |||||
// }, | |||||
// error:function(response) { | |||||
// } | |||||
// }); | |||||
} | |||||
$.ajax({ | |||||
type:"GET", | |||||
url:"/recommend/imageinfo", | |||||
headers: { | |||||
authorization:token, | |||||
}, | |||||
dataType:"json", | |||||
async:false, | |||||
success:function(json){ | |||||
displayActivity(json); | |||||
}, | |||||
error:function(response) { | |||||
} | |||||
}); | |||||
function displayCloudBrain(json){ | |||||
$('#completed_task').text(json.completed_task); | |||||
$('#running_task').text(json.running_task); | |||||
$('#wait_task').text(json.wait_task); | |||||
} | } | ||||
function displayActivity(json){ | function displayActivity(json){ | ||||
@@ -559,10 +559,12 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Get("/query_metrics_all", operationReq, repo_ext.QueryUserMetricsAll) | m.Get("/query_metrics_all", operationReq, repo_ext.QueryUserMetricsAll) | ||||
m.Get("/query_user_metrics_page", operationReq, repo_ext.QueryUserMetricDataPage) | m.Get("/query_user_metrics_page", operationReq, repo_ext.QueryUserMetricDataPage) | ||||
m.Get("/download_user_define_file", operationReq, repo_ext.DownloadUserDefineFile) | |||||
m.Get("/query_user_rank_list", operationReq, repo_ext.QueryRankingList) | m.Get("/query_user_rank_list", operationReq, repo_ext.QueryRankingList) | ||||
m.Get("/query_user_static_page", operationReq, repo_ext.QueryUserStaticDataPage) | m.Get("/query_user_static_page", operationReq, repo_ext.QueryUserStaticDataPage) | ||||
m.Get("/query_user_current_month", operationReq, repo_ext.QueryUserStaticCurrentMonth) | m.Get("/query_user_current_month", operationReq, repo_ext.QueryUserStaticCurrentMonth) | ||||
m.Get("/query_user_current_week", operationReq, repo_ext.QueryUserStaticCurrentWeek) | m.Get("/query_user_current_week", operationReq, repo_ext.QueryUserStaticCurrentWeek) | ||||
m.Get("/query_user_last_week", operationReq, repo_ext.QueryUserStaticLastWeek) | |||||
m.Get("/query_user_current_year", operationReq, repo_ext.QueryUserStaticCurrentYear) | m.Get("/query_user_current_year", operationReq, repo_ext.QueryUserStaticCurrentYear) | ||||
m.Get("/query_user_last30_day", operationReq, repo_ext.QueryUserStaticLast30Day) | m.Get("/query_user_last30_day", operationReq, repo_ext.QueryUserStaticLast30Day) | ||||
m.Get("/query_user_last_month", operationReq, repo_ext.QueryUserStaticLastMonth) | m.Get("/query_user_last_month", operationReq, repo_ext.QueryUserStaticLastMonth) | ||||
@@ -571,6 +573,9 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
//cloudbrain board | //cloudbrain board | ||||
m.Group("/cloudbrainboard", func() { | m.Group("/cloudbrainboard", func() { | ||||
m.Get("/downloadAll", repo.DownloadCloudBrainBoard) | m.Get("/downloadAll", repo.DownloadCloudBrainBoard) | ||||
m.Group("/cloudbrain", func() { | |||||
m.Get("/status_analysis", repo.GetCloudbrainsStatusAnalysis) | |||||
}) | |||||
}, operationReq) | }, operationReq) | ||||
// Users | // Users | ||||
m.Group("/users", func() { | m.Group("/users", func() { | ||||
@@ -11,6 +11,16 @@ import ( | |||||
"github.com/360EntSecGroup-Skylar/excelize/v2" | "github.com/360EntSecGroup-Skylar/excelize/v2" | ||||
) | ) | ||||
type CloudbrainsStatusAnalysis struct { | |||||
JobWaitingCount int64 `json:"jobWaitingCount"` | |||||
JobRunningCount int64 `json:"jobRunningCount"` | |||||
JobStoppedCount int64 `json:"jobStoppedCount"` | |||||
JobCompletedCount int64 `json:"jobCompletedCount"` | |||||
JobFailedCount int64 `json:"jobFailedCount"` | |||||
JobKilledCount int64 `json:"jobKilledCount"` | |||||
JobInitCount int64 `json:"jobInitCount"` | |||||
} | |||||
func DownloadCloudBrainBoard(ctx *context.Context) { | func DownloadCloudBrainBoard(ctx *context.Context) { | ||||
page := 1 | page := 1 | ||||
@@ -133,3 +143,9 @@ func getBrainWaitTime(rs *models.CloudbrainInfo) string { | |||||
return models.ConvertDurationToStr(int64(waitTime)) | return models.ConvertDurationToStr(int64(waitTime)) | ||||
} | } | ||||
} | } | ||||
func GetCloudbrainsStatusAnalysis(ctx *context.Context) { | |||||
cloudBrainStatusResult := models.GetAllStatusCloudBrain() | |||||
ctx.JSON(http.StatusOK, map[string]interface{}{ | |||||
"cloudBrainStatusResult": cloudBrainStatusResult, | |||||
}) | |||||
} |
@@ -7,6 +7,7 @@ package routers | |||||
import ( | import ( | ||||
"bytes" | "bytes" | ||||
"fmt" | |||||
"net/http" | "net/http" | ||||
"strconv" | "strconv" | ||||
"strings" | "strings" | ||||
@@ -99,6 +100,12 @@ func setRecommendURL(ctx *context.Context) { | |||||
func Dashboard(ctx *context.Context) { | func Dashboard(ctx *context.Context) { | ||||
if ctx.IsSigned { | if ctx.IsSigned { | ||||
pictureInfo, err := getImageInfo("dashboard-picture") | |||||
if err == nil && len(pictureInfo) > 0 { | |||||
log.Info("set image info=" + pictureInfo[0]["url"]) | |||||
ctx.Data["image_url"] = pictureInfo[0]["url"] | |||||
ctx.Data["image_link"] = pictureInfo[0]["image_link"] | |||||
} | |||||
if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | ||||
ctx.Data["Title"] = ctx.Tr("auth.active_your_account") | ctx.Data["Title"] = ctx.Tr("auth.active_your_account") | ||||
ctx.HTML(200, user.TplActivate) | ctx.HTML(200, user.TplActivate) | ||||
@@ -259,7 +266,11 @@ func ExploreRepos(ctx *context.Context) { | |||||
ctx.Data["PageIsExplore"] = true | ctx.Data["PageIsExplore"] = true | ||||
ctx.Data["PageIsExploreRepositories"] = true | ctx.Data["PageIsExploreRepositories"] = true | ||||
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled | ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled | ||||
pictureInfo, err := getImageInfo("explore-user-picture") | |||||
if err == nil && len(pictureInfo) > 0 { | |||||
ctx.Data["image_url"] = pictureInfo[0]["url"] | |||||
ctx.Data["image_link"] = pictureInfo[0]["image_link"] | |||||
} | |||||
var ownerID int64 | var ownerID int64 | ||||
if ctx.User != nil && !ctx.User.IsAdmin { | if ctx.User != nil && !ctx.User.IsAdmin { | ||||
ownerID = ctx.User.ID | ownerID = ctx.User.ID | ||||
@@ -434,7 +445,11 @@ func ExploreUsers(ctx *context.Context) { | |||||
ctx.Data["PageIsExplore"] = true | ctx.Data["PageIsExplore"] = true | ||||
ctx.Data["PageIsExploreUsers"] = true | ctx.Data["PageIsExploreUsers"] = true | ||||
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled | ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled | ||||
pictureInfo, err := getImageInfo("explore-user-picture") | |||||
if err == nil && len(pictureInfo) > 0 { | |||||
ctx.Data["image_url"] = pictureInfo[0]["url"] | |||||
ctx.Data["image_link"] = pictureInfo[0]["image_link"] | |||||
} | |||||
RenderUserSearch(ctx, &models.SearchUserOptions{ | RenderUserSearch(ctx, &models.SearchUserOptions{ | ||||
Actor: ctx.User, | Actor: ctx.User, | ||||
Type: models.UserTypeIndividual, | Type: models.UserTypeIndividual, | ||||
@@ -471,7 +486,7 @@ func ExploreOrganizations(ctx *context.Context) { | |||||
return | return | ||||
} | } | ||||
recommendOrgs, err := GetRecommendOrg() | |||||
recommendOrgs, err := getRecommendOrg() | |||||
if err != nil { | if err != nil { | ||||
log.Error("GetRecommendOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"]) | log.Error("GetRecommendOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"]) | ||||
ctx.ServerError("GetRecommendOrgInfos", err) | ctx.ServerError("GetRecommendOrgInfos", err) | ||||
@@ -606,31 +621,31 @@ func ExploreImages(ctx *context.Context) { | |||||
} | } | ||||
func ExploreDataAnalysisUserTrend(ctx *context.Context) { | func ExploreDataAnalysisUserTrend(ctx *context.Context) { | ||||
ctx.Data["url_params"]="UserTrend" | |||||
ctx.Data["url_params"] = "UserTrend" | |||||
ctx.HTML(200, tplExploreExploreDataAnalysis) | ctx.HTML(200, tplExploreExploreDataAnalysis) | ||||
} | } | ||||
func ExploreDataAnalysisUserAnalysis(ctx *context.Context) { | func ExploreDataAnalysisUserAnalysis(ctx *context.Context) { | ||||
ctx.Data["url_params"]="UserAnalysis" | |||||
ctx.Data["url_params"] = "UserAnalysis" | |||||
ctx.HTML(200, tplExploreExploreDataAnalysis) | ctx.HTML(200, tplExploreExploreDataAnalysis) | ||||
} | } | ||||
func ExploreDataAnalysisProTrend(ctx *context.Context) { | func ExploreDataAnalysisProTrend(ctx *context.Context) { | ||||
ctx.Data["url_params"]="ProTrend" | |||||
ctx.Data["url_params"] = "ProTrend" | |||||
ctx.HTML(200, tplExploreExploreDataAnalysis) | ctx.HTML(200, tplExploreExploreDataAnalysis) | ||||
} | } | ||||
func ExploreDataAnalysisProAnalysis(ctx *context.Context) { | func ExploreDataAnalysisProAnalysis(ctx *context.Context) { | ||||
ctx.Data["url_params"]="ProAnalysis" | |||||
ctx.Data["url_params"] = "ProAnalysis" | |||||
ctx.HTML(200, tplExploreExploreDataAnalysis) | ctx.HTML(200, tplExploreExploreDataAnalysis) | ||||
} | } | ||||
func ExploreDataAnalysisOverview(ctx *context.Context) { | func ExploreDataAnalysisOverview(ctx *context.Context) { | ||||
ctx.Data["url_params"]="Overview" | |||||
ctx.Data["url_params"] = "Overview" | |||||
ctx.HTML(200, tplExploreExploreDataAnalysis) | ctx.HTML(200, tplExploreExploreDataAnalysis) | ||||
} | } | ||||
func ExploreDataAnalysisBrainAnalysis(ctx *context.Context) { | func ExploreDataAnalysisBrainAnalysis(ctx *context.Context) { | ||||
ctx.Data["url_params"]="BrainAnalysis" | |||||
ctx.Data["url_params"] = "BrainAnalysis" | |||||
ctx.HTML(200, tplExploreExploreDataAnalysis) | ctx.HTML(200, tplExploreExploreDataAnalysis) | ||||
} | } | ||||
func ExploreDataAnalysis(ctx *context.Context) { | func ExploreDataAnalysis(ctx *context.Context) { | ||||
ctx.Data["url_params"]="" | |||||
ctx.Data["url_params"] = "" | |||||
ctx.HTML(200, tplExploreExploreDataAnalysis) | ctx.HTML(200, tplExploreExploreDataAnalysis) | ||||
} | } | ||||
@@ -640,7 +655,7 @@ func NotFound(ctx *context.Context) { | |||||
ctx.NotFound("home.NotFound", nil) | ctx.NotFound("home.NotFound", nil) | ||||
} | } | ||||
func GetRecommendOrg() ([]map[string]interface{}, error) { | |||||
func getRecommendOrg() ([]map[string]interface{}, error) { | |||||
url := setting.RecommentRepoAddr + "organizations" | url := setting.RecommentRepoAddr + "organizations" | ||||
result, err := repository.RecommendFromPromote(url) | result, err := repository.RecommendFromPromote(url) | ||||
@@ -668,17 +683,18 @@ func GetRecommendOrg() ([]map[string]interface{}, error) { | |||||
} | } | ||||
return resultOrg, nil | return resultOrg, nil | ||||
} | } | ||||
func GetImageInfo() ([]map[string]interface{}, error) { | |||||
url := setting.RecommentRepoAddr + "picture_info" | |||||
func getImageInfo(filename string) ([]map[string]string, error) { | |||||
url := setting.RecommentRepoAddr + filename | |||||
result, err := repository.RecommendFromPromote(url) | result, err := repository.RecommendFromPromote(url) | ||||
if err != nil { | if err != nil { | ||||
return nil, err | return nil, err | ||||
} | } | ||||
imageInfo := make([]map[string]interface{}, 0) | |||||
imageInfo := make([]map[string]string, 0) | |||||
for i := 0; i < (len(result) - 1); i++ { | for i := 0; i < (len(result) - 1); i++ { | ||||
line := result[i] | line := result[i] | ||||
imageMap := make(map[string]interface{}) | |||||
imageMap := make(map[string]string) | |||||
if line[0:4] == "url=" { | if line[0:4] == "url=" { | ||||
url := line[4:] | url := line[4:] | ||||
imageMap["url"] = url | imageMap["url"] = url | ||||
@@ -731,14 +747,14 @@ func GetRankUser(index string) ([]map[string]interface{}, error) { | |||||
return resultOrg, nil | return resultOrg, nil | ||||
} | } | ||||
func GetImageInfoFromPromote(ctx *context.Context) { | |||||
imageInfo, err := GetImageInfo() | |||||
if err != nil { | |||||
ctx.ServerError("500", err) | |||||
return | |||||
} | |||||
ctx.JSON(200, imageInfo) | |||||
} | |||||
// func GetImageInfoFromPromote(ctx *context.Context) { | |||||
// imageInfo, err := GetImageInfo() | |||||
// if err != nil { | |||||
// ctx.ServerError("500", err) | |||||
// return | |||||
// } | |||||
// ctx.JSON(200, imageInfo) | |||||
// } | |||||
func GetUserRankFromPromote(ctx *context.Context) { | func GetUserRankFromPromote(ctx *context.Context) { | ||||
index := ctx.Params("index") | index := ctx.Params("index") | ||||
@@ -750,15 +766,49 @@ func GetUserRankFromPromote(ctx *context.Context) { | |||||
ctx.JSON(200, resultUserRank) | ctx.JSON(200, resultUserRank) | ||||
} | } | ||||
func RecommendOrgFromPromote(ctx *context.Context) { | |||||
resultOrg, err := GetRecommendOrg() | |||||
func RecommendHomeInfo(ctx *context.Context) { | |||||
resultOrg, err := getRecommendOrg() | |||||
if err != nil { | if err != nil { | ||||
ctx.ServerError("500", err) | |||||
return | |||||
log.Info("error." + err.Error()) | |||||
} | |||||
resultRepo, err := repository.GetRecommendRepoFromPromote("projects") | |||||
if err != nil { | |||||
log.Info("error." + err.Error()) | |||||
} | |||||
resultImage, err := getImageInfo("picture_info") | |||||
if err != nil { | |||||
log.Info("error." + err.Error()) | |||||
} | } | ||||
ctx.JSON(200, resultOrg) | |||||
resultCloudBrain, err := getCloudbrainNums() | |||||
if err != nil { | |||||
log.Info("error." + err.Error()) | |||||
} | |||||
mapInterface := make(map[string]interface{}) | |||||
mapInterface["org"] = resultOrg | |||||
mapInterface["repo"] = resultRepo | |||||
mapInterface["image"] = resultImage | |||||
mapInterface["cloudbrain"] = resultCloudBrain | |||||
ctx.JSON(http.StatusOK, mapInterface) | |||||
} | } | ||||
func getCloudbrainNums() (map[string]string, error) { | |||||
result := make(map[string]string) | |||||
cloudStatusMap := models.GetAllStatusCloudBrain() | |||||
result["completed_task"] = fmt.Sprint(cloudStatusMap["COMPLETED"]) | |||||
result["running_task"] = fmt.Sprint(cloudStatusMap["RUNNING"]) | |||||
result["wait_task"] = fmt.Sprint(cloudStatusMap["WAITING"]) | |||||
return result, nil | |||||
} | |||||
// func RecommendOrgFromPromote(ctx *context.Context) { | |||||
// resultOrg, err := GetRecommendOrg() | |||||
// if err != nil { | |||||
// ctx.ServerError("500", err) | |||||
// return | |||||
// } | |||||
// ctx.JSON(200, resultOrg) | |||||
// } | |||||
func RecommendRepoFromPromote(ctx *context.Context) { | func RecommendRepoFromPromote(ctx *context.Context) { | ||||
result, err := repository.GetRecommendRepoFromPromote("projects") | result, err := repository.GetRecommendRepoFromPromote("projects") | ||||
if err != nil { | if err != nil { | ||||
@@ -902,16 +902,17 @@ func CompleteMultipart(ctx *context.Context) { | |||||
if err != nil { | if err != nil { | ||||
log.Error("SendDecompressTask(%s) failed:%s", uuid, err.Error()) | log.Error("SendDecompressTask(%s) failed:%s", uuid, err.Error()) | ||||
} else { | } else { | ||||
attachment.DecompressState = models.DecompressStateIng | |||||
err = models.UpdateAttachment(attachment) | |||||
if err != nil { | |||||
log.Error("UpdateAttachment state(%s) failed:%s", uuid, err.Error()) | |||||
} | |||||
updateAttachmentDecompressStateIng(attachment) | |||||
} | } | ||||
} | } | ||||
if typeCloudBrain == models.TypeCloudBrainTwo { | if typeCloudBrain == models.TypeCloudBrainTwo { | ||||
attachjson, _ := json.Marshal(attachment) | attachjson, _ := json.Marshal(attachment) | ||||
labelmsg.SendDecompressAttachToLabelOBS(string(attachjson)) | |||||
err = labelmsg.SendDecompressAttachToLabelOBS(string(attachjson)) | |||||
if err != nil { | |||||
log.Error("SendDecompressTask to labelsystem (%s) failed:%s", attachment.UUID, err.Error()) | |||||
} else { | |||||
updateAttachmentDecompressStateIng(attachment) | |||||
} | |||||
} | } | ||||
} else { | } else { | ||||
var labelMap map[string]string | var labelMap map[string]string | ||||
@@ -206,7 +206,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
ctx.Data["PageIsCloudBrain"] = true | ctx.Data["PageIsCloudBrain"] = true | ||||
displayJobName := form.DisplayJobName | displayJobName := form.DisplayJobName | ||||
jobName := util.ConvertDisplayJobNameToJobName(displayJobName) | jobName := util.ConvertDisplayJobNameToJobName(displayJobName) | ||||
image := form.Image | |||||
image := strings.TrimSpace(form.Image) | |||||
uuid := form.Attachment | uuid := form.Attachment | ||||
jobType := form.JobType | jobType := form.JobType | ||||
gpuQueue := form.GpuType | gpuQueue := form.GpuType | ||||
@@ -283,30 +283,6 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
mkModelPath(modelPath) | mkModelPath(modelPath) | ||||
uploadCodeToMinio(modelPath, jobName, cloudbrain.ModelMountPath+"/") | uploadCodeToMinio(modelPath, jobName, cloudbrain.ModelMountPath+"/") | ||||
benchmarkPath := setting.JobPath + jobName + cloudbrain.BenchMarkMountPath | |||||
if setting.IsBenchmarkEnabled && jobType == string(models.JobTypeBenchmark) { | |||||
var gpuType string | |||||
for _, gpuInfo := range gpuInfos.GpuInfo { | |||||
if gpuInfo.Queue == gpuQueue { | |||||
gpuType = gpuInfo.Value | |||||
} | |||||
} | |||||
downloadRateCode(repo, jobName, setting.BenchmarkOwner, setting.BenchmarkName, benchmarkPath, form.BenchmarkCategory, gpuType) | |||||
uploadCodeToMinio(benchmarkPath+"/", jobName, cloudbrain.BenchMarkMountPath+"/") | |||||
} | |||||
snn4imagenetPath := setting.JobPath + jobName + cloudbrain.Snn4imagenetMountPath | |||||
if setting.IsSnn4imagenetEnabled && jobType == string(models.JobTypeSnn4imagenet) { | |||||
downloadRateCode(repo, jobName, setting.Snn4imagenetOwner, setting.Snn4imagenetName, snn4imagenetPath, "", "") | |||||
uploadCodeToMinio(snn4imagenetPath+"/", jobName, cloudbrain.Snn4imagenetMountPath+"/") | |||||
} | |||||
brainScorePath := setting.JobPath + jobName + cloudbrain.BrainScoreMountPath | |||||
if setting.IsBrainScoreEnabled && jobType == string(models.JobTypeBrainScore) { | |||||
downloadRateCode(repo, jobName, setting.BrainScoreOwner, setting.BrainScoreName, brainScorePath, "", "") | |||||
uploadCodeToMinio(brainScorePath+"/", jobName, cloudbrain.BrainScoreMountPath+"/") | |||||
} | |||||
err = cloudbrain.GenerateTask(ctx, displayJobName, jobName, image, command, uuid, storage.GetMinioPath(jobName, cloudbrain.CodeMountPath+"/"), | err = cloudbrain.GenerateTask(ctx, displayJobName, jobName, image, command, uuid, storage.GetMinioPath(jobName, cloudbrain.CodeMountPath+"/"), | ||||
storage.GetMinioPath(jobName, cloudbrain.ModelMountPath+"/"), | storage.GetMinioPath(jobName, cloudbrain.ModelMountPath+"/"), | ||||
storage.GetMinioPath(jobName, cloudbrain.BenchMarkMountPath+"/"), storage.GetMinioPath(jobName, cloudbrain.Snn4imagenetMountPath+"/"), | storage.GetMinioPath(jobName, cloudbrain.BenchMarkMountPath+"/"), storage.GetMinioPath(jobName, cloudbrain.Snn4imagenetMountPath+"/"), | ||||
@@ -482,6 +458,17 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
ctx.Data["resource_type"] = resourceType.Value | ctx.Data["resource_type"] = resourceType.Value | ||||
} | } | ||||
} | } | ||||
} else if cloudbrain.IsBenchmarkJob(task.JobType) { | |||||
if benchmarkGpuInfos == nil { | |||||
json.Unmarshal([]byte(setting.BenchmarkGpuTypes), &benchmarkGpuInfos) | |||||
} | |||||
for _, resourceType := range benchmarkGpuInfos.GpuInfo { | |||||
if resourceType.Queue == jobRes.Config.GpuType { | |||||
ctx.Data["resource_type"] = resourceType.Value | |||||
} | |||||
} | |||||
} else { | } else { | ||||
if gpuInfos == nil { | if gpuInfos == nil { | ||||
json.Unmarshal([]byte(setting.GpuTypes), &gpuInfos) | json.Unmarshal([]byte(setting.GpuTypes), &gpuInfos) | ||||
@@ -1241,7 +1228,7 @@ func downloadCode(repo *models.Repository, codePath, branchName string) error { | |||||
return nil | return nil | ||||
} | } | ||||
func downloadRateCode(repo *models.Repository, taskName, rateOwnerName, rateRepoName, codePath, benchmarkCategory, gpuType string) error { | |||||
func downloadRateCode(repo *models.Repository, taskName, rateOwnerName, rateRepoName, codePath, benchmarkCategory, gpuType, userName string) error { | |||||
err := os.MkdirAll(codePath, os.ModePerm) | err := os.MkdirAll(codePath, os.ModePerm) | ||||
if err != nil { | if err != nil { | ||||
log.Error("mkdir codePath failed", err.Error()) | log.Error("mkdir codePath failed", err.Error()) | ||||
@@ -1269,7 +1256,7 @@ func downloadRateCode(repo *models.Repository, taskName, rateOwnerName, rateRepo | |||||
defer f.Close() | defer f.Close() | ||||
data, err := json.Marshal(models.TaskInfo{ | data, err := json.Marshal(models.TaskInfo{ | ||||
Username: repo.Owner.Name, | |||||
Username: userName, | |||||
TaskName: taskName, | TaskName: taskName, | ||||
CodeName: repo.Name, | CodeName: repo.Name, | ||||
BenchmarkCategory: strings.Split(benchmarkCategory, ","), | BenchmarkCategory: strings.Split(benchmarkCategory, ","), | ||||
@@ -1845,7 +1832,7 @@ func BenchMarkAlgorithmCreate(ctx *context.Context, form auth.CreateCloudBrainFo | |||||
ctx.Data["PageIsCloudBrain"] = true | ctx.Data["PageIsCloudBrain"] = true | ||||
displayJobName := form.DisplayJobName | displayJobName := form.DisplayJobName | ||||
jobName := util.ConvertDisplayJobNameToJobName(displayJobName) | jobName := util.ConvertDisplayJobNameToJobName(displayJobName) | ||||
image := form.Image | |||||
image := strings.TrimSpace(form.Image) | |||||
gpuQueue := form.GpuType | gpuQueue := form.GpuType | ||||
command := cloudbrain.CommandBenchmark | command := cloudbrain.CommandBenchmark | ||||
codePath := setting.JobPath + jobName + cloudbrain.CodeMountPath | codePath := setting.JobPath + jobName + cloudbrain.CodeMountPath | ||||
@@ -1970,7 +1957,7 @@ func BenchMarkAlgorithmCreate(ctx *context.Context, form auth.CreateCloudBrainFo | |||||
} | } | ||||
} | } | ||||
if err := downloadRateCode(repo, jobName, childInfo.Owner, childInfo.RepoName, benchmarkPath, form.BenchmarkCategory, gpuType); err != nil { | |||||
if err := downloadRateCode(repo, jobName, childInfo.Owner, childInfo.RepoName, benchmarkPath, form.BenchmarkCategory, gpuType, ctx.User.Name); err != nil { | |||||
log.Error("downloadRateCode failed, %v", err, ctx.Data["MsgID"]) | log.Error("downloadRateCode failed, %v", err, ctx.Data["MsgID"]) | ||||
//cloudBrainNewDataPrepare(ctx) | //cloudBrainNewDataPrepare(ctx) | ||||
//ctx.RenderWithErr("system error", tplCloudBrainBenchmarkNew, &form) | //ctx.RenderWithErr("system error", tplCloudBrainBenchmarkNew, &form) | ||||
@@ -2068,7 +2055,7 @@ func ModelBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainForm) | |||||
snn4imagenetPath := setting.JobPath + jobName + cloudbrain.Snn4imagenetMountPath | snn4imagenetPath := setting.JobPath + jobName + cloudbrain.Snn4imagenetMountPath | ||||
if setting.IsSnn4imagenetEnabled && jobType == string(models.JobTypeSnn4imagenet) { | if setting.IsSnn4imagenetEnabled && jobType == string(models.JobTypeSnn4imagenet) { | ||||
downloadRateCode(repo, jobName, setting.Snn4imagenetOwner, setting.Snn4imagenetName, snn4imagenetPath, "", "") | |||||
downloadRateCode(repo, jobName, setting.Snn4imagenetOwner, setting.Snn4imagenetName, snn4imagenetPath, "", "", ctx.User.Name) | |||||
uploadCodeToMinio(snn4imagenetPath+"/", jobName, cloudbrain.Snn4imagenetMountPath+"/") | uploadCodeToMinio(snn4imagenetPath+"/", jobName, cloudbrain.Snn4imagenetMountPath+"/") | ||||
command = fmt.Sprintf(cloudbrain.Snn4imagenetCommand, displayJobName, trimSpaceNewlineInString(form.Description)) | command = fmt.Sprintf(cloudbrain.Snn4imagenetCommand, displayJobName, trimSpaceNewlineInString(form.Description)) | ||||
@@ -2076,7 +2063,7 @@ func ModelBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainForm) | |||||
benchmarkChildTypeID := 0 | benchmarkChildTypeID := 0 | ||||
brainScorePath := setting.JobPath + jobName + cloudbrain.BrainScoreMountPath | brainScorePath := setting.JobPath + jobName + cloudbrain.BrainScoreMountPath | ||||
if setting.IsBrainScoreEnabled && jobType == string(models.JobTypeBrainScore) { | if setting.IsBrainScoreEnabled && jobType == string(models.JobTypeBrainScore) { | ||||
downloadRateCode(repo, jobName, setting.BrainScoreOwner, setting.BrainScoreName, brainScorePath, "", "") | |||||
downloadRateCode(repo, jobName, setting.BrainScoreOwner, setting.BrainScoreName, brainScorePath, "", "", ctx.User.Name) | |||||
uploadCodeToMinio(brainScorePath+"/", jobName, cloudbrain.BrainScoreMountPath+"/") | uploadCodeToMinio(brainScorePath+"/", jobName, cloudbrain.BrainScoreMountPath+"/") | ||||
benchmarkChildTypeID = form.BenchmarkChildTypeID | benchmarkChildTypeID = form.BenchmarkChildTypeID | ||||
command = fmt.Sprintf(cloudbrain.BrainScoreCommand, getBrainRegion(benchmarkChildTypeID), displayJobName, trimSpaceNewlineInString(form.Description)) | command = fmt.Sprintf(cloudbrain.BrainScoreCommand, getBrainRegion(benchmarkChildTypeID), displayJobName, trimSpaceNewlineInString(form.Description)) | ||||
@@ -2136,7 +2123,7 @@ func CloudBrainTrainJobNew(ctx *context.Context) { | |||||
func getTrainJobCommand(form auth.CreateCloudBrainForm) (string, error) { | func getTrainJobCommand(form auth.CreateCloudBrainForm) (string, error) { | ||||
var command string | var command string | ||||
bootFile := form.BootFile | |||||
bootFile := strings.TrimSpace(form.BootFile) | |||||
params := form.Params | params := form.Params | ||||
if !strings.HasSuffix(bootFile, ".py") { | if !strings.HasSuffix(bootFile, ".py") { | ||||
@@ -106,6 +106,8 @@ func DatasetIndex(ctx *context.Context) { | |||||
MustEnableDataset(ctx) | MustEnableDataset(ctx) | ||||
ctx.Data["PageIsDataset"] = true | ctx.Data["PageIsDataset"] = true | ||||
ctx.Data["SortType"] = ctx.Query("sort") | |||||
repo := ctx.Repo.Repository | repo := ctx.Repo.Repository | ||||
dataset, err := models.GetDatasetByRepo(repo) | dataset, err := models.GetDatasetByRepo(repo) | ||||
@@ -128,9 +130,31 @@ func DatasetIndex(ctx *context.Context) { | |||||
attachments := newFilterPrivateAttachments(ctx, dataset.Attachments, repo) | attachments := newFilterPrivateAttachments(ctx, dataset.Attachments, repo) | ||||
sort.Slice(attachments, func(i, j int) bool { | |||||
return attachments[i].CreatedUnix > attachments[j].CreatedUnix | |||||
}) | |||||
if ctx.Data["SortType"] == "nameAsc" { | |||||
sort.Slice(attachments, func(i, j int) bool { | |||||
return strings.ToLower(attachments[i].Name) < strings.ToLower(attachments[j].Name) | |||||
}) | |||||
} else if ctx.Data["SortType"] == "nameDesc" { | |||||
sort.Slice(attachments, func(i, j int) bool { | |||||
return strings.ToLower(attachments[i].Name) > strings.ToLower(attachments[j].Name) | |||||
}) | |||||
} else if ctx.Data["SortType"] == "sizeAsc" { | |||||
sort.Slice(attachments, func(i, j int) bool { | |||||
return attachments[i].Size < attachments[j].Size | |||||
}) | |||||
} else if ctx.Data["SortType"] == "sizeDesc" { | |||||
sort.Slice(attachments, func(i, j int) bool { | |||||
return attachments[i].Size > attachments[j].Size | |||||
}) | |||||
} else if ctx.Data["SortType"] == "timeAsc" { | |||||
sort.Slice(attachments, func(i, j int) bool { | |||||
return attachments[i].CreatedUnix < attachments[j].CreatedUnix | |||||
}) | |||||
} else { | |||||
sort.Slice(attachments, func(i, j int) bool { | |||||
return attachments[i].CreatedUnix > attachments[j].CreatedUnix | |||||
}) | |||||
} | |||||
page := ctx.QueryInt("page") | page := ctx.QueryInt("page") | ||||
if page <= 0 { | if page <= 0 { | ||||
@@ -967,7 +967,7 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||||
description := form.Description | description := form.Description | ||||
workServerNumber := form.WorkServerNumber | workServerNumber := form.WorkServerNumber | ||||
engineID := form.EngineID | engineID := form.EngineID | ||||
bootFile := form.BootFile | |||||
bootFile := strings.TrimSpace(form.BootFile) | |||||
flavorCode := form.Flavor | flavorCode := form.Flavor | ||||
params := form.Params | params := form.Params | ||||
poolID := form.PoolID | poolID := form.PoolID | ||||
@@ -1210,7 +1210,7 @@ func TrainJobCreateVersion(ctx *context.Context, form auth.CreateModelArtsTrainJ | |||||
description := form.Description | description := form.Description | ||||
workServerNumber := form.WorkServerNumber | workServerNumber := form.WorkServerNumber | ||||
engineID := form.EngineID | engineID := form.EngineID | ||||
bootFile := form.BootFile | |||||
bootFile := strings.TrimSpace(form.BootFile) | |||||
flavorCode := form.Flavor | flavorCode := form.Flavor | ||||
params := form.Params | params := form.Params | ||||
poolID := form.PoolID | poolID := form.PoolID | ||||
@@ -1284,7 +1284,7 @@ func TrainJobCreateVersion(ctx *context.Context, form auth.CreateModelArtsTrainJ | |||||
var parameters models.Parameters | var parameters models.Parameters | ||||
param := make([]models.Parameter, 0) | param := make([]models.Parameter, 0) | ||||
existDeviceTarget := true | |||||
existDeviceTarget := false | |||||
if len(params) != 0 { | if len(params) != 0 { | ||||
err := json.Unmarshal([]byte(params), ¶meters) | err := json.Unmarshal([]byte(params), ¶meters) | ||||
if err != nil { | if err != nil { | ||||
@@ -1471,8 +1471,8 @@ func obsMkdir(dir string) error { | |||||
} | } | ||||
func paramCheckCreateTrainJob(form auth.CreateModelArtsTrainJobForm) error { | func paramCheckCreateTrainJob(form auth.CreateModelArtsTrainJobForm) error { | ||||
if !strings.HasSuffix(form.BootFile, ".py") { | |||||
log.Error("the boot file(%s) must be a python file", form.BootFile) | |||||
if !strings.HasSuffix(strings.TrimSpace(form.BootFile), ".py") { | |||||
log.Error("the boot file(%s) must be a python file", strings.TrimSpace(form.BootFile)) | |||||
return errors.New("启动文件必须是python文件") | return errors.New("启动文件必须是python文件") | ||||
} | } | ||||
@@ -1489,8 +1489,8 @@ func paramCheckCreateTrainJob(form auth.CreateModelArtsTrainJobForm) error { | |||||
} | } | ||||
func paramCheckCreateInferenceJob(form auth.CreateModelArtsInferenceJobForm) error { | func paramCheckCreateInferenceJob(form auth.CreateModelArtsInferenceJobForm) error { | ||||
if !strings.HasSuffix(form.BootFile, ".py") { | |||||
log.Error("the boot file(%s) must be a python file", form.BootFile) | |||||
if !strings.HasSuffix(strings.TrimSpace(form.BootFile), ".py") { | |||||
log.Error("the boot file(%s) must be a python file", strings.TrimSpace(form.BootFile)) | |||||
return errors.New("启动文件必须是python文件") | return errors.New("启动文件必须是python文件") | ||||
} | } | ||||
@@ -1803,7 +1803,7 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||||
description := form.Description | description := form.Description | ||||
workServerNumber := form.WorkServerNumber | workServerNumber := form.WorkServerNumber | ||||
engineID := form.EngineID | engineID := form.EngineID | ||||
bootFile := form.BootFile | |||||
bootFile := strings.TrimSpace(form.BootFile) | |||||
flavorCode := form.Flavor | flavorCode := form.Flavor | ||||
params := form.Params | params := form.Params | ||||
poolID := form.PoolID | poolID := form.PoolID | ||||
@@ -4,6 +4,7 @@ import ( | |||||
"fmt" | "fmt" | ||||
"net/http" | "net/http" | ||||
"net/url" | "net/url" | ||||
"os" | |||||
"time" | "time" | ||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
@@ -16,7 +17,8 @@ import ( | |||||
) | ) | ||||
const ( | const ( | ||||
PAGE_SIZE = 2000 | |||||
PAGE_SIZE = 2000 | |||||
Excel_File_Path = "/useranalysis/" | |||||
) | ) | ||||
func getUserMetricsExcelHeader(ctx *context.Context) map[string]string { | func getUserMetricsExcelHeader(ctx *context.Context) map[string]string { | ||||
@@ -27,6 +29,7 @@ func getUserMetricsExcelHeader(ctx *context.Context) map[string]string { | |||||
excelHeader = append(excelHeader, ctx.Tr("user.metrics.hasactivateuser")) | excelHeader = append(excelHeader, ctx.Tr("user.metrics.hasactivateuser")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistnotactiveuser")) | excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistnotactiveuser")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.metrics.newuseractiveindex")) | excelHeader = append(excelHeader, ctx.Tr("user.metrics.newuseractiveindex")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.metrics.currentdayactivity")) | |||||
excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalregistuser")) | excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalregistuser")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalactiveduser")) | excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalactiveduser")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalhasactivityuser")) | excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalhasactivityuser")) | ||||
@@ -65,6 +68,10 @@ func writeUserMetricsExcel(row int, xlsx *excelize.File, sheetName string, userM | |||||
} | } | ||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, value) | xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, value) | ||||
tmp = tmp + 1 | tmp = tmp + 1 | ||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.HasActivityUser) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalUser) | xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalUser) | ||||
tmp = tmp + 1 | tmp = tmp + 1 | ||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalActivateRegistUser) | xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalActivateRegistUser) | ||||
@@ -104,6 +111,9 @@ func getExcelHeader(ctx *context.Context) map[string]string { | |||||
excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedImage")) | excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedImage")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendImage")) | excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendImage")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.static.email")) | |||||
excelHeader = append(excelHeader, ctx.Tr("user.static.location")) | |||||
excelHeader = append(excelHeader, ctx.Tr("user.static.registdate")) | excelHeader = append(excelHeader, ctx.Tr("user.static.registdate")) | ||||
excelHeader = append(excelHeader, ctx.Tr("user.static.countdate")) | excelHeader = append(excelHeader, ctx.Tr("user.static.countdate")) | ||||
@@ -179,6 +189,13 @@ func writeExcel(row int, xlsx *excelize.File, sheetName string, userRecord *mode | |||||
tmp = tmp + 1 | tmp = tmp + 1 | ||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendImage) | xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendImage) | ||||
tmp = tmp + 1 | tmp = tmp + 1 | ||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Email) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.UserLocation) | |||||
tmp = tmp + 1 | |||||
formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05") | formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05") | ||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3]) | xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3]) | ||||
tmp = tmp + 1 | tmp = tmp + 1 | ||||
@@ -186,6 +203,82 @@ func writeExcel(row int, xlsx *excelize.File, sheetName string, userRecord *mode | |||||
formatTime = userRecord.DataDate | formatTime = userRecord.DataDate | ||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime) | xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime) | ||||
} | } | ||||
func writeExcelPage(row int, xlsx *excelize.File, sheetName string, userRecord *models.UserBusinessAnalysis) { | |||||
rows := fmt.Sprint(row) | |||||
var tmp byte | |||||
tmp = 0 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.ID) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Name) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.UserIndex)) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.UserIndexPrimitive)) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CodeMergeCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.IssueCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommentCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.FocusRepoCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.StarRepoCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.LoginCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.WatchedCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitCodeSize) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.SolveIssueCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.EncyclopediasCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CreateRepoCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.OpenIIndex)) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CloudBrainTaskNum) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", float64(userRecord.CloudBrainRunTime)/3600)) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitDatasetNum) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitModelCount) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.FocusOtherUser) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectDataset) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectedDataset) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendDataset) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectImage) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectedImage) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendImage) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Email) | |||||
tmp = tmp + 1 | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.UserLocation) | |||||
tmp = tmp + 1 | |||||
formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05") | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3]) | |||||
tmp = tmp + 1 | |||||
formatTime = userRecord.DataDate | |||||
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime) | |||||
} | |||||
func getColumn(tmp byte) string { | func getColumn(tmp byte) string { | ||||
var tmpA byte | var tmpA byte | ||||
tmpA = 'A' | tmpA = 'A' | ||||
@@ -330,6 +423,23 @@ func QueryRankingList(ctx *context.Context) { | |||||
ctx.JSON(http.StatusOK, mapInterface) | ctx.JSON(http.StatusOK, mapInterface) | ||||
} | } | ||||
func DownloadUserDefineFile(ctx *context.Context) { | |||||
filename := ctx.Query("filename") | |||||
length := len(filename) | |||||
if filename[0:1] == "\"" { | |||||
filename = filename[1 : length-1] | |||||
} | |||||
allFilename := setting.AppDataPath + Excel_File_Path + filename | |||||
log.Info("allFilename=" + allFilename) | |||||
_, err := os.Stat(allFilename) | |||||
if err != nil { //文件不存在 | |||||
log.Info("file not exist.") | |||||
ctx.JSON(http.StatusOK, "File Not Exist.") | |||||
} else { | |||||
ctx.ServeFile(allFilename, url.QueryEscape(filename)) | |||||
} | |||||
} | |||||
func QueryUserMetricsCurrentMonth(ctx *context.Context) { | func QueryUserMetricsCurrentMonth(ctx *context.Context) { | ||||
currentTimeNow := time.Now() | currentTimeNow := time.Now() | ||||
@@ -365,6 +475,10 @@ func QueryUserMetricsCurrentWeek(ctx *context.Context) { | |||||
func QueryUserStaticCurrentWeek(ctx *context.Context) { | func QueryUserStaticCurrentWeek(ctx *context.Context) { | ||||
queryUserDataPage(ctx, "public.user_business_analysis_current_week", new(models.UserBusinessAnalysisCurrentWeek)) | queryUserDataPage(ctx, "public.user_business_analysis_current_week", new(models.UserBusinessAnalysisCurrentWeek)) | ||||
} | } | ||||
func QueryUserStaticLastWeek(ctx *context.Context) { | |||||
queryUserDataPage(ctx, "public.user_business_analysis_last_week", new(models.UserBusinessAnalysisLastWeek)) | |||||
} | |||||
func QueryUserMetricsCurrentYear(ctx *context.Context) { | func QueryUserMetricsCurrentYear(ctx *context.Context) { | ||||
currentTimeNow := time.Now() | currentTimeNow := time.Now() | ||||
pageStartTime := time.Date(currentTimeNow.Year(), 1, 1, 0, 0, 0, 0, currentTimeNow.Location()) | pageStartTime := time.Date(currentTimeNow.Year(), 1, 1, 0, 0, 0, 0, currentTimeNow.Location()) | ||||
@@ -450,14 +564,13 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
endTime = time.Now() | endTime = time.Now() | ||||
} else { | } else { | ||||
startTime, _ = time.ParseInLocation("2006-01-02", startDate, time.Local) | startTime, _ = time.ParseInLocation("2006-01-02", startDate, time.Local) | ||||
startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 12, 0, 0, 0, startTime.Location()) | |||||
startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, startTime.Location()) | |||||
settingStartTime, _ := time.Parse("2006-01-02", setting.RadarMap.RecordBeginTime) | settingStartTime, _ := time.Parse("2006-01-02", setting.RadarMap.RecordBeginTime) | ||||
if startTime.Unix() < settingStartTime.Unix() { | if startTime.Unix() < settingStartTime.Unix() { | ||||
startTime = settingStartTime | startTime = settingStartTime | ||||
startDate = settingStartTime.Format("2006-01-02") | startDate = settingStartTime.Format("2006-01-02") | ||||
} | } | ||||
endTime, _ = time.ParseInLocation("2006-01-02", endDate, time.Local) | endTime, _ = time.ParseInLocation("2006-01-02", endDate, time.Local) | ||||
endTime = endTime.AddDate(0, 0, 1) | |||||
endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 0, startTime.Location()) | endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 0, startTime.Location()) | ||||
isAll = false | isAll = false | ||||
@@ -481,36 +594,14 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
} | } | ||||
if IsReturnFile { | if IsReturnFile { | ||||
re, count := models.QueryUserStaticDataAll(pageOpts) | |||||
log.Info("return count=" + fmt.Sprint(count)) | |||||
//writer exec file. | |||||
xlsx := excelize.NewFile() | |||||
//re, count := models.QueryUserStaticDataAll(pageOpts) | |||||
wikiMap, _ := queryWikiCountMap(startTime, endTime) | |||||
re, count := models.QueryUserStaticDataForUserDefine(pageOpts, wikiMap) | |||||
sheetName := ctx.Tr("user.static.sheetname") | sheetName := ctx.Tr("user.static.sheetname") | ||||
index := xlsx.NewSheet(sheetName) | |||||
xlsx.DeleteSheet("Sheet1") | |||||
dataHeader := getExcelHeader(ctx) | |||||
for k, v := range dataHeader { | |||||
//设置单元格的值 | |||||
xlsx.SetCellValue(sheetName, k, v) | |||||
} | |||||
for i, userRecord := range re { | |||||
row := i + 2 | |||||
writeExcel(row, xlsx, sheetName, userRecord) | |||||
} | |||||
//设置默认打开的表单 | |||||
xlsx.SetActiveSheet(index) | |||||
filename := sheetName + "_" + ctx.Tr("user.static.all") + ".xlsx" | |||||
ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename)) | |||||
ctx.Resp.Header().Set("Content-Type", "application/octet-stream") | |||||
if _, err := xlsx.WriteTo(ctx.Resp); err != nil { | |||||
log.Info("writer exel error." + err.Error()) | |||||
} | |||||
filename := sheetName + "_" + startDate + "_" + endDate + ".xlsx" | |||||
os.Remove(setting.AppDataPath + Excel_File_Path + filename) | |||||
go writeFileToDisk(ctx, count, re, filename) | |||||
ctx.JSON(http.StatusOK, ctx.Tr("user.static.downloadinfo")+setting.AppURL+"api/v1/download_user_define_file?filename="+filename) | |||||
} else { | } else { | ||||
mapInterface := make(map[string]interface{}) | mapInterface := make(map[string]interface{}) | ||||
re, count := models.QueryUserStaticDataPage(pageOpts) | re, count := models.QueryUserStaticDataPage(pageOpts) | ||||
@@ -520,22 +611,47 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
} | } | ||||
} | } | ||||
func TimingCountDataByDateAndReCount(date string, isReCount bool) { | |||||
func writeFileToDisk(ctx *context.Context, count int64, re []*models.UserBusinessAnalysis, filename string) { | |||||
log.Info("return count=" + fmt.Sprint(count)) | |||||
//writer exec file. | |||||
xlsx := excelize.NewFile() | |||||
sheetName := ctx.Tr("user.static.sheetname") | |||||
index := xlsx.NewSheet(sheetName) | |||||
xlsx.DeleteSheet("Sheet1") | |||||
dataHeader := getExcelHeader(ctx) | |||||
for k, v := range dataHeader { | |||||
//设置单元格的值 | |||||
xlsx.SetCellValue(sheetName, k, v) | |||||
} | |||||
t, _ := time.Parse("2006-01-02", date) | |||||
startTime := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) | |||||
for i, userRecord := range re { | |||||
row := i + 2 | |||||
writeExcelPage(row, xlsx, sheetName, userRecord) | |||||
} | |||||
endTime := time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 0, t.Location()) | |||||
//设置默认打开的表单 | |||||
xlsx.SetActiveSheet(index) | |||||
//query wiki data | |||||
log.Info("start to time count data") | |||||
//ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename)) | |||||
//ctx.Resp.Header().Set("Content-Type", "application/octet-stream") | |||||
filename = setting.AppDataPath + Excel_File_Path + filename | |||||
os.Mkdir(setting.AppDataPath+Excel_File_Path, 0755) | |||||
if err := xlsx.SaveAs(filename); err != nil { | |||||
log.Info("writer exel error." + err.Error()) | |||||
} else { | |||||
log.Info("write to file succeed, filepath=" + filename) | |||||
} | |||||
} | |||||
func queryWikiCountMap(startTime time.Time, endTime time.Time) (map[string]int, error) { | |||||
wikiMap := make(map[string]int) | wikiMap := make(map[string]int) | ||||
warnEmailMessage := "用户统计信息入库失败,请尽快定位。" | warnEmailMessage := "用户统计信息入库失败,请尽快定位。" | ||||
repoList, err := models.GetAllRepositories() | repoList, err := models.GetAllRepositories() | ||||
if err != nil { | if err != nil { | ||||
log.Error("query repo error." + err.Error()) | log.Error("query repo error." + err.Error()) | ||||
mailer.SendWarnNotifyMail(setting.Warn_Notify_Mails, warnEmailMessage) | mailer.SendWarnNotifyMail(setting.Warn_Notify_Mails, warnEmailMessage) | ||||
return | |||||
return nil, err | |||||
} | } | ||||
log.Info("start to query wiki data") | log.Info("start to query wiki data") | ||||
for _, repoRecord := range repoList { | for _, repoRecord := range repoList { | ||||
@@ -543,7 +659,7 @@ func TimingCountDataByDateAndReCount(date string, isReCount bool) { | |||||
time, err := git.GetLatestCommitTime(wikiPath) | time, err := git.GetLatestCommitTime(wikiPath) | ||||
if err == nil { | if err == nil { | ||||
log.Info("last commit time:" + time.Format("2006-01-02 15:04:05") + " wikiPath=" + wikiPath) | log.Info("last commit time:" + time.Format("2006-01-02 15:04:05") + " wikiPath=" + wikiPath) | ||||
if time.After(startTime) { | |||||
if time.After(startTime) && time.Before(endTime) { | |||||
wikiRepo, _, err := FindWikiRepoCommitByWikiPath(wikiPath) | wikiRepo, _, err := FindWikiRepoCommitByWikiPath(wikiPath) | ||||
if err != nil { | if err != nil { | ||||
log.Error("wiki not exist. wikiPath=" + wikiPath) | log.Error("wiki not exist. wikiPath=" + wikiPath) | ||||
@@ -568,14 +684,29 @@ func TimingCountDataByDateAndReCount(date string, isReCount bool) { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
return wikiMap, nil | |||||
} | |||||
func TimingCountDataByDateAndReCount(date string, isReCount bool) { | |||||
t, _ := time.Parse("2006-01-02", date) | |||||
startTime := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) | |||||
startTime = startTime.UTC() | |||||
endTime := time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 0, t.Location()) | |||||
endTime = endTime.UTC() | |||||
log.Info("startTime time:" + startTime.Format("2006-01-02 15:04:05")) | |||||
log.Info("endTime time:" + endTime.Format("2006-01-02 15:04:05")) | |||||
warnEmailMessage := "用户统计信息入库失败,请尽快定位。" | |||||
//query wiki data | |||||
log.Info("start to time count data") | |||||
wikiMap, err := queryWikiCountMap(startTime, endTime) | |||||
//other user info data | //other user info data | ||||
err = models.CounDataByDateAndReCount(wikiMap, startTime, endTime, isReCount) | err = models.CounDataByDateAndReCount(wikiMap, startTime, endTime, isReCount) | ||||
if err != nil { | if err != nil { | ||||
log.Error("count user info error." + err.Error()) | log.Error("count user info error." + err.Error()) | ||||
mailer.SendWarnNotifyMail(setting.Warn_Notify_Mails, warnEmailMessage) | mailer.SendWarnNotifyMail(setting.Warn_Notify_Mails, warnEmailMessage) | ||||
} | } | ||||
log.Info("start to count all user info data") | |||||
//models.RefreshUserStaticAllTabel(wikiMap) | |||||
log.Info("end to count all user info data") | log.Info("end to count all user info data") | ||||
} | } | ||||
@@ -323,10 +323,11 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Get("/dashboard", routers.Dashboard) | m.Get("/dashboard", routers.Dashboard) | ||||
go routers.SocketManager.Run() | go routers.SocketManager.Run() | ||||
m.Get("/action/notification", routers.ActionNotification) | m.Get("/action/notification", routers.ActionNotification) | ||||
m.Get("/recommend/org", routers.RecommendOrgFromPromote) | |||||
m.Get("/recommend/repo", routers.RecommendRepoFromPromote) | |||||
m.Get("/recommend/home", routers.RecommendHomeInfo) | |||||
//m.Get("/recommend/org", routers.RecommendOrgFromPromote) | |||||
//m.Get("/recommend/repo", routers.RecommendRepoFromPromote) | |||||
m.Get("/recommend/userrank/:index", routers.GetUserRankFromPromote) | m.Get("/recommend/userrank/:index", routers.GetUserRankFromPromote) | ||||
m.Get("/recommend/imageinfo", routers.GetImageInfoFromPromote) | |||||
//m.Get("/recommend/imageinfo", routers.GetImageInfoFromPromote) | |||||
m.Post("/all/search/", routers.Search) | m.Post("/all/search/", routers.Search) | ||||
m.Get("/all/search/", routers.EmptySearch) | m.Get("/all/search/", routers.EmptySearch) | ||||
m.Get("/all/dosearch/", routers.SearchApi) | m.Get("/all/dosearch/", routers.SearchApi) | ||||
@@ -12,7 +12,10 @@ | |||||
{{template "base/footer_content" .}} | {{template "base/footer_content" .}} | ||||
<script src="{{StaticUrlPrefix}}/js/jquery.js?v={{MD5 AppVer}}"></script> | |||||
{{if .RequireSimpleMDE}} | {{if .RequireSimpleMDE}} | ||||
<script src="{{StaticUrlPrefix}}/vendor/plugins/simplemde/simplemde.min.js"></script> | <script src="{{StaticUrlPrefix}}/vendor/plugins/simplemde/simplemde.min.js"></script> | ||||
<script src="{{StaticUrlPrefix}}/vendor/plugins/codemirror/addon/mode/loadmode.js"></script> | <script src="{{StaticUrlPrefix}}/vendor/plugins/codemirror/addon/mode/loadmode.js"></script> | ||||
@@ -37,15 +40,17 @@ | |||||
{{if .RequireTribute}} | {{if .RequireTribute}} | ||||
<script src="{{StaticUrlPrefix}}/vendor/plugins/tribute/tribute.min.js"></script> | <script src="{{StaticUrlPrefix}}/vendor/plugins/tribute/tribute.min.js"></script> | ||||
{{end}} | {{end}} | ||||
<script src="{{StaticUrlPrefix}}/js/jquery.js?v={{MD5 AppVer}}"></script> | |||||
<script src="{{StaticUrlPrefix}}/fomantic/semantic.min.js?v={{MD5 AppVer}}"></script> | <script src="{{StaticUrlPrefix}}/fomantic/semantic.min.js?v={{MD5 AppVer}}"></script> | ||||
<script src="{{StaticUrlPrefix}}/js/index.js?v={{MD5 AppVer}}"></script> | <script src="{{StaticUrlPrefix}}/js/index.js?v={{MD5 AppVer}}"></script> | ||||
{{template "custom/footer" .}} | {{template "custom/footer" .}} | ||||
{{if .PageIsHome}} | {{if .PageIsHome}} | ||||
<script src="/home/home.js?v={{MD5 AppVer}}" type="text/javascript"></script> | |||||
<script src="{{StaticUrlPrefix}}/vendor/plugins/jquery.particleground/jquery.particleground.min.js"></script> | <script src="{{StaticUrlPrefix}}/vendor/plugins/jquery.particleground/jquery.particleground.min.js"></script> | ||||
<!-- rotation3D --> | |||||
<script src="/rotation3D/jquery-3.5.0.min.js"></script> | |||||
<script src="/rotation3D/vue-2.6.10.min.js"></script> | <script src="/rotation3D/vue-2.6.10.min.js"></script> | ||||
<script src="/rotation3D/rotation3D.js"></script> | |||||
<script src="/rotation3D/rotation3D.js?v={{MD5 AppVer}}"></script> | |||||
<script> | <script> | ||||
var app = new Vue({ | var app = new Vue({ | ||||
el: "#app", | el: "#app", | ||||
@@ -79,5 +84,6 @@ | |||||
}); | }); | ||||
</script> | </script> | ||||
{{end}} | {{end}} | ||||
</body> | </body> | ||||
</html> | </html> |
@@ -1,4 +1,4 @@ | |||||
<a href="https://openi.org.cn/index.php?m=content&c=index&a=lists&catid=208" target="_blank"><img class="ui mini image" src="https://openi.org.cn/uploadfile/2022/0507/e8bdd42ed598f12.jpg" style="width:100%;"></a> | |||||
<a href="{{.image_link}}" target="_blank"><img class="ui mini image" src="{{.image_url}}" style="width:100%;"></a> | |||||
<div class="ui secondary pointing menu"> | <div class="ui secondary pointing menu"> | ||||
<div class="active item"> | <div class="active item"> | ||||
@@ -2,12 +2,12 @@ | |||||
<div class="ui vertical masthead secondary hometop segment"> | <div class="ui vertical masthead secondary hometop segment"> | ||||
<div class="ui container" style="position: relative;"> | <div class="ui container" style="position: relative;"> | ||||
<div id="app" v-cloak> | <div id="app" v-cloak> | ||||
<!--数据--> | |||||
<!--数据 | |||||
<div class="aiData"> | <div class="aiData"> | ||||
<p>完成AI任务<br><strong>1716</strong></p> | |||||
<p>运行AI任务<br><strong>120</strong></p> | |||||
<p>等待AI任务<br><strong>80</strong></p> | |||||
</div> | |||||
<p>完成AI任务<br><strong id="completed_task">1716</strong></p> | |||||
<p>运行AI任务<br><strong id="running_task">120</strong></p> | |||||
<p>等待AI任务<br><strong id="wait_task">80</strong></p> | |||||
</div>--> | |||||
<!--底座--> | <!--底座--> | ||||
<div class="rotation3D-baseMap"></div> | <div class="rotation3D-baseMap"></div> | ||||
<!--旋转3D--> | <!--旋转3D--> | ||||
@@ -226,8 +226,7 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="am-mt-30"></div> | <div class="am-mt-30"></div> | ||||
<script src="/self/js/jquery.min.js" type="text/javascript"></script> | |||||
<script src="/home/home.js?v={{MD5 AppVer}}" type="text/javascript"></script> | |||||
{{template "base/footer" .}} | {{template "base/footer" .}} |
@@ -1,60 +1,58 @@ | |||||
{{template "base/head" .}} | {{template "base/head" .}} | ||||
<div class="repository"> | <div class="repository"> | ||||
{{template "repo/header" .}} | |||||
{{template "repo/header" .}} | |||||
<div class="ui container"> | <div class="ui container"> | ||||
<input type="hidden" id="postPath" value="{{.Link}}"> | <input type="hidden" id="postPath" value="{{.Link}}"> | ||||
<div style="width: 80%;margin: auto;"> | <div style="width: 80%;margin: auto;"> | ||||
<h4 class="ui top attached header"> | |||||
{{$.i18n.Tr "dataset.upload_dataset_file"}} | |||||
</h4> | |||||
<div class="ui attached segment" style="padding: 2em 3em;"> | |||||
<div class="ui form" id="dataset-base"> | |||||
<el-form label-width="140px"> | |||||
{{.CsrfTokenHtml}} | |||||
<el-form-item label='{{$.i18n.Tr "dataset.dataset_available_clusters"}}:' prop="title"> | |||||
<el-button :class="{active:type==0}" :disabled="clusterFlag" size="small" style="margin: 0;border-radius: 0.28571429rem 0 0 0.28571429rem;" @click="uploadGpu">CPU/GPU</el-button> | |||||
<el-button :class="{active:type==1}" :disabled="clusterFlag" size="small" style="margin: 0 0 0 -4px;border-radius: 0 0.28571429rem 0.28571429rem 0;" @click="uploadNpu">NPU</el-button> | |||||
</el-form-item> | |||||
<el-form-item label='{{$.i18n.Tr "dataset.file_description"}}:' prop="description"> | |||||
<el-input type="textarea" :rows="3" maxlength="255" placeholder="{{$.i18n.Tr "repo.modelarts.train_job.new_place"}}" v-model="desc"></el-input> | |||||
</el-form-item> | |||||
<el-form-item label='{{$.i18n.Tr "dataset.data_upload"}}:' prop="category"> | |||||
<h4 class="ui top attached header"> | |||||
{{$.i18n.Tr "dataset.upload_dataset_file"}} | |||||
</h4> | |||||
<div class="ui attached segment" style="padding: 2em 3em;"> | |||||
<div class="ui form" id="dataset-base"> | |||||
<el-form label-width="140px"> | |||||
{{.CsrfTokenHtml}} | |||||
<el-form-item label='{{$.i18n.Tr "dataset.dataset_available_clusters"}}:' prop="title"> | |||||
<el-button :class="{active:type==0}" :disabled="clusterFlag" size="small" | |||||
style="margin: 0;border-radius: 0.28571429rem 0 0 0.28571429rem;" @click="uploadGpu"> | |||||
CPU/GPU</el-button> | |||||
<el-button :class="{active:type==1}" :disabled="clusterFlag" size="small" | |||||
style="margin: 0 0 0 -4px;border-radius: 0 0.28571429rem 0.28571429rem 0;" | |||||
@click="uploadNpu">NPU</el-button> | |||||
</el-form-item> | |||||
<el-form-item label='{{$.i18n.Tr "dataset.file_description"}}:' prop="description"> | |||||
<el-input type="textarea" :rows="3" maxlength="255" | |||||
placeholder="{{$.i18n.Tr "repo.modelarts.train_job.new_place"}}" v-model="desc"> | |||||
</el-input> | |||||
</el-form-item> | |||||
<el-form-item label='{{$.i18n.Tr "dataset.data_upload"}}:' prop="category"> | |||||
<minio-uploader :uploadtype="type" :desc="desc" @setcluster="setcluster"></minio-uploader> | <minio-uploader :uploadtype="type" :desc="desc" @setcluster="setcluster"></minio-uploader> | ||||
</el-form-item> | |||||
<div style='display:none;' | |||||
id="minioUploader-params" | |||||
data-uuid="{{.uuid}}" | |||||
data-add-url="{{.Repository.OwnerName}}/attachments/add" | |||||
data-accepts="{{.AttachmentAllowedTypes}}" | |||||
data-remove-url="{{AppSubUrl}}/attachments/delete" | |||||
data-csrf="{{.CsrfToken}}" | |||||
dataset-id={{.dataset.ID}} | |||||
data-max-file="100" | |||||
data-dataset-id="{{.dataset.ID}}" | |||||
data-max-size="{{.AttachmentMaxSize}}" | |||||
data-default-message="{{.i18n.Tr "dropzone.default_message"}}" | |||||
data-invalid-input-type="{{.i18n.Tr "dropzone.invalid_input_type"}}" | |||||
data-file-too-big="{{.i18n.Tr "dropzone.file_too_big"}}" | |||||
data-remove-file="{{.i18n.Tr "dropzone.remove_file"}}" | |||||
data-file-status='{{.i18n.Tr "dropzone.file_status"}}' | |||||
data-file-init-status='{{.i18n.Tr "dropzone.file_init_status"}}' | |||||
data-waitting-uploading='{{.i18n.Tr "dropzone.waitting_uploading"}}' | |||||
data-md5-computing='{{.i18n.Tr "dropzone.md5_computing"}}' | |||||
data-obs-connecting='{{.i18n.Tr "dropzone.obs-connecting"}}' | |||||
data-loading-file='{{.i18n.Tr "dropzone.loading_file"}}' | |||||
data-upload-complete='{{.i18n.Tr "dropzone.upload_complete"}}' | |||||
data-uploading='{{.i18n.Tr "dropzone.uploading"}}' | |||||
data-failed='{{.i18n.Tr "dropzone.failed"}}' | |||||
data-repopath='{{AppSubUrl}}{{$.RepoLink}}/datasets' | |||||
data-cancel='{{.i18n.Tr "cancel"}}' | |||||
data-upload='{{.i18n.Tr "dataset.dataset_upload"}}' | |||||
> | |||||
</el-form-item> | |||||
<div style='display:none;' id="minioUploader-params" data-uuid="{{.uuid}}" | |||||
data-add-url="{{.Repository.OwnerName}}/attachments/add" | |||||
data-accepts="{{.AttachmentAllowedTypes}}" | |||||
data-remove-url="{{AppSubUrl}}/attachments/delete" data-csrf="{{.CsrfToken}}" | |||||
dataset-id={{.dataset.ID}} data-max-file="100" data-dataset-id="{{.dataset.ID}}" | |||||
data-max-size="{{.AttachmentMaxSize}}" | |||||
data-default-message="{{.i18n.Tr "dropzone.default_dataset_message"}}" | |||||
data-invalid-input-type="{{.i18n.Tr "dropzone.invalid_input_type"}}" | |||||
data-file-too-big="{{.i18n.Tr "dropzone.file_too_big"}}" | |||||
data-remove-file="{{.i18n.Tr "dropzone.remove_file"}}" | |||||
data-file-status='{{.i18n.Tr "dropzone.file_status"}}' | |||||
data-file-init-status='{{.i18n.Tr "dropzone.file_init_status"}}' | |||||
data-waitting-uploading='{{.i18n.Tr "dropzone.waitting_uploading"}}' | |||||
data-md5-computing='{{.i18n.Tr "dropzone.md5_computing"}}' | |||||
data-obs-connecting='{{.i18n.Tr "dropzone.obs-connecting"}}' | |||||
data-loading-file='{{.i18n.Tr "dropzone.loading_file"}}' | |||||
data-upload-complete='{{.i18n.Tr "dropzone.upload_complete"}}' | |||||
data-uploading='{{.i18n.Tr "dropzone.uploading"}}' | |||||
data-failed='{{.i18n.Tr "dropzone.failed"}}' | |||||
data-repopath='{{AppSubUrl}}{{$.RepoLink}}/datasets' data-cancel='{{.i18n.Tr "cancel"}}' | |||||
data-upload='{{.i18n.Tr "dataset.dataset_upload"}}'> | |||||
</div> | </div> | ||||
<div id="datasetId" datasetId="{{.datasetId}}"></div> | <div id="datasetId" datasetId="{{.datasetId}}"></div> | ||||
</el-form> | |||||
</div> | |||||
</div> | |||||
</el-form> | |||||
</div> | |||||
</div> | |||||
</div> | </div> | ||||
<div style="width: 80%;margin: auto;padding-top: 2em;"> | <div style="width: 80%;margin: auto;padding-top: 2em;"> | ||||
<!-- <p>说明:<br> | <!-- <p>说明:<br> | ||||
@@ -62,10 +60,11 @@ | |||||
- 云脑1提供 <span class="text blue">CPU / GPU</span> 资源,云脑2提供 <span class="text blue">Ascend NPU</span> 资源;调试使用的数据集也需要上传到对应的环境。 | - 云脑1提供 <span class="text blue">CPU / GPU</span> 资源,云脑2提供 <span class="text blue">Ascend NPU</span> 资源;调试使用的数据集也需要上传到对应的环境。 | ||||
</p> --> | </p> --> | ||||
<p style="color: 505559;">{{$.i18n.Tr "dataset.illustrate"}}:</p> | <p style="color: 505559;">{{$.i18n.Tr "dataset.illustrate"}}:</p> | ||||
<p style="line-height: 1.5;color: #101010;">{{$.i18n.Tr "dataset.illustrate.only"}}<span class="text red"> {{$.i18n.Tr "dataset.illustrate.zip"}} </span>{{$.i18n.Tr "dataset.illustrate.fisrt_end"}};</br> | |||||
<p style="line-height: 1.5;color: #101010;">{{$.i18n.Tr "dataset.illustrate.only"}}<span | |||||
class="text red"> {{$.i18n.Tr "dataset.illustrate.zip"}} </span>{{$.i18n.Tr "dataset.illustrate.fisrt_end"}};</br> | |||||
{{$.i18n.Tr "dataset.dataset_explain"}}</p> | {{$.i18n.Tr "dataset.dataset_explain"}}</p> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
{{template "base/footer" .}} | |||||
{{template "base/footer" .}} |
@@ -7,6 +7,8 @@ | |||||
background: #FFF !important; | background: #FFF !important; | ||||
} | } | ||||
.dataset_title { | .dataset_title { | ||||
font-size: 14px; | font-size: 14px; | ||||
max-width: 80%; | max-width: 80%; | ||||
@@ -211,11 +213,22 @@ | |||||
<div class="ui grid stackable" style="background: #f0f0f0;;"> | <div class="ui grid stackable" style="background: #f0f0f0;;"> | ||||
<div class="row"> | <div class="row"> | ||||
<!-- 数据集名称 --> | <!-- 数据集名称 --> | ||||
<div class="four wide column" style="width: 24% !important;"> | |||||
<span style="margin:0 6px">{{$.i18n.Tr "dataset.dataset_file_name"}}</span> | |||||
<div class="four wide column name_sort" @click="sortAble('name')" style="width: 24% !important;"> | |||||
{{$.i18n.Tr "dataset.dataset_file_name"}} | |||||
<span class="caret-wrapper"> | |||||
<i class='ri-arrow-up-s-fill sort-caret-up {{if eq .SortType "nameAsc"}} active-sort {{end}}'></i> | |||||
<i | |||||
class='ri-arrow-down-s-fill sort-caret-down {{if eq .SortType "nameDesc"}} active-sort {{end}}'></i> | |||||
</span> | |||||
</div> | </div> | ||||
<div class="one wide column text center" style="width: 7.25% !important;"> | |||||
<div class="one wide column text center size_sort" @click="sortAble('size')" | |||||
style="width: 7.25% !important;"> | |||||
{{$.i18n.Tr "repo.model.manage.size"}} | {{$.i18n.Tr "repo.model.manage.size"}} | ||||
<span class="caret-wrapper"> | |||||
<i class='ri-arrow-up-s-fill sort-caret-up {{if eq .SortType "sizeAsc"}} active-sort {{end}}'></i> | |||||
<i | |||||
class='ri-arrow-down-s-fill sort-caret-down {{if eq .SortType "sizeDesc"}} active-sort {{end}}'></i> | |||||
</span> | |||||
</div> | </div> | ||||
<div class="two wide column text center"> | <div class="two wide column text center"> | ||||
{{$.i18n.Tr "dataset.dataset_available_clusters"}} | {{$.i18n.Tr "dataset.dataset_available_clusters"}} | ||||
@@ -226,8 +239,13 @@ | |||||
<div class="one wide column text center"> | <div class="one wide column text center"> | ||||
{{$.i18n.Tr "repo.cloudbrain_creator"}} | {{$.i18n.Tr "repo.cloudbrain_creator"}} | ||||
</div> | </div> | ||||
<div class="three wide column text center"> | |||||
<div class="three wide column text center" @click="sortAble('time')"> | |||||
{{$.i18n.Tr "dataset.dataset_upload_time"}} | {{$.i18n.Tr "dataset.dataset_upload_time"}} | ||||
<span class="caret-wrapper"> | |||||
<i class='ri-arrow-up-s-fill sort-caret-up {{if eq .SortType "timeAsc"}} active-sort {{end}}'></i> | |||||
<i | |||||
class='ri-arrow-down-s-fill sort-caret-down {{if eq .SortType "timeDesc"}} active-sort {{end}}'></i> | |||||
</span> | |||||
</div> | </div> | ||||
<div class="four wide column text center"> | <div class="four wide column text center"> | ||||
{{$.i18n.Tr "repo.cloudbrain_operate"}} | {{$.i18n.Tr "repo.cloudbrain_operate"}} | ||||
@@ -166,8 +166,8 @@ | |||||
<div class="ui hidden divider"></div> | <div class="ui hidden divider"></div> | ||||
<div> | <div> | ||||
<a href="https://openi.org.cn/index.php?m=content&c=index&a=show&catid=202&id=221" target="_blank"> | |||||
<img src="https://openi.org.cn/uploadfile/2022/0427/c45291e24e30f54.jpg" class="ui fluid image" alt=""> | |||||
<a href="{{.image_link}}" target="_blank"> | |||||
<img src="{{.image_url}}" class="ui fluid image" alt=""> | |||||
</a> | </a> | ||||
</div> | </div> | ||||
</div> | </div> |
@@ -6,6 +6,7 @@ | |||||
<div style="margin-top: 20px;"> | <div style="margin-top: 20px;"> | ||||
<span class="sta_iterm">统计周期:</span> | <span class="sta_iterm">统计周期:</span> | ||||
<button type="button" class='btnFirst' id ="yesterday_usr" v-bind:class="{colorChange:1==dynamic}" @click="resetPage(),getUserList('yesterday_usr',1)">昨天</button> | <button type="button" class='btnFirst' id ="yesterday_usr" v-bind:class="{colorChange:1==dynamic}" @click="resetPage(),getUserList('yesterday_usr',1)">昨天</button> | ||||
<button type="button" class='btn' id = "last_week_usr" v-bind:class="{colorChange:8==dynamic}" @click="resetPage(),getUserList('last_week_usr',8)">上周</button> | |||||
<button type="button" class='btn' id = "current_week_usr" v-bind:class="{colorChange:2==dynamic}" @click="resetPage(),getUserList('current_week_usr',2)">本周</button> | <button type="button" class='btn' id = "current_week_usr" v-bind:class="{colorChange:2==dynamic}" @click="resetPage(),getUserList('current_week_usr',2)">本周</button> | ||||
<button type="button" class='btn' id = "current_month_usr" v-bind:class="{colorChange:3==dynamic}" @click="resetPage(),getUserList('current_month_usr',3)">本月</button> | <button type="button" class='btn' id = "current_month_usr" v-bind:class="{colorChange:3==dynamic}" @click="resetPage(),getUserList('current_month_usr',3)">本月</button> | ||||
<button type="button" class='btn' id = "last_month_usr" v-bind:class="{colorChange:4==dynamic}" @click="resetPage(),getUserList('last_month_usr',4)">上月</button> | <button type="button" class='btn' id = "last_month_usr" v-bind:class="{colorChange:4==dynamic}" @click="resetPage(),getUserList('last_month_usr',4)">上月</button> | ||||
@@ -213,6 +214,18 @@ | |||||
width="120px" | width="120px" | ||||
align="center"> | align="center"> | ||||
</el-table-column> | </el-table-column> | ||||
<el-table-column | |||||
prop="Email" | |||||
label="Email" | |||||
width="120px" | |||||
align="center"> | |||||
</el-table-column> | |||||
<el-table-column | |||||
prop="UserLocation" | |||||
label="用户所在地址" | |||||
width="120px" | |||||
align="center"> | |||||
</el-table-column> | |||||
<el-table-column | <el-table-column | ||||
prop="RegistDate" | prop="RegistDate" | ||||
label="用户注册时间" | label="用户注册时间" | ||||
@@ -266,7 +279,7 @@ | |||||
value_time: '', | value_time: '', | ||||
search:'', | search:'', | ||||
data:'', | data:'', | ||||
columns: [{title: 'ID',key: 'ID'},{title: '用户名',key: 'Name'},{title: 'PR数',key: 'CodeMergeCount'},{title: 'commit数',key:'CommitCount'},{title: '提出任务数',key: 'IssueCount'},{title: '评论数',key: 'CommentCount'},{title: '关注项目数',key: 'FocusRepoCount'},{title: '点赞项目数',key: 'StarRepoCount'},{title: '登录次数',key: 'LoginCount'},{title:'关注者数',key:'WatchedCount'},{title:'commit代码行数',key:'CommitCodeSize'},{title:'已解决任务数',key:'SolveIssueCount'},{title:'百科页面贡献次数',key:'EncyclopediasCount'},{title:'创建项目',key:'CreateRepoCount'},{title:'用户注册时间',key:'RegistDate'},{title:'云脑任务数',key:'CloudBrainTaskNum'},{title:'云脑运行时间(小时)',key:'CloudBrainRunTime'},{title:'上传(提交)数据集文件数',key:'CommitDatasetNum'},{title:'提交模型数',key:'CommitModelCount'},{title:'归一化用户指数',key:'UserIndex'},{title:'用户指数',key:'UserIndexPrimitive'},{title:'关注他人数',key:'FocusOtherUser'},{title:'收藏数据集',key:'CollectDataset'},{title:'被收藏数据集',key:'CollectedDataset'},{title:'被推荐数据集数',key:'RecommendDataset'},{title:'收藏镜像数',key:'CollectImage'},{title:'被收藏镜像数',key:'CollectedImage'},{title:'被推荐镜像数',key:'RecommendImage'},{title:'系统统计时间',key:'CountDate'}], | |||||
columns: [{title: 'ID',key: 'ID'},{title: '用户名',key: 'Name'},{title: 'PR数',key: 'CodeMergeCount'},{title: 'commit数',key:'CommitCount'},{title: '提出任务数',key: 'IssueCount'},{title: '评论数',key: 'CommentCount'},{title: '关注项目数',key: 'FocusRepoCount'},{title: '点赞项目数',key: 'StarRepoCount'},{title: '登录次数',key: 'LoginCount'},{title:'关注者数',key:'WatchedCount'},{title:'commit代码行数',key:'CommitCodeSize'},{title:'已解决任务数',key:'SolveIssueCount'},{title:'百科页面贡献次数',key:'EncyclopediasCount'},{title:'创建项目',key:'CreateRepoCount'},{title:'用户注册时间',key:'RegistDate'},{title:'云脑任务数',key:'CloudBrainTaskNum'},{title:'云脑运行时间(小时)',key:'CloudBrainRunTime'},{title:'上传(提交)数据集文件数',key:'CommitDatasetNum'},{title:'提交模型数',key:'CommitModelCount'},{title:'归一化用户指数',key:'UserIndex'},{title:'用户指数',key:'UserIndexPrimitive'},{title:'关注他人数',key:'FocusOtherUser'},{title:'收藏数据集',key:'CollectDataset'},{title:'被收藏数据集',key:'CollectedDataset'},{title:'被推荐数据集数',key:'RecommendDataset'},{title:'收藏镜像数',key:'CollectImage'},{title:'被收藏镜像数',key:'CollectedImage'},{title:'被推荐镜像数',key:'RecommendImage'},{title:'Email',key:'Email'},{title:'用户所在地址',key:'UserLocation'},{title:'系统统计时间',key:'CountDate'}], | |||||
blob:'', | blob:'', | ||||
fileName:'', | fileName:'', | ||||
dynamic:7, | dynamic:7, | ||||
@@ -375,6 +388,11 @@ | |||||
this.dataUrl = '../../api/v1/query_user_current_week'; | this.dataUrl = '../../api/v1/query_user_current_week'; | ||||
break | break | ||||
} | } | ||||
case "last_week_usr":{ | |||||
this.value_time=[] | |||||
this.dataUrl = '../../api/v1/query_user_last_week'; | |||||
break | |||||
} | |||||
case "current_month_usr":{ | case "current_month_usr":{ | ||||
this.value_time=[] | this.value_time=[] | ||||
this.dataUrl = '../../api/v1/query_user_current_month'; | this.dataUrl = '../../api/v1/query_user_current_month'; | ||||
@@ -13,7 +13,7 @@ | |||||
<span class="yesterday_blk yesterday_title" >昨日新增注册用户数 </span> | <span class="yesterday_blk yesterday_title" >昨日新增注册用户数 </span> | ||||
<span class="yesterday_blk yesterday_color1 yesterday_pdrt yesterday_text">未激活:<span class="bold_num">{{ tableDataYesterday.NotActivateRegistUser }}</span> 人 </span> | <span class="yesterday_blk yesterday_color1 yesterday_pdrt yesterday_text">未激活:<span class="bold_num">{{ tableDataYesterday.NotActivateRegistUser }}</span> 人 </span> | ||||
<span class="yesterday_blk yesterday_color2 yesterday_pdrt yesterday_text">已激活: <span class="bold_num">{{ tableDataYesterday.ActivateRegistUser }} </span>人</span> | <span class="yesterday_blk yesterday_color2 yesterday_pdrt yesterday_text">已激活: <span class="bold_num">{{ tableDataYesterday.ActivateRegistUser }} </span>人</span> | ||||
<span class="yesterday_blk yesterday_pdrt yesterday_text">有贡献活动: <span class="bold_num">{{ tableDataYesterday.HasActivityUser }} </span>人</span> | |||||
<span class="yesterday_blk yesterday_pdrt yesterday_text">有贡献活动: <span class="bold_num">{{ tableDataYesterday.RegistActivityUser }} </span>人</span> | |||||
</el-col> | </el-col> | ||||
@@ -114,7 +114,7 @@ | |||||
align="center"> | align="center"> | ||||
</el-table-column> | </el-table-column> | ||||
<el-table-column | <el-table-column | ||||
prop="HasActivityUser" | |||||
prop="RegistActivityUser" | |||||
label="新增有贡献活动" | label="新增有贡献活动" | ||||
align="center"> | align="center"> | ||||
</el-table-column> | </el-table-column> | ||||
@@ -131,6 +131,11 @@ | |||||
{{scope.row.ActivateIndex | rounding}} | {{scope.row.ActivateIndex | rounding}} | ||||
</template> | </template> | ||||
</el-table-column> | </el-table-column> | ||||
<el-table-column | |||||
prop="HasActivityUser" | |||||
label="当日有贡献活动" | |||||
align="center"> | |||||
</el-table-column> | |||||
<el-table-column | <el-table-column | ||||
prop="TotalUser" | prop="TotalUser" | ||||
label="累计注册用户" | label="累计注册用户" | ||||
@@ -517,7 +522,7 @@ | |||||
xdata.push(this.tableData[this.tableData.length-1-i].DisplayDate); | xdata.push(this.tableData[this.tableData.length-1-i].DisplayDate); | ||||
ydata_TotalRegistUser.push(this.tableData[this.tableData.length-1-i].TotalRegistUser) | ydata_TotalRegistUser.push(this.tableData[this.tableData.length-1-i].TotalRegistUser) | ||||
ydata_ActivateRegistUser.push(this.tableData[this.tableData.length-1-i].ActivateRegistUser) | ydata_ActivateRegistUser.push(this.tableData[this.tableData.length-1-i].ActivateRegistUser) | ||||
ydata_RegistActivityUser.push(this.tableData[this.tableData.length-1-i].HasActivityUser) | |||||
ydata_RegistActivityUser.push(this.tableData[this.tableData.length-1-i].RegistActivityUser) | |||||
ydata_NotActivateRegistUser.push(this.tableData[this.tableData.length-1-i].NotActivateRegistUser) | ydata_NotActivateRegistUser.push(this.tableData[this.tableData.length-1-i].NotActivateRegistUser) | ||||
ydata_TotalUser.push(this.tableData[this.tableData.length-1-i].TotalUser) | ydata_TotalUser.push(this.tableData[this.tableData.length-1-i].TotalUser) | ||||
ydata_TotalActivateRegistUser.push(this.tableData[this.tableData.length-1-i].TotalActivateRegistUser) | ydata_TotalActivateRegistUser.push(this.tableData[this.tableData.length-1-i].TotalActivateRegistUser) | ||||
@@ -1225,10 +1225,7 @@ async function initRepository() { | |||||
const $content = $segment.parent(); | const $content = $segment.parent(); | ||||
if (!$content.find('.ui.small.images').length) { | if (!$content.find('.ui.small.images').length) { | ||||
if (data.attachments !== '') { | if (data.attachments !== '') { | ||||
$content.append( | |||||
'<div class="ui bottom attached segment"><div class="ui small images"></div></div>' | |||||
); | |||||
$content.find('.ui.small.images').html(data.attachments); | |||||
} | } | ||||
} else if (data.attachments === '') { | } else if (data.attachments === '') { | ||||
$content | $content | ||||
@@ -3923,19 +3920,10 @@ function initVueDataset() { | |||||
MinioUploader | MinioUploader | ||||
}, | }, | ||||
mounted() { | mounted() { | ||||
// if(document.getElementById('postPath')){ | |||||
// this.url = document.getElementById('postPath').value | |||||
// } | |||||
// this.privates = items | |||||
// this.num_stars = num_stars | |||||
// this.star_active = star_active | |||||
// this.ruleForm1 = ruleForm | |||||
// // this.getEditInit() | |||||
// this.getTypeList() | |||||
this.getTypeList() | this.getTypeList() | ||||
if (!!document.getElementById('dataset-repolink-init')) { | if (!!document.getElementById('dataset-repolink-init')) { | ||||
this.cloudbrainType = location.href.indexOf('cloudbrain') !== -1 ? 0 : 1 | |||||
this.getCurrentRepoDataset(this.repolink, this.cloudbrainType) | this.getCurrentRepoDataset(this.repolink, this.cloudbrainType) | ||||
} | } | ||||
@@ -3967,7 +3955,7 @@ function initVueDataset() { | |||||
}, | }, | ||||
methods: { | methods: { | ||||
copyUrl(url) { | copyUrl(url) { | ||||
const cInput = document.createElement('input') | |||||
const cInput = document.createElementNS('input') | |||||
cInput.value = url | cInput.value = url | ||||
document.body.appendChild(cInput) | document.body.appendChild(cInput) | ||||
cInput.select() | cInput.select() | ||||
@@ -4083,6 +4071,25 @@ function initVueDataset() { | |||||
uploadNpu() { | uploadNpu() { | ||||
this.type = 1 | this.type = 1 | ||||
}, | }, | ||||
sortAble(dom) { | |||||
const params = new URLSearchParams(location.search) | |||||
if (params.toString() === '') { | |||||
location.href = `${location.href}?sort=${dom}Asc` | |||||
} | |||||
else if (!params.get('sort')) { | |||||
location.href = `${location.href}&sort=${dom}Asc` | |||||
} | |||||
else if (params.get('sort') === `${dom}Desc` || params.get('sort').indexOf(`${dom}`) === -1) { | |||||
params.delete('sort') | |||||
let asc = params.toString() + `&sort=${dom}Asc` | |||||
location.search = asc | |||||
} | |||||
else { | |||||
params.delete('sort') | |||||
let desc = params.toString() + `&sort=${dom}Desc` | |||||
location.search = desc | |||||
} | |||||
}, | |||||
setPrivate(uuid, privateFlag, index) { | setPrivate(uuid, privateFlag, index) { | ||||
const params = { _csrf: csrf, file: uuid, is_private: privateFlag } | const params = { _csrf: csrf, file: uuid, is_private: privateFlag } | ||||
this.$axios.post('/attachments/private', this.qs.stringify(params)).then((res) => { | this.$axios.post('/attachments/private', this.qs.stringify(params)).then((res) => { | ||||
@@ -4915,7 +4922,7 @@ window.onOAuthLoginClick = function () { | |||||
// Pull SVGs via AJAX to workaround CORS issues with <use> tags | // Pull SVGs via AJAX to workaround CORS issues with <use> tags | ||||
// https://css-tricks.com/ajaxing-svg-sprite/ | // https://css-tricks.com/ajaxing-svg-sprite/ | ||||
$.get(`${window.config.StaticUrlPrefix}/img/svg/icons.svg`, (data) => { | $.get(`${window.config.StaticUrlPrefix}/img/svg/icons.svg`, (data) => { | ||||
const div = document.createElement('div'); | |||||
const div = document.createElementNS('div'); | |||||
div.style.display = 'none'; | div.style.display = 'none'; | ||||
div.innerHTML = new XMLSerializer().serializeToString(data.documentElement); | div.innerHTML = new XMLSerializer().serializeToString(data.documentElement); | ||||
document.body.insertBefore(div, document.body.childNodes[0]); | document.body.insertBefore(div, document.body.childNodes[0]); | ||||
@@ -1063,3 +1063,33 @@ display: block; | |||||
float: left !important; | float: left !important; | ||||
margin: 0px 5px 0px 0px !important; | margin: 0px 5px 0px 0px !important; | ||||
} | } | ||||
.row .caret-wrapper { | |||||
display: inline-flex; | |||||
flex-direction: column; | |||||
align-items: center; | |||||
height: 34px; | |||||
width: 24px; | |||||
vertical-align: middle; | |||||
cursor: pointer; | |||||
position: relative; | |||||
} | |||||
.row .sort-caret-up { | |||||
position: absolute; | |||||
top: 5px; | |||||
color: #c0c4cc; | |||||
font-size: 18px; | |||||
} | |||||
.row .sort-caret-down { | |||||
position: absolute; | |||||
bottom: 3px; | |||||
color: #c0c4cc; | |||||
font-size: 18px; | |||||
} | |||||
.row .active-sort { | |||||
color: #409eff !important; | |||||
} |