From 5cecfa5159029e19f841bc4507c6a5da1a5d30e5 Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 28 Apr 2022 15:37:28 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82=E7=94=A8=E6=88=B7=E7=BB=9F=E8=AE=A1=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/dbsql/repo_foreigntable_for_es.sql | 10 +- models/user_business_analysis.go | 144 +++++++++++++++++++++- models/user_business_struct.go | 17 ++- options/locale/locale_zh-CN.ini | 13 ++ routers/repo/user_data_analysis.go | 82 +++++++++++- 5 files changed, 247 insertions(+), 19 deletions(-) diff --git a/models/dbsql/repo_foreigntable_for_es.sql b/models/dbsql/repo_foreigntable_for_es.sql index 7e06fd99e..e927eb7c2 100644 --- a/models/dbsql/repo_foreigntable_for_es.sql +++ b/models/dbsql/repo_foreigntable_for_es.sql @@ -523,17 +523,21 @@ DROP TRIGGER IF EXISTS es_udpate_repository_lang on public.language_stat; CREATE OR REPLACE FUNCTION public.udpate_repository_lang() RETURNS trigger AS $def$ + DECLARE + privateValue bigint; BEGIN if (TG_OP = 'UPDATE') then - update public.repository_es SET lang=(select array_to_string(array_agg(language order by percentage desc),',') from public.language_stat where repo_id=NEW.repo_id) where id=NEW.repo_id; + select into privateValue updated_unix from public.repository where id=NEW.repo_id; + update public.repository_es SET updated_unix=privateValue,lang=(select array_to_string(array_agg(language order by percentage desc),',') from public.language_stat where repo_id=NEW.repo_id) where id=NEW.repo_id; elsif (TG_OP = 'INSERT') then - update public.repository_es SET lang=(select array_to_string(array_agg(language order by percentage desc),',') from public.language_stat where repo_id=NEW.repo_id) where id=NEW.repo_id; + select into privateValue updated_unix from public.repository where id=NEW.repo_id; + update public.repository_es SET updated_unix=privateValue,lang=(select array_to_string(array_agg(language order by percentage desc),',') from public.language_stat where repo_id=NEW.repo_id) where id=NEW.repo_id; elsif (TG_OP = 'DELETE') then if exists(select 1 from public.repository where id=OLD.repo_id) then update public.repository_es SET lang=(select array_to_string(array_agg(language order by percentage desc),',') from public.language_stat where repo_id=OLD.repo_id) where id=OLD.repo_id; end if; end if; - return null; + return NEW; END; $def$ LANGUAGE plpgsql; diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index 2d7592baf..7e9e877c2 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -4,6 +4,7 @@ import ( "fmt" "sort" "strconv" + "strings" "time" "code.gitea.io/gitea/modules/log" @@ -103,6 +104,8 @@ type UserBusinessAnalysisAll struct { CollectImage int `xorm:"NOT NULL DEFAULT 0"` CollectedImage int `xorm:"NOT NULL DEFAULT 0"` RecommendImage int `xorm:"NOT NULL DEFAULT 0"` + + HasActivity int `xorm:"NOT NULL DEFAULT 0"` } type UserBusinessAnalysis struct { @@ -190,6 +193,8 @@ type UserBusinessAnalysis struct { CollectImage int `xorm:"NOT NULL DEFAULT 0"` CollectedImage int `xorm:"NOT NULL DEFAULT 0"` RecommendImage int `xorm:"NOT NULL DEFAULT 0"` + + HasActivity int `xorm:"NOT NULL DEFAULT 0"` } type UserBusinessAnalysisQueryOptions struct { @@ -227,15 +232,93 @@ func getLastCountDate() int64 { return pageStartTime.Unix() } -func QueryMetrics(start int64, end int64) ([]*UserMetrics, int64) { +func QueryMetricsPage(start int64, end int64, page int, pageSize int) ([]UserMetrics, int64) { + + statictisSess := xStatistic.NewSession() + defer statictisSess.Close() + cond := "count_date >" + fmt.Sprint(start) + " and count_date<" + fmt.Sprint(end) + allCount, err := statictisSess.Where(cond).Count(new(UserMetrics)) + if err != nil { + log.Info("query error." + err.Error()) + return nil, 0 + } + userMetricsList := make([]UserMetrics, 0) + if err := statictisSess.Table(new(UserMetrics)).Where(cond).Limit(pageSize, page*pageSize).OrderBy("count_date desc"). + Find(&userMetricsList); err != nil { + return nil, 0 + } + return userMetricsList, allCount + +} + +func QueryMetrics(start int64, end int64) ([]UserMetrics, int) { statictisSess := xStatistic.NewSession() defer statictisSess.Close() - userMetricsList := make([]*UserMetrics, 0) + userMetricsList := make([]UserMetrics, 0) if err := statictisSess.Table(new(UserMetrics)).Where("count_date >" + fmt.Sprint(start) + " and count_date<" + fmt.Sprint(end)).OrderBy("count_date desc"). Find(&userMetricsList); err != nil { return nil, 0 } - return userMetricsList, int64(len(userMetricsList)) + return userMetricsList, len(userMetricsList) +} + +func QueryMetricsForAll() []UserMetrics { + statictisSess := xStatistic.NewSession() + defer statictisSess.Close() + userMetricsList := make([]UserMetrics, 0) + if err := statictisSess.Table(new(UserMetrics)).OrderBy("count_date desc"). + Find(&userMetricsList); err != nil { + return nil + } + return makeResultForMonth(userMetricsList, len(userMetricsList)) +} + +func QueryMetricsForYear() []UserMetrics { + currentTimeNow := time.Now() + currentYearEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) + currentYearStartTime := time.Date(currentTimeNow.Year(), 1, 1, 0, 0, 0, 0, currentTimeNow.Location()) + allUserInfo, count := QueryMetrics(currentYearStartTime.Unix(), currentYearEndTime.Unix()) + + return makeResultForMonth(allUserInfo, count) +} + +func makeResultForMonth(allUserInfo []UserMetrics, count int) []UserMetrics { + monthMap := make(map[string]UserMetrics) + if count > 0 { + for _, userMetrics := range allUserInfo { + dateTime := time.Unix(userMetrics.CountDate, 0) + month := fmt.Sprint(dateTime.Year()) + "-" + fmt.Sprint(int(dateTime.Month())) + if _, ok := monthMap[month]; !ok { + var monthUserMetrics UserMetrics + monthUserMetrics.DisplayDate = month + monthUserMetrics.ActivateRegistUser = userMetrics.ActivateRegistUser + monthUserMetrics.NotActivateRegistUser = userMetrics.NotActivateRegistUser + monthUserMetrics.TotalUser = userMetrics.TotalUser + monthUserMetrics.TotalActivateRegistUser = userMetrics.TotalActivateRegistUser + monthUserMetrics.TotalHasActivityUser = userMetrics.TotalHasActivityUser + monthUserMetrics.HasActivityUser = userMetrics.HasActivityUser + monthUserMetrics.DaysForMonth = 1 + monthMap[month] = monthUserMetrics + } else { + value := monthMap[month] + value.ActivateRegistUser += userMetrics.ActivateRegistUser + value.NotActivateRegistUser += userMetrics.NotActivateRegistUser + value.TotalUser += userMetrics.TotalUser + value.TotalActivateRegistUser += userMetrics.TotalActivateRegistUser + value.TotalHasActivityUser += userMetrics.TotalHasActivityUser + value.HasActivityUser += userMetrics.HasActivityUser + value.DaysForMonth += 1 + } + } + } + result := make([]UserMetrics, 0) + for _, value := range monthMap { + result = append(result, value) + } + sort.Slice(result, func(i, j int) bool { + return strings.Compare(result[i].DisplayDate, result[j].DisplayDate) > 0 + }) + return result } func QueryRankList(key string, tableName string, limit int) ([]*UserBusinessAnalysisAll, int64) { @@ -540,6 +623,7 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS if minUserIndex > dateRecordAll.UserIndexPrimitive { minUserIndex = dateRecordAll.UserIndexPrimitive } + dateRecordBatch = append(dateRecordBatch, dateRecordAll) if len(dateRecordBatch) >= BATCH_INSERT_SIZE { insertTable(dateRecordBatch, tableName, statictisSess) @@ -695,7 +779,7 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, log.Info("query user error. return.") return err } - + userNewAddActivity := make(map[int64]map[int64]int64) ParaWeight := getParaWeight() userMetrics := make(map[string]int) var indexTotal int64 @@ -767,6 +851,9 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, dateRecord.UserIndexPrimitive = getUserIndex(dateRecord, ParaWeight) setUserMetrics(userMetrics, userRecord, start_unix, end_unix, dateRecord) + if getUserActivate(dateRecord) > 0 { + addUserToMap(userNewAddActivity, userRecord.CreatedUnix, dateRecord.ID) + } _, err = statictisSess.Insert(&dateRecord) if err != nil { log.Info("insert daterecord failed." + err.Error()) @@ -792,11 +879,58 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, useMetrics.NotActivateRegistUser = getMapKeyStringValue("NotActivateRegistUser", userMetrics) useMetrics.TotalActivateRegistUser = getMapKeyStringValue("TotalActivateRegistUser", userMetrics) useMetrics.TotalHasActivityUser = getMapKeyStringValue("TotalHasActivityUser", userMetrics) - statictisSess.Insert(&useMetrics) + count, err = sess.Count(new(User)) + if err != nil { + log.Info("query user error. return.") + } + useMetrics.TotalUser = int(count) + useMetrics.ActivateIIndex = float64(useMetrics.ActivateRegistUser) / float64(useMetrics.ActivateRegistUser+useMetrics.NotActivateRegistUser) + statictisSess.Insert(&useMetrics) + //update new user activity + updateNewUserAcitivity(userNewAddActivity, statictisSess) return nil } +func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, statictisSess *xorm.Session) { + for key, value := range currentUserActivity { + useMetrics := &UserMetrics{CountDate: key} + has, err := statictisSess.Get(useMetrics) + if err == nil && has { + userIdArrays := strings.Split(useMetrics.HasActivityUserJson, ",") + for _, userIdStr := range userIdArrays { + userIdInt, err := strconv.ParseInt(userIdStr, 10, 64) + if err == nil { + value[userIdInt] = userIdInt + } + } + userIdArray := "" + for _, tmpValue := range value { + userIdArray += fmt.Sprint(tmpValue) + "," + } + useMetrics.HasActivityUser = len(value) + if len(userIdArray) > 0 { + useMetrics.HasActivityUserJson = userIdArray[0 : len(userIdArray)-1] + + } + statictisSess.Update(useMetrics) + } + } +} + +func addUserToMap(currentUserActivity map[int64]map[int64]int64, registDate timeutil.TimeStamp, userId int64) { + CountDateTime := time.Date(registDate.Year(), registDate.AsTime().Month(), registDate.AsTime().Day(), 0, 1, 0, 0, registDate.AsTime().Location()) + CountDate := CountDateTime.Unix() + if _, ok := currentUserActivity[CountDate]; !ok { + userIdMap := make(map[int64]int64, 0) + userIdMap[userId] = userId + currentUserActivity[CountDate] = userIdMap + } else { + currentUserActivity[CountDate][userId] = userId + } + +} + func setUserMetrics(userMetrics map[string]int, user *User, start_time int64, end_time int64, dateRecord UserBusinessAnalysis) { //ActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` //NotActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` diff --git a/models/user_business_struct.go b/models/user_business_struct.go index 86aecd545..5560cb19a 100644 --- a/models/user_business_struct.go +++ b/models/user_business_struct.go @@ -400,10 +400,15 @@ type UserAnalysisPara struct { } type UserMetrics struct { - CountDate int64 `xorm:"pk"` - ActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` - NotActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` - HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` - TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` - TotalHasActivityUser int `xorm:"NOT NULL DEFAULT 0"` + CountDate int64 `xorm:"pk"` + ActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` + NotActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` + ActivateIIndex float64 `xorm:"NOT NULL DEFAULT 0"` + HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` + TotalUser int `xorm:"NOT NULL DEFAULT 0"` + TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` + TotalHasActivityUser int `xorm:"NOT NULL DEFAULT 0"` + DisplayDate string `xorm:"-"` + DaysForMonth int `xorm:"NOT NULL DEFAULT 0"` + HasActivityUserJson string `xorm:"NULL"` } diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 474b96c3f..da70e984d 100755 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -530,6 +530,19 @@ static.public.user_business_analysis_last30_day=近30天 static.public.user_business_analysis_last_month=上月 static.public.user_business_analysis_yesterday=昨天 static.public.user_business_analysis_all=所有 + +metrics.sheetname=用户趋势分析 +metrics.date=日期 +metrics.newregistuser=新增注册用户 +metrics.newregistandactiveuser=新增已激活 +metrics.hasactivateuser=新增有贡献活动 +metrics.newregistnotactiveuser=新增未激活 +metrics.averageuser=平均新增用户 +metrics.newuseractiveindex=新增用户激活率 +metrics.totalregistuser=累计注册用户 +metrics.totalregistuser=累计已激活 +metrics.totalregistuser=累计有贡献活动 + [settings] profile=个人信息 account=账号 diff --git a/routers/repo/user_data_analysis.go b/routers/repo/user_data_analysis.go index 2280e8288..240613566 100755 --- a/routers/repo/user_data_analysis.go +++ b/routers/repo/user_data_analysis.go @@ -19,6 +19,53 @@ const ( PAGE_SIZE = 2000 ) +func getUserMetricsExcelHeader(ctx *context.Context) map[string]string { + excelHeader := make([]string, 0) + excelHeader = append(excelHeader, ctx.Tr("user.static.id")) + excelHeader = append(excelHeader, ctx.Tr("user.static.name")) + excelHeader = append(excelHeader, ctx.Tr("user.static.UserIndex")) + excelHeader = append(excelHeader, ctx.Tr("user.static.UserIndexPrimitive")) + excelHeader = append(excelHeader, ctx.Tr("user.static.codemergecount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.commitcount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.issuecount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.commentcount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.focusrepocount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.starrepocount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.logincount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.watchedcount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.commitcodesize")) + excelHeader = append(excelHeader, ctx.Tr("user.static.solveissuecount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.encyclopediascount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.createrepocount")) + excelHeader = append(excelHeader, ctx.Tr("user.static.openiindex")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CloudBrainTaskNum")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CloudBrainRunTime")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CommitDatasetNum")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CommitModelCount")) + + excelHeader = append(excelHeader, ctx.Tr("user.static.FocusOtherUser")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CollectDataset")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedDataset")) + excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendDataset")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CollectImage")) + excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedImage")) + excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendImage")) + + excelHeader = append(excelHeader, ctx.Tr("user.static.registdate")) + excelHeader = append(excelHeader, ctx.Tr("user.static.countdate")) + + excelHeaderMap := make(map[string]string, 0) + var i byte + i = 0 + for _, value := range excelHeader { + excelColumn := getColumn(i) + fmt.Sprint(1) + log.Info("excelColumn=" + excelColumn) + excelHeaderMap[excelColumn] = value + i++ + } + return excelHeaderMap +} + func getExcelHeader(ctx *context.Context) map[string]string { excelHeader := make([]string, 0) excelHeader = append(excelHeader, ctx.Tr("user.static.id")) @@ -205,11 +252,36 @@ func QueryMetrics(ctx *context.Context) { endDate := ctx.Query("endDate") startTime, _ := time.ParseInLocation("2006-01-02", startDate, time.Local) endTime, _ := time.ParseInLocation("2006-01-02", endDate, time.Local) - result, count := models.QueryMetrics(startTime.Unix(), endTime.Unix()) - mapInterface := make(map[string]interface{}) - mapInterface["data"] = result - mapInterface["count"] = count - ctx.JSON(http.StatusOK, mapInterface) + + page := ctx.QueryInt("page") + if page <= 0 { + page = 1 + } + pageSize := ctx.QueryInt("pageSize") + if pageSize <= 0 { + pageSize = setting.UI.IssuePagingNum + } + IsReturnFile := ctx.QueryBool("IsReturnFile") + + if IsReturnFile { + //writer exec file. + xlsx := excelize.NewFile() + sheetName := ctx.Tr("user.metrics.sheetname") + //index := xlsx.NewSheet(sheetName) + xlsx.DeleteSheet("Sheet1") + dataHeader := getUserMetricsExcelHeader(ctx) + for k, v := range dataHeader { + //设置单元格的值 + xlsx.SetCellValue(sheetName, k, v) + } + } else { + result, count := models.QueryMetricsPage(startTime.Unix(), endTime.Unix(), page, pageSize) + mapInterface := make(map[string]interface{}) + mapInterface["data"] = result + mapInterface["count"] = count + ctx.JSON(http.StatusOK, mapInterface) + } + } func QueryRankingList(ctx *context.Context) { From 8342c48013a1e9f5958142e9090c7c344f3a471c Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 28 Apr 2022 16:02:59 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/user_business_analysis.go | 8 +++++++- models/user_business_struct.go | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index 7e9e877c2..72465daa7 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -885,7 +885,11 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, log.Info("query user error. return.") } useMetrics.TotalUser = int(count) - useMetrics.ActivateIIndex = float64(useMetrics.ActivateRegistUser) / float64(useMetrics.ActivateRegistUser+useMetrics.NotActivateRegistUser) + if useMetrics.ActivateRegistUser+useMetrics.NotActivateRegistUser == 0 { + useMetrics.ActivateIndex = 0 + } else { + useMetrics.ActivateIndex = float64(useMetrics.ActivateRegistUser) / float64(useMetrics.ActivateRegistUser+useMetrics.NotActivateRegistUser) + } statictisSess.Insert(&useMetrics) //update new user activity updateNewUserAcitivity(userNewAddActivity, statictisSess) @@ -893,7 +897,9 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, } func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, statictisSess *xorm.Session) { + log.Info("go here len=" + fmt.Sprint(len(currentUserActivity))) for key, value := range currentUserActivity { + log.Info("key=" + fmt.Sprint(key) + " ") useMetrics := &UserMetrics{CountDate: key} has, err := statictisSess.Get(useMetrics) if err == nil && has { diff --git a/models/user_business_struct.go b/models/user_business_struct.go index 5560cb19a..8f4c94636 100644 --- a/models/user_business_struct.go +++ b/models/user_business_struct.go @@ -403,12 +403,12 @@ type UserMetrics struct { CountDate int64 `xorm:"pk"` ActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` NotActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` - ActivateIIndex float64 `xorm:"NOT NULL DEFAULT 0"` + ActivateIndex float64 `xorm:"NOT NULL DEFAULT 0"` HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` TotalUser int `xorm:"NOT NULL DEFAULT 0"` TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` TotalHasActivityUser int `xorm:"NOT NULL DEFAULT 0"` DisplayDate string `xorm:"-"` DaysForMonth int `xorm:"NOT NULL DEFAULT 0"` - HasActivityUserJson string `xorm:"NULL"` + HasActivityUserJson string `xorm:"text NULL"` } From 6eb83a3da7d5d53e3e4aa82c23e08ad454e36e1a Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 28 Apr 2022 16:30:40 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/user_business_analysis.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index 72465daa7..b33625e06 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -901,8 +901,9 @@ func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, stati for key, value := range currentUserActivity { log.Info("key=" + fmt.Sprint(key) + " ") useMetrics := &UserMetrics{CountDate: key} - has, err := statictisSess.Get(useMetrics) - if err == nil && has { + _, err := statictisSess.Get(useMetrics) + log.Info("json=" + useMetrics.HasActivityUserJson + " totalUser=" + fmt.Sprint(useMetrics.TotalUser) + " len(value)=" + fmt.Sprint(len(value))) + if err == nil { userIdArrays := strings.Split(useMetrics.HasActivityUserJson, ",") for _, userIdStr := range userIdArrays { userIdInt, err := strconv.ParseInt(userIdStr, 10, 64) @@ -914,10 +915,11 @@ func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, stati for _, tmpValue := range value { userIdArray += fmt.Sprint(tmpValue) + "," } + useMetrics.HasActivityUser = len(value) if len(userIdArray) > 0 { useMetrics.HasActivityUserJson = userIdArray[0 : len(userIdArray)-1] - + log.Info("useMetrics.HasActivityUserJson=" + useMetrics.HasActivityUserJson) } statictisSess.Update(useMetrics) } From 3fedbeec1d5b6a688178b34a7edcfa780fd94339 Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 28 Apr 2022 16:45:38 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/user_business_analysis.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index b33625e06..93bc640c0 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -901,9 +901,9 @@ func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, stati for key, value := range currentUserActivity { log.Info("key=" + fmt.Sprint(key) + " ") useMetrics := &UserMetrics{CountDate: key} - _, err := statictisSess.Get(useMetrics) + has, err := statictisSess.Get(useMetrics) log.Info("json=" + useMetrics.HasActivityUserJson + " totalUser=" + fmt.Sprint(useMetrics.TotalUser) + " len(value)=" + fmt.Sprint(len(value))) - if err == nil { + if err == nil && has { userIdArrays := strings.Split(useMetrics.HasActivityUserJson, ",") for _, userIdStr := range userIdArrays { userIdInt, err := strconv.ParseInt(userIdStr, 10, 64) @@ -921,7 +921,9 @@ func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, stati useMetrics.HasActivityUserJson = userIdArray[0 : len(userIdArray)-1] log.Info("useMetrics.HasActivityUserJson=" + useMetrics.HasActivityUserJson) } - statictisSess.Update(useMetrics) + updateSql := "update public.user_metrics set has_activity_user_json=" + useMetrics.HasActivityUserJson + " where count_date=" + fmt.Sprint(key) + statictisSess.Exec(updateSql) + //statictisSess.Update(useMetrics) } } } From b6def70bb4e78a38fc3e309ca81459a54d0e4bae Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 28 Apr 2022 17:01:38 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/user_business_analysis.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index 93bc640c0..311c3ae43 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -897,12 +897,9 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, } func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, statictisSess *xorm.Session) { - log.Info("go here len=" + fmt.Sprint(len(currentUserActivity))) for key, value := range currentUserActivity { - log.Info("key=" + fmt.Sprint(key) + " ") useMetrics := &UserMetrics{CountDate: key} has, err := statictisSess.Get(useMetrics) - log.Info("json=" + useMetrics.HasActivityUserJson + " totalUser=" + fmt.Sprint(useMetrics.TotalUser) + " len(value)=" + fmt.Sprint(len(value))) if err == nil && has { userIdArrays := strings.Split(useMetrics.HasActivityUserJson, ",") for _, userIdStr := range userIdArrays { @@ -915,15 +912,12 @@ func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, stati for _, tmpValue := range value { userIdArray += fmt.Sprint(tmpValue) + "," } - useMetrics.HasActivityUser = len(value) if len(userIdArray) > 0 { useMetrics.HasActivityUserJson = userIdArray[0 : len(userIdArray)-1] - log.Info("useMetrics.HasActivityUserJson=" + useMetrics.HasActivityUserJson) } - updateSql := "update public.user_metrics set has_activity_user_json=" + useMetrics.HasActivityUserJson + " where count_date=" + fmt.Sprint(key) + updateSql := "update public.user_metrics set has_activity_user_json=" + useMetrics.HasActivityUserJson + ",has_activity_user=" + fmt.Sprint(useMetrics.HasActivityUser) + " where count_date=" + fmt.Sprint(key) statictisSess.Exec(updateSql) - //statictisSess.Update(useMetrics) } } } From fb5513fdfdbf93ccf1751fc5456d94e41d46f3f1 Mon Sep 17 00:00:00 2001 From: zouap Date: Fri, 29 Apr 2022 09:56:25 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/user_business_analysis.go | 3 ++- models/user_business_struct.go | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index 311c3ae43..d5ac13fbb 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -876,6 +876,7 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, useMetrics.ActivateRegistUser = getMapKeyStringValue("ActivateRegistUser", userMetrics) useMetrics.HasActivityUser = getMapKeyStringValue("HasActivityUser", userMetrics) + useMetrics.RegistActivityUser = 0 useMetrics.NotActivateRegistUser = getMapKeyStringValue("NotActivateRegistUser", userMetrics) useMetrics.TotalActivateRegistUser = getMapKeyStringValue("TotalActivateRegistUser", userMetrics) useMetrics.TotalHasActivityUser = getMapKeyStringValue("TotalHasActivityUser", userMetrics) @@ -916,7 +917,7 @@ func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, stati if len(userIdArray) > 0 { useMetrics.HasActivityUserJson = userIdArray[0 : len(userIdArray)-1] } - updateSql := "update public.user_metrics set has_activity_user_json=" + useMetrics.HasActivityUserJson + ",has_activity_user=" + fmt.Sprint(useMetrics.HasActivityUser) + " where count_date=" + fmt.Sprint(key) + updateSql := "update public.user_metrics set has_activity_user_json=" + useMetrics.HasActivityUserJson + ",regist_activity_user=" + fmt.Sprint(useMetrics.HasActivityUser) + " where count_date=" + fmt.Sprint(key) statictisSess.Exec(updateSql) } } diff --git a/models/user_business_struct.go b/models/user_business_struct.go index 8f4c94636..ad4ff0bdb 100644 --- a/models/user_business_struct.go +++ b/models/user_business_struct.go @@ -404,6 +404,7 @@ type UserMetrics struct { ActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` NotActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` ActivateIndex float64 `xorm:"NOT NULL DEFAULT 0"` + RegistActivityUser int `xorm:"NOT NULL DEFAULT 0"` HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` TotalUser int `xorm:"NOT NULL DEFAULT 0"` TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` From 32e8f9846ae8e68d7e660ead655c55a10f47f049 Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Fri, 29 Apr 2022 10:42:10 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E9=95=9C=E5=83=8Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/cloudbrain_image.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/cloudbrain_image.go b/models/cloudbrain_image.go index eb21e0d87..0665cab43 100644 --- a/models/cloudbrain_image.go +++ b/models/cloudbrain_image.go @@ -45,7 +45,7 @@ type ImageStar struct { } type ImageTopic struct { - ID int64 + ID int64 `xorm:"pk autoincr"` Name string `xorm:"UNIQUE VARCHAR(105)"` ImageCount int CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` From 4c4cc0213b649cdff401c40640b4ab98d0823103 Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Fri, 29 Apr 2022 10:55:37 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/cloudbrain_image.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/models/cloudbrain_image.go b/models/cloudbrain_image.go index 0665cab43..487fdfbd4 100644 --- a/models/cloudbrain_image.go +++ b/models/cloudbrain_image.go @@ -468,8 +468,10 @@ func (images ImageList) loadAttributes(e Engine, uid int64) error { } for i := range images { - images[i].UserName = users[images[i].UID].Name - images[i].RelAvatarLink = users[images[i].UID].RelAvatarLink() + if users[images[i].UID] != nil { + images[i].UserName = users[images[i].UID].Name + images[i].RelAvatarLink = users[images[i].UID].RelAvatarLink() + } if uid == -1 { images[i].IsStar = false } else { From eeac639db154aa4f14b31d2bc606b635cf7c60fd Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Fri, 29 Apr 2022 10:59:06 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/cloudbrain_image.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/models/cloudbrain_image.go b/models/cloudbrain_image.go index 487fdfbd4..f72c6a27c 100644 --- a/models/cloudbrain_image.go +++ b/models/cloudbrain_image.go @@ -471,6 +471,9 @@ func (images ImageList) loadAttributes(e Engine, uid int64) error { if users[images[i].UID] != nil { images[i].UserName = users[images[i].UID].Name images[i].RelAvatarLink = users[images[i].UID].RelAvatarLink() + } else { + images[i].UserName = "" + images[i].RelAvatarLink = "" } if uid == -1 { images[i].IsStar = false From 211286a68e38d0420f0a550af76b121efcf729bd Mon Sep 17 00:00:00 2001 From: zouap Date: Fri, 29 Apr 2022 17:31:15 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- options/locale/locale_en-US.ini | 13 ++++ options/locale/locale_zh-CN.ini | 4 +- routers/repo/user_data_analysis.go | 117 ++++++++++++++++++----------- 3 files changed, 90 insertions(+), 44 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index ca16093a6..735525efb 100755 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -525,6 +525,19 @@ static.public.user_business_analysis_last30_day=Last_30_day static.public.user_business_analysis_last_month=Last_Month static.public.user_business_analysis_yesterday=Yesterday static.public.user_business_analysis_all=All + +metrics.sheetname=User Trend Analysis +metrics.date=Count Date +metrics.newregistuser=New registered user +metrics.newregistandactiveuser=New activated +metrics.hasactivateuser=New contributing activities +metrics.newregistnotactiveuser=New inactive +metrics.averageuser=Average new users +metrics.newuseractiveindex=Activation rate of new users +metrics.totalregistuser=Cumulative registered users +metrics.totalactiveduser=Cumulative activated users +metrics.totalhasactivityuser=Cumulative active users + [settings] profile = Profile account = Account diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index da70e984d..483ddde6c 100755 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -540,8 +540,8 @@ metrics.newregistnotactiveuser=新增未激活 metrics.averageuser=平均新增用户 metrics.newuseractiveindex=新增用户激活率 metrics.totalregistuser=累计注册用户 -metrics.totalregistuser=累计已激活 -metrics.totalregistuser=累计有贡献活动 +metrics.totalactiveduser=累计已激活 +metrics.totalhasactivityuser=累计有贡献活动 [settings] profile=个人信息 diff --git a/routers/repo/user_data_analysis.go b/routers/repo/user_data_analysis.go index 240613566..913141220 100755 --- a/routers/repo/user_data_analysis.go +++ b/routers/repo/user_data_analysis.go @@ -21,51 +21,55 @@ const ( func getUserMetricsExcelHeader(ctx *context.Context) map[string]string { excelHeader := make([]string, 0) - excelHeader = append(excelHeader, ctx.Tr("user.static.id")) - excelHeader = append(excelHeader, ctx.Tr("user.static.name")) - excelHeader = append(excelHeader, ctx.Tr("user.static.UserIndex")) - excelHeader = append(excelHeader, ctx.Tr("user.static.UserIndexPrimitive")) - excelHeader = append(excelHeader, ctx.Tr("user.static.codemergecount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.commitcount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.issuecount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.commentcount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.focusrepocount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.starrepocount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.logincount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.watchedcount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.commitcodesize")) - excelHeader = append(excelHeader, ctx.Tr("user.static.solveissuecount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.encyclopediascount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.createrepocount")) - excelHeader = append(excelHeader, ctx.Tr("user.static.openiindex")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CloudBrainTaskNum")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CloudBrainRunTime")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CommitDatasetNum")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CommitModelCount")) - - excelHeader = append(excelHeader, ctx.Tr("user.static.FocusOtherUser")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CollectDataset")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedDataset")) - excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendDataset")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CollectImage")) - excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedImage")) - excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendImage")) - - excelHeader = append(excelHeader, ctx.Tr("user.static.registdate")) - excelHeader = append(excelHeader, ctx.Tr("user.static.countdate")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.date")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistuser")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistandactiveuser")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.hasactivateuser")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistnotactiveuser")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.averageuser")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.newuseractiveindex")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalregistuser")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalactiveduser")) + excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalhasactivityuser")) excelHeaderMap := make(map[string]string, 0) var i byte i = 0 for _, value := range excelHeader { excelColumn := getColumn(i) + fmt.Sprint(1) - log.Info("excelColumn=" + excelColumn) excelHeaderMap[excelColumn] = value i++ } return excelHeaderMap } +func writeUserMetricsExcel(row int, xlsx *excelize.File, sheetName string, userMetrics models.UserMetrics) { + rows := fmt.Sprint(row) + var tmp byte + tmp = 0 + dateTime := time.Unix(userMetrics.CountDate, 0) + //dateTime.Format("2006-01-02 15:04:05") + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, dateTime.Format("2006-01-02 15:04:05")) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.ActivateRegistUser+userMetrics.NotActivateRegistUser) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.ActivateRegistUser) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.RegistActivityUser) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.NotActivateRegistUser) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, "") + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userMetrics.ActivateIndex)) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalUser) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalActivateRegistUser) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalHasActivityUser) +} + func getExcelHeader(ctx *context.Context) map[string]string { excelHeader := make([]string, 0) excelHeader = append(excelHeader, ctx.Tr("user.static.id")) @@ -247,7 +251,7 @@ func queryUserDataPage(ctx *context.Context, tableName string, queryObj interfac } } -func QueryMetrics(ctx *context.Context) { +func queryMetrics(ctx *context.Context, tableName string) { startDate := ctx.Query("startDate") endDate := ctx.Query("endDate") startTime, _ := time.ParseInLocation("2006-01-02", startDate, time.Local) @@ -267,13 +271,28 @@ func QueryMetrics(ctx *context.Context) { //writer exec file. xlsx := excelize.NewFile() sheetName := ctx.Tr("user.metrics.sheetname") - //index := xlsx.NewSheet(sheetName) + index := xlsx.NewSheet(sheetName) xlsx.DeleteSheet("Sheet1") dataHeader := getUserMetricsExcelHeader(ctx) for k, v := range dataHeader { //设置单元格的值 xlsx.SetCellValue(sheetName, k, v) } + userMetricResult, count := models.QueryMetrics(startTime.Unix(), endTime.Unix()) + row := 1 + log.Info("return count=" + fmt.Sprint(count)) + for _, userRecord := range userMetricResult { + row++ + writeUserMetricsExcel(row, xlsx, sheetName, userRecord) + } + //设置默认打开的表单 + xlsx.SetActiveSheet(index) + filename := sheetName + "_" + ctx.Tr("user.static."+tableName) + ".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()) + } } else { result, count := models.QueryMetricsPage(startTime.Unix(), endTime.Unix(), page, pageSize) mapInterface := make(map[string]interface{}) @@ -281,7 +300,6 @@ func QueryMetrics(ctx *context.Context) { mapInterface["count"] = count ctx.JSON(http.StatusOK, mapInterface) } - } func QueryRankingList(ctx *context.Context) { @@ -296,30 +314,45 @@ func QueryRankingList(ctx *context.Context) { ctx.JSON(http.StatusOK, mapInterface) } +func QueryUserMetricsCurrentMonth(ctx *context.Context) { + queryMetrics(ctx, "public.user_business_analysis_current_month") +} func QueryUserStaticCurrentMonth(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_current_month", new(models.UserBusinessAnalysisCurrentMonth)) } - +func QueryUserMetricsCurrentWeek(ctx *context.Context) { + queryMetrics(ctx, "public.user_business_analysis_current_week") +} func QueryUserStaticCurrentWeek(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_current_week", new(models.UserBusinessAnalysisCurrentWeek)) } - +func QueryUserMetricsCurrentYear(ctx *context.Context) { + queryMetrics(ctx, "public.user_business_analysis_current_year") +} func QueryUserStaticCurrentYear(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_current_year", new(models.UserBusinessAnalysisCurrentYear)) } - +func QueryUserMetricsLast30Day(ctx *context.Context) { + queryMetrics(ctx, "public.user_business_analysis_last30_day") +} func QueryUserStaticLast30Day(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_last30_day", new(models.UserBusinessAnalysisLast30Day)) } - +func QueryUserMetricsLastMonth(ctx *context.Context) { + queryMetrics(ctx, "public.user_business_analysis_last_month") +} func QueryUserStaticLastMonth(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_last_month", new(models.UserBusinessAnalysisLastMonth)) } - +func QueryUserMetricsYesterday(ctx *context.Context) { + queryMetrics(ctx, "public.user_business_analysis_yesterday") +} func QueryUserStaticYesterday(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_yesterday", new(models.UserBusinessAnalysisYesterday)) } - +func QueryUserMetricsStaticAll(ctx *context.Context) { + queryMetrics(ctx, "public.user_business_analysis_all") +} func QueryUserStaticAll(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_all", new(models.UserBusinessAnalysisAll)) } From 35801300da308550d9000d57779f2dff5038fded Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 5 May 2022 09:28:45 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/user_business_analysis.go | 4 ++++ routers/api/v1/api.go | 10 ++++++++- routers/repo/user_data_analysis.go | 36 ++++++++++++++++++++++++++++-- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index d5ac13fbb..384d0b85c 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -259,6 +259,10 @@ func QueryMetrics(start int64, end int64) ([]UserMetrics, int) { Find(&userMetricsList); err != nil { return nil, 0 } + for _, userMetrics := range userMetricsList { + dateTime := time.Unix(userMetrics.CountDate, 0) + userMetrics.DisplayDate = dateTime.Format("2006-01-02") + } return userMetricsList, len(userMetricsList) } diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 2b070a4b8..d9e2f0809 100755 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -547,7 +547,15 @@ func RegisterRoutes(m *macaron.Macaron) { }) }, operationReq) - m.Get("/query_user_metrics", operationReq, repo_ext.QueryMetrics) + m.Get("/query_metrics_current_month", operationReq, repo_ext.QueryUserMetricsCurrentMonth) + m.Get("/query_metrics_current_week", operationReq, repo_ext.QueryUserMetricsCurrentWeek) + m.Get("/query_metrics_current_year", operationReq, repo_ext.QueryUserMetricsCurrentYear) + m.Get("/query_metrics_last30_day", operationReq, repo_ext.QueryUserMetricsLast30Day) + m.Get("/query_metrics_last_month", operationReq, repo_ext.QueryUserMetricsLastMonth) + m.Get("/query_metrics_yesterday", operationReq, repo_ext.QueryUserMetricsYesterday) + m.Get("/query_metrics_all", operationReq, repo_ext.QueryUserMetricsAll) + m.Get("/query_user_metrics_page", operationReq, repo_ext.QueryUserMetricDataPage) + m.Get("/query_user_rank_list", operationReq, repo_ext.QueryRankingList) m.Get("/query_user_static_page", operationReq, repo_ext.QueryUserStaticDataPage) m.Get("/query_user_current_month", operationReq, repo_ext.QueryUserStaticCurrentMonth) diff --git a/routers/repo/user_data_analysis.go b/routers/repo/user_data_analysis.go index 913141220..78c3ffec7 100755 --- a/routers/repo/user_data_analysis.go +++ b/routers/repo/user_data_analysis.go @@ -294,7 +294,17 @@ func queryMetrics(ctx *context.Context, tableName string) { log.Info("writer exel error." + err.Error()) } } else { - result, count := models.QueryMetricsPage(startTime.Unix(), endTime.Unix(), page, pageSize) + var count int64 + result := make([]models.UserMetrics, 0) + if tableName == "public.user_business_analysis_current_year" { + result = models.QueryMetricsForYear() + count = int64(len(result)) + } else if tableName == "public.user_business_analysis_all" { + result = models.QueryMetricsForAll() + count = int64(len(result)) + } else { + result, count = models.QueryMetricsPage(startTime.Unix(), endTime.Unix(), page, pageSize) + } mapInterface := make(map[string]interface{}) mapInterface["data"] = result mapInterface["count"] = count @@ -350,13 +360,35 @@ func QueryUserMetricsYesterday(ctx *context.Context) { func QueryUserStaticYesterday(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_yesterday", new(models.UserBusinessAnalysisYesterday)) } -func QueryUserMetricsStaticAll(ctx *context.Context) { +func QueryUserMetricsAll(ctx *context.Context) { queryMetrics(ctx, "public.user_business_analysis_all") } func QueryUserStaticAll(ctx *context.Context) { queryUserDataPage(ctx, "public.user_business_analysis_all", new(models.UserBusinessAnalysisAll)) } +func QueryUserMetricDataPage(ctx *context.Context) { + startDate := ctx.Query("startDate") + endDate := ctx.Query("endDate") + startTime, _ := time.ParseInLocation("2006-01-02", startDate, time.Local) + endTime, _ := time.ParseInLocation("2006-01-02", endDate, time.Local) + + page := ctx.QueryInt("page") + if page <= 0 { + page = 1 + } + pageSize := ctx.QueryInt("pageSize") + if pageSize <= 0 { + pageSize = setting.UI.IssuePagingNum + } + result, count := models.QueryMetricsPage(startTime.Unix(), endTime.Unix(), page, pageSize) + + mapInterface := make(map[string]interface{}) + mapInterface["data"] = result + mapInterface["count"] = count + ctx.JSON(http.StatusOK, mapInterface) +} + func QueryUserStaticDataPage(ctx *context.Context) { startDate := ctx.Query("startDate") endDate := ctx.Query("endDate") From 510a8812fb43c01735bb0b07e46581c375ee69e1 Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Thu, 5 May 2022 09:53:13 +0800 Subject: [PATCH 12/15] fix issue --- templates/org/create.tmpl | 4 ++-- templates/org/settings/options.tmpl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/org/create.tmpl b/templates/org/create.tmpl index 607050336..872140efa 100644 --- a/templates/org/create.tmpl +++ b/templates/org/create.tmpl @@ -15,7 +15,7 @@ {{.i18n.Tr "org.org_name_helper"}} -
+
diff --git a/templates/org/settings/options.tmpl b/templates/org/settings/options.tmpl index 228621771..03311f199 100644 --- a/templates/org/settings/options.tmpl +++ b/templates/org/settings/options.tmpl @@ -43,13 +43,13 @@
-
+
-
+
From c59605d8065ddea9bc7efe8080add322124a31a6 Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 5 May 2022 15:24:00 +0800 Subject: [PATCH 13/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/home.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/routers/home.go b/routers/home.go index 500ffbbd6..0cf09252c 100755 --- a/routers/home.go +++ b/routers/home.go @@ -8,6 +8,7 @@ package routers import ( "bytes" "net/http" + "strconv" "strings" "code.gitea.io/gitea/services/repository" @@ -641,6 +642,53 @@ func GetRecommendOrg() ([]map[string]interface{}, error) { return resultOrg, nil } +func GetRankUser() ([]map[string]interface{}, error) { + url := setting.RecommentRepoAddr + "user_rank" + result, err := repository.RecommendFromPromote(url) + + if err != nil { + return nil, err + } + resultOrg := make([]map[string]interface{}, 0) + for _, userRank := range result { + tmpIndex := strings.Index(userRank, " ") + userName := userRank + score := 0 + if tmpIndex != -1 { + userName = userRank[0:tmpIndex] + tmpScore, err := strconv.Atoi(userRank[tmpIndex+1:]) + if err != nil { + log.Info("convert to int error.") + } + score = tmpScore + } + user, err := models.GetUserByName(userName) + if err == nil { + userMap := make(map[string]interface{}) + userMap["Name"] = user.Name + userMap["Description"] = user.Description + userMap["FullName"] = user.FullName + userMap["HomeLink"] = user.HomeLink() + userMap["ID"] = user.ID + userMap["Avatar"] = user.RelAvatarLink() + userMap["Score"] = score + resultOrg = append(resultOrg, userMap) + } else { + log.Info("query user error," + err.Error()) + } + } + return resultOrg, nil +} + +func GetUserRankFromPromote(ctx *context.Context) { + resultUserRank, err := GetRankUser() + if err != nil { + ctx.ServerError("500", err) + return + } + ctx.JSON(200, resultUserRank) +} + func RecommendOrgFromPromote(ctx *context.Context) { resultOrg, err := GetRecommendOrg() if err != nil { From c6cfb0a9fcc4693b5572f3d84cd3df2dc6ca400b Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 5 May 2022 15:25:13 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/routes/routes.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 912ed6238..a783283f7 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -325,6 +325,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/action/notification", routers.ActionNotification) m.Get("/recommend/org", routers.RecommendOrgFromPromote) m.Get("/recommend/repo", routers.RecommendRepoFromPromote) + m.Get("/recommend/userrank", routers.GetUserRankFromPromote) m.Post("/all/search/", routers.Search) m.Get("/all/search/", routers.EmptySearch) m.Get("/all/dosearch/", routers.SearchApi) From 367bcec7d451026933fcf1c2758949d55963ab53 Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 5 May 2022 16:05:14 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/home.go | 7 ++++--- routers/routes/routes.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/routers/home.go b/routers/home.go index 0cf09252c..4fa0e42bb 100755 --- a/routers/home.go +++ b/routers/home.go @@ -642,8 +642,8 @@ func GetRecommendOrg() ([]map[string]interface{}, error) { return resultOrg, nil } -func GetRankUser() ([]map[string]interface{}, error) { - url := setting.RecommentRepoAddr + "user_rank" +func GetRankUser(index string) ([]map[string]interface{}, error) { + url := setting.RecommentRepoAddr + "user_rank_" + index result, err := repository.RecommendFromPromote(url) if err != nil { @@ -681,7 +681,8 @@ func GetRankUser() ([]map[string]interface{}, error) { } func GetUserRankFromPromote(ctx *context.Context) { - resultUserRank, err := GetRankUser() + index := ctx.Params("index") + resultUserRank, err := GetRankUser(index) if err != nil { ctx.ServerError("500", err) return diff --git a/routers/routes/routes.go b/routers/routes/routes.go index a783283f7..2ce32ea90 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -325,7 +325,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/action/notification", routers.ActionNotification) m.Get("/recommend/org", routers.RecommendOrgFromPromote) m.Get("/recommend/repo", routers.RecommendRepoFromPromote) - m.Get("/recommend/userrank", routers.GetUserRankFromPromote) + m.Get("/recommend/userrank/:index", routers.GetUserRankFromPromote) m.Post("/all/search/", routers.Search) m.Get("/all/search/", routers.EmptySearch) m.Get("/all/dosearch/", routers.SearchApi)