|
@@ -5,6 +5,8 @@ import ( |
|
|
"net/http" |
|
|
"net/http" |
|
|
"net/url" |
|
|
"net/url" |
|
|
"os" |
|
|
"os" |
|
|
|
|
|
"strconv" |
|
|
|
|
|
"strings" |
|
|
"time" |
|
|
"time" |
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/models" |
|
|
"code.gitea.io/gitea/models" |
|
@@ -404,7 +406,7 @@ func queryMetrics(ctx *context.Context, tableName string, startTime time.Time, e |
|
|
if tableName == "public.user_business_analysis_yesterday" { |
|
|
if tableName == "public.user_business_analysis_yesterday" { |
|
|
mapInterface["datarecordbegintime"] = setting.RadarMap.GrowthBeginTime |
|
|
mapInterface["datarecordbegintime"] = setting.RadarMap.GrowthBeginTime |
|
|
if len(result) > 0 { |
|
|
if len(result) > 0 { |
|
|
dateTime := time.Unix(result[0].CountDate, 0) |
|
|
|
|
|
|
|
|
dateTime := time.Unix(result[0].CountDate, 0).AddDate(0, 0, 1) |
|
|
mapInterface["lastUpdatedTime"] = dateTime.Format("2006-01-02 15:04:05") |
|
|
mapInterface["lastUpdatedTime"] = dateTime.Format("2006-01-02 15:04:05") |
|
|
} else { |
|
|
} else { |
|
|
mapInterface["lastUpdatedTime"] = "" |
|
|
mapInterface["lastUpdatedTime"] = "" |
|
@@ -450,7 +452,7 @@ func DownloadUserDefineFile(ctx *context.Context) { |
|
|
func QueryUserMetricsCurrentMonth(ctx *context.Context) { |
|
|
func QueryUserMetricsCurrentMonth(ctx *context.Context) { |
|
|
|
|
|
|
|
|
currentTimeNow := time.Now() |
|
|
currentTimeNow := time.Now() |
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) |
|
|
|
|
|
|
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
queryMetrics(ctx, "public.user_business_analysis_current_month", pageStartTime, pageEndTime) |
|
|
queryMetrics(ctx, "public.user_business_analysis_current_month", pageStartTime, pageEndTime) |
|
@@ -476,7 +478,7 @@ func QueryUserMetricsCurrentWeek(ctx *context.Context) { |
|
|
} |
|
|
} |
|
|
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) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) |
|
|
|
|
|
|
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
queryMetrics(ctx, "public.user_business_analysis_current_week", pageStartTime, pageEndTime) |
|
|
queryMetrics(ctx, "public.user_business_analysis_current_week", pageStartTime, pageEndTime) |
|
|
} |
|
|
} |
|
|
func QueryUserStaticCurrentWeek(ctx *context.Context) { |
|
|
func QueryUserStaticCurrentWeek(ctx *context.Context) { |
|
@@ -490,7 +492,7 @@ 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()) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) |
|
|
|
|
|
|
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
queryMetrics(ctx, "public.user_business_analysis_current_year", pageStartTime, pageEndTime) |
|
|
queryMetrics(ctx, "public.user_business_analysis_current_year", pageStartTime, pageEndTime) |
|
|
} |
|
|
} |
|
|
func QueryUserStaticCurrentYear(ctx *context.Context) { |
|
|
func QueryUserStaticCurrentYear(ctx *context.Context) { |
|
@@ -500,7 +502,7 @@ func QueryUserMetricsLast30Day(ctx *context.Context) { |
|
|
currentTimeNow := time.Now() |
|
|
currentTimeNow := time.Now() |
|
|
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) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) |
|
|
|
|
|
|
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
queryMetrics(ctx, "public.user_business_analysis_last30_day", pageStartTime, pageEndTime) |
|
|
queryMetrics(ctx, "public.user_business_analysis_last30_day", pageStartTime, pageEndTime) |
|
|
} |
|
|
} |
|
|
func QueryUserStaticLast30Day(ctx *context.Context) { |
|
|
func QueryUserStaticLast30Day(ctx *context.Context) { |
|
@@ -518,7 +520,7 @@ func QueryUserStaticLastMonth(ctx *context.Context) { |
|
|
queryUserDataPage(ctx, "public.user_business_analysis_last_month", new(models.UserBusinessAnalysisLastMonth)) |
|
|
queryUserDataPage(ctx, "public.user_business_analysis_last_month", new(models.UserBusinessAnalysisLastMonth)) |
|
|
} |
|
|
} |
|
|
func QueryUserMetricsYesterday(ctx *context.Context) { |
|
|
func QueryUserMetricsYesterday(ctx *context.Context) { |
|
|
currentTimeNow := time.Now() |
|
|
|
|
|
|
|
|
currentTimeNow := time.Now().AddDate(0, 0, -1) |
|
|
pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local) |
|
|
pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) |
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) |
|
@@ -531,7 +533,7 @@ func QueryUserMetricsAll(ctx *context.Context) { |
|
|
currentTimeNow := time.Now() |
|
|
currentTimeNow := time.Now() |
|
|
pageStartTime := time.Date(2022, 4, 5, 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
pageStartTime := time.Date(2022, 4, 5, 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageStartTime = getStartTime(pageStartTime) |
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) |
|
|
|
|
|
|
|
|
pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location()) |
|
|
queryMetrics(ctx, "public.user_business_analysis_all", pageStartTime, pageEndTime) |
|
|
queryMetrics(ctx, "public.user_business_analysis_all", pageStartTime, pageEndTime) |
|
|
} |
|
|
} |
|
|
func QueryUserStaticAll(ctx *context.Context) { |
|
|
func QueryUserStaticAll(ctx *context.Context) { |
|
@@ -611,7 +613,15 @@ func QueryUserStaticDataPage(ctx *context.Context) { |
|
|
ctx.JSON(http.StatusOK, ctx.Tr("user.static.downloadinfo")+"/api/v1/download_user_define_file?filename="+filename) |
|
|
ctx.JSON(http.StatusOK, ctx.Tr("user.static.downloadinfo")+"/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) |
|
|
|
|
|
|
|
|
key := startTime.Format("2006-01-02") + endTime.Format("2006-01-02") |
|
|
|
|
|
log.Info("db key =" + key) |
|
|
|
|
|
re, count := models.QueryDataForUserDefineFromDb(pageOpts, key) |
|
|
|
|
|
if count == 0 { |
|
|
|
|
|
wikiMap, _ := queryWikiCountMap(startTime, endTime) |
|
|
|
|
|
re, count = models.QueryUserStaticDataForUserDefine(pageOpts, wikiMap) |
|
|
|
|
|
models.WriteDataToDb(re, key) |
|
|
|
|
|
} |
|
|
|
|
|
re, count = models.QueryDataForUserDefineFromDb(pageOpts, key) |
|
|
mapInterface["data"] = re |
|
|
mapInterface["data"] = re |
|
|
mapInterface["count"] = count |
|
|
mapInterface["count"] = count |
|
|
ctx.JSON(http.StatusOK, mapInterface) |
|
|
ctx.JSON(http.StatusOK, mapInterface) |
|
@@ -839,3 +849,61 @@ func writeUserActivityToExcel(startTime time.Time, endTime time.Time, filePath s |
|
|
log.Info("write to file succeed, filepath=" + filePath) |
|
|
log.Info("write to file succeed, filepath=" + filePath) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// URL: /api/v1/query_user_login?userId=1,2,3,4 |
|
|
|
|
|
func QueryUserLoginInfo(ctx *context.Context) { |
|
|
|
|
|
userId := ctx.Query("userId") |
|
|
|
|
|
userIds := strings.Split(userId, ",") |
|
|
|
|
|
userIdInt := make([]int64, 0) |
|
|
|
|
|
for _, id := range userIds { |
|
|
|
|
|
idInt, err := strconv.ParseInt(id, 10, 64) |
|
|
|
|
|
if err == nil { |
|
|
|
|
|
userIdInt = append(userIdInt, idInt) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
result := models.QueryUserLoginInfo(userIdInt) |
|
|
|
|
|
|
|
|
|
|
|
xlsx := excelize.NewFile() |
|
|
|
|
|
sheetName := ctx.Tr("用户登录信息") |
|
|
|
|
|
index := xlsx.NewSheet(sheetName) |
|
|
|
|
|
xlsx.DeleteSheet("Sheet1") |
|
|
|
|
|
|
|
|
|
|
|
excelHeader := make([]string, 0) |
|
|
|
|
|
excelHeader = append(excelHeader, "用户ID") |
|
|
|
|
|
excelHeader = append(excelHeader, "登录IP") |
|
|
|
|
|
excelHeader = append(excelHeader, "登录时间") |
|
|
|
|
|
|
|
|
|
|
|
excelHeaderMap := make(map[string]string, 0) |
|
|
|
|
|
var j byte |
|
|
|
|
|
j = 0 |
|
|
|
|
|
for _, value := range excelHeader { |
|
|
|
|
|
excelColumn := getColumn(j) + fmt.Sprint(1) |
|
|
|
|
|
log.Info("excelColumn=" + excelColumn) |
|
|
|
|
|
excelHeaderMap[excelColumn] = value |
|
|
|
|
|
j++ |
|
|
|
|
|
} |
|
|
|
|
|
for k, v := range excelHeaderMap { |
|
|
|
|
|
//设置单元格的值 |
|
|
|
|
|
xlsx.SetCellValue(sheetName, k, v) |
|
|
|
|
|
} |
|
|
|
|
|
for i, userLogin := range result { |
|
|
|
|
|
row := i + 2 |
|
|
|
|
|
rows := fmt.Sprint(row) |
|
|
|
|
|
var tmp byte |
|
|
|
|
|
tmp = 0 |
|
|
|
|
|
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userLogin.UId) |
|
|
|
|
|
tmp = tmp + 1 |
|
|
|
|
|
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userLogin.IpAddr) |
|
|
|
|
|
tmp = tmp + 1 |
|
|
|
|
|
formatTime := userLogin.CreatedUnix.Format("2006-01-02 15:04:05") |
|
|
|
|
|
xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3]) |
|
|
|
|
|
} |
|
|
|
|
|
//设置默认打开的表单 |
|
|
|
|
|
xlsx.SetActiveSheet(index) |
|
|
|
|
|
filename := sheetName + "_" + time.Now().Format("2006-01-02 15:04:05") + ".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()) |
|
|
|
|
|
} |
|
|
|
|
|
} |