1.增加首页数据查询接口;
2.历史汇总和实时汇总增加退订率字段;
This commit is contained in:
parent
aa4a350da7
commit
2f382db28d
|
@ -397,7 +397,11 @@ func (e MiGuDeployService) HistoricalSummaryList(c *gin.Context) {
|
||||||
AND DATE(created_at) = DATE(mg_order.subscribe_time)) AS submission_count,
|
AND DATE(created_at) = DATE(mg_order.subscribe_time)) AS submission_count,
|
||||||
COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
|
COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
|
||||||
COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) AS new_user_unsub_on_day,
|
COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) AS new_user_unsub_on_day,
|
||||||
COUNT(*) AS new_user_count`).
|
COUNT(*) AS new_user_count,
|
||||||
|
CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 /
|
||||||
|
NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_within_hour_rate,
|
||||||
|
CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) * 100.0 /
|
||||||
|
NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate`).
|
||||||
Where("mg_order.subscribe_time >= ? AND mg_order.subscribe_time <= ?", startTime, endTime).
|
Where("mg_order.subscribe_time >= ? AND mg_order.subscribe_time <= ?", startTime, endTime).
|
||||||
Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code").
|
Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code").
|
||||||
Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time").
|
Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time").
|
||||||
|
@ -496,8 +500,12 @@ func (e MiGuDeployService) RealtimeSummaryList(c *gin.Context) {
|
||||||
AND created_at <= ?) AS submission_count,
|
AND created_at <= ?) AS submission_count,
|
||||||
COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
|
COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
|
||||||
COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) AS new_user_unsub_on_day,
|
COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) AS new_user_unsub_on_day,
|
||||||
COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END) AS new_user_count`,
|
COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END) AS new_user_count,
|
||||||
startDate, endDate, startDate, endDate).
|
CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 /
|
||||||
|
NULLIF(COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END), 0), 2), '%') AS new_user_unsub_within_hour_rate,
|
||||||
|
CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) * 100.0 /
|
||||||
|
NULLIF(COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END), 0), 2), '%') AS new_user_unsub_on_day_rate`,
|
||||||
|
startDate, endDate, startDate, endDate, startDate, endDate, startDate, endDate).
|
||||||
Where("mg_order.created_at >= ? AND mg_order.created_at <= ?", startDate, endDate).
|
Where("mg_order.created_at >= ? AND mg_order.created_at <= ?", startDate, endDate).
|
||||||
Group("product_id, channel_code").
|
Group("product_id, channel_code").
|
||||||
Order("product_id, channel_code").
|
Order("product_id, channel_code").
|
||||||
|
@ -594,16 +602,32 @@ func (e MiGuDeployService) UserRetentionList(c *gin.Context) {
|
||||||
var retentionList []models.MgUserRetention
|
var retentionList []models.MgUserRetention
|
||||||
|
|
||||||
// 查询用户留存数据
|
// 查询用户留存数据
|
||||||
err = e.Orm.Model(&models.MgOrder{}).
|
qs := e.Orm.Model(&models.MgOrder{}).
|
||||||
Select(`DATE_FORMAT(created_at, '%Y-%m') AS retention_month,
|
Select(`DATE_FORMAT(created_at, '%Y-%m') AS retention_month,
|
||||||
COUNT(DISTINCT phone_number) AS new_user_count,
|
COUNT(DISTINCT phone_number) AS new_user_count,
|
||||||
COUNT(DISTINCT CASE WHEN state != 2 THEN phone_number END) AS retained_user_count,
|
COUNT(DISTINCT CASE WHEN state != 2 THEN phone_number END) AS retained_user_count,
|
||||||
channel_code, product_id,
|
channel_code, product_id,
|
||||||
IFNULL(FORMAT(COUNT(DISTINCT CASE WHEN state != 2 THEN phone_number END) / NULLIF(COUNT(DISTINCT phone_number), 0) * 100, 2), 0) AS retention_rate`).
|
IFNULL(FORMAT(COUNT(DISTINCT CASE WHEN state != 2 THEN phone_number END) / NULLIF(COUNT(DISTINCT phone_number), 0) * 100, 2), 0) AS retention_rate`).
|
||||||
Where("created_at >= ? AND created_at <= ?", startDate, endDate).
|
Where("created_at >= ? AND created_at <= ?", startDate, endDate)
|
||||||
Group("retention_month, channel_code, product_id").
|
|
||||||
|
// 处理产品编号 (SkuCode) 过滤条件
|
||||||
|
if req.SkuCode != "" {
|
||||||
|
qs = qs.Where("product_id = ?", req.SkuCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理渠道名称 (Channel) 过滤条件
|
||||||
|
if req.Channel != "" {
|
||||||
|
qs = qs.Where("channel_code = ?", req.Channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = qs.Group("retention_month, channel_code, product_id").
|
||||||
Order("retention_month").
|
Order("retention_month").
|
||||||
Find(&retentionList).Error
|
Find(&retentionList).Error
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("DailyData query err: %#v", err)
|
||||||
|
response.Error(c, http.StatusInternalServerError, err, "查询失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e.Logger.Errorf("UserRetentionList query error: %#v", err)
|
e.Logger.Errorf("UserRetentionList query error: %#v", err)
|
||||||
|
@ -737,6 +761,132 @@ func (e MiGuDeployService) SysChannelList(c *gin.Context) {
|
||||||
e.OK(resp, "")
|
e.OK(resp, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HomepageDataSummary 查询首页汇总数据
|
||||||
|
// @Summary 查询首页汇总数据
|
||||||
|
// @Tags 2024-咪咕-管理后台
|
||||||
|
// @Produce json
|
||||||
|
// @Accept json
|
||||||
|
// @Param request body models.HomepageDataSummaryReq true "查询首页汇总数据"
|
||||||
|
// @Success 200 {object} models.HomepageDataSummaryResp
|
||||||
|
// @Router /api/v1/admin/home/data [post]
|
||||||
|
func (e MiGuDeployService) HomepageDataSummary(c *gin.Context) {
|
||||||
|
fmt.Println("HomepageDataSummary")
|
||||||
|
err := e.MakeContext(c).MakeOrm().Errors
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("MakeContext err:", err)
|
||||||
|
e.Logger.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 请求参数绑定
|
||||||
|
req := &models.HomepageDataSummaryReq{}
|
||||||
|
if c.ShouldBindJSON(req) != nil {
|
||||||
|
logger.Errorf("para err")
|
||||||
|
response.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := models.HomepageDataSummaryResp{}
|
||||||
|
var summaryData models.SummaryData
|
||||||
|
|
||||||
|
// 设置开始时间和结束时间
|
||||||
|
startTime := req.StartTime
|
||||||
|
endTime := req.EndTime
|
||||||
|
if startTime == "" {
|
||||||
|
startTime = "1970-01-01 00:00:00"
|
||||||
|
}
|
||||||
|
if endTime == "" {
|
||||||
|
endTime = time.Now().Format("2006-01-02 15:04:05")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询汇总数据
|
||||||
|
qs := e.Orm.Model(&models.MgOrder{}).
|
||||||
|
Select(`COUNT(*) AS total_user_count,
|
||||||
|
COUNT(CASE WHEN state = 2 THEN 1 END) AS unsubscribed_user_count,
|
||||||
|
COUNT(CASE WHEN is_one_hour_cancel = 1 THEN 1 END) AS one_hour_unsubscribed_user_count`).
|
||||||
|
Where("subscribe_time >= ? AND subscribe_time <= ?", startTime, endTime)
|
||||||
|
|
||||||
|
// 添加产品和渠道的过滤条件
|
||||||
|
if req.SkuCode != "" {
|
||||||
|
qs = qs.Where("product_id = ?", req.SkuCode)
|
||||||
|
}
|
||||||
|
if req.Channel != "" {
|
||||||
|
qs = qs.Where("channel_code = ?", req.Channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = qs.Find(&summaryData).Error
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("HomepageDataSummary query err: %#v", err)
|
||||||
|
response.Error(c, http.StatusInternalServerError, err, "查询失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算留存用户数
|
||||||
|
summaryData.RetainedUserCount = summaryData.TotalUserCount - summaryData.UnsubscribedUserCount
|
||||||
|
|
||||||
|
// 计算留存率
|
||||||
|
if summaryData.TotalUserCount > 0 {
|
||||||
|
summaryData.RetentionRate = fmt.Sprintf("%.2f%%", float64(summaryData.RetainedUserCount)*100.0/float64(summaryData.TotalUserCount))
|
||||||
|
} else {
|
||||||
|
summaryData.RetentionRate = "0.00%"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算退订率
|
||||||
|
if summaryData.TotalUserCount > 0 {
|
||||||
|
summaryData.UnsubscribeRate = fmt.Sprintf("%.2f%%", float64(summaryData.UnsubscribedUserCount)*100.0/float64(summaryData.TotalUserCount))
|
||||||
|
summaryData.OneHourUnsubscribeRate = fmt.Sprintf("%.2f%%", float64(summaryData.OneHourUnsubscribedUserCount)*100.0/float64(summaryData.TotalUserCount))
|
||||||
|
} else {
|
||||||
|
summaryData.UnsubscribeRate = "0.00%"
|
||||||
|
summaryData.OneHourUnsubscribeRate = "0.00%"
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.Summary = summaryData
|
||||||
|
|
||||||
|
// 查询每日数据
|
||||||
|
var dailyDataList []models.DailyData
|
||||||
|
dailyQuery := e.Orm.Model(&models.MgOrder{}).
|
||||||
|
Select(`DATE(subscribe_time) AS date,
|
||||||
|
COUNT(*) AS new_user_count,
|
||||||
|
COUNT(CASE WHEN state = 2 THEN 1 END) AS unsubscribed_user_count,
|
||||||
|
COUNT(CASE WHEN is_one_hour_cancel = 1 THEN 1 END) AS unsubscribed_within_one_hour`).
|
||||||
|
Where("subscribe_time >= ? AND subscribe_time <= ?", startTime, endTime)
|
||||||
|
|
||||||
|
// 处理产品编号 (SkuCode) 过滤条件
|
||||||
|
if req.SkuCode != "" {
|
||||||
|
dailyQuery = dailyQuery.Where("product_id = ?", req.SkuCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理渠道名称 (Channel) 过滤条件
|
||||||
|
if req.Channel != "" {
|
||||||
|
dailyQuery = dailyQuery.Where("channel_code = ?", req.Channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dailyQuery.Group("DATE(subscribe_time)").
|
||||||
|
Order("DATE(subscribe_time)").
|
||||||
|
Find(&dailyDataList).Error
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("DailyData query err: %#v", err)
|
||||||
|
response.Error(c, http.StatusInternalServerError, err, "查询失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算每日退订率
|
||||||
|
for i := range dailyDataList {
|
||||||
|
if dailyDataList[i].NewUserCount > 0 {
|
||||||
|
dailyDataList[i].UnsubscribeRate = fmt.Sprintf("%.2f%%", float64(dailyDataList[i].UnsubscribedUserCount)*100.0/float64(dailyDataList[i].NewUserCount))
|
||||||
|
dailyDataList[i].UnsubscribeWithinOneHourRate = fmt.Sprintf("%.2f%%", float64(dailyDataList[i].UnsubscribedWithinOneHour)*100.0/float64(dailyDataList[i].NewUserCount))
|
||||||
|
} else {
|
||||||
|
dailyDataList[i].UnsubscribeRate = "0.00%"
|
||||||
|
dailyDataList[i].UnsubscribeWithinOneHourRate = "0.00%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.DailyDataList = dailyDataList
|
||||||
|
|
||||||
|
// 返回结果
|
||||||
|
e.OK(resp, "")
|
||||||
|
}
|
||||||
|
|
||||||
// AddChannel 新增渠道
|
// AddChannel 新增渠道
|
||||||
// @Summary 新增渠道
|
// @Summary 新增渠道
|
||||||
// @Tags 2024-咪咕-管理后台
|
// @Tags 2024-咪咕-管理后台
|
||||||
|
|
|
@ -85,7 +85,9 @@ type MgHistoricalSummary struct {
|
||||||
SubmissionCount int `json:"submission_count"` // 提交数
|
SubmissionCount int `json:"submission_count"` // 提交数
|
||||||
NewUserCount int `json:"new_user_count"` // 新用户数
|
NewUserCount int `json:"new_user_count"` // 新用户数
|
||||||
NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内)
|
NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内)
|
||||||
|
NewUserUnsubWithinHourRate string `json:"new_user_unsub_within_hour_rate"` // 当日新用户退订率(1小时以内)
|
||||||
NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数
|
NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数
|
||||||
|
NewUserUnsubOnDayRate string `json:"new_user_unsub_on_day_rate"` // 当日新用户退订率
|
||||||
//Province string `gorm:"size:255" json:"province"` // 省份
|
//Province string `gorm:"size:255" json:"province"` // 省份
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +98,9 @@ type MgRealtimeSummary struct {
|
||||||
SubmissionCount int `json:"submission_count"` // 提交数
|
SubmissionCount int `json:"submission_count"` // 提交数
|
||||||
NewUserCount int `json:"new_user_count"` // 新用户数
|
NewUserCount int `json:"new_user_count"` // 新用户数
|
||||||
NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内)
|
NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内)
|
||||||
|
NewUserUnsubWithinHourRate string `json:"new_user_unsub_within_hour_rate"` // 当日新用户退订率(1小时以内)
|
||||||
NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数
|
NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数
|
||||||
|
NewUserUnsubOnDayRate string `json:"new_user_unsub_on_day_rate"` // 当日新用户退订率
|
||||||
//Province string `json:"province"` // 省份
|
//Province string `json:"province"` // 省份
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -485,6 +489,38 @@ type DeleteChannelResp struct {
|
||||||
// Any relevant response fields can go here
|
// Any relevant response fields can go here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type HomepageDataSummaryReq struct {
|
||||||
|
StartTime string `json:"start_time"` // 查询开始时间
|
||||||
|
EndTime string `json:"end_time"` // 查询结束时间
|
||||||
|
SkuCode string `json:"sku_code"` // 产品编号
|
||||||
|
Channel string `json:"channel"` // 渠道名称
|
||||||
|
}
|
||||||
|
|
||||||
|
type DailyData struct {
|
||||||
|
Date string `json:"date"` // 日期
|
||||||
|
NewUserCount int64 `json:"new_user_count"` // 新增用户数
|
||||||
|
UnsubscribedUserCount int64 `json:"unsubscribed_user_count"` // 退订用户数
|
||||||
|
UnsubscribedWithinOneHour int64 `json:"unsubscribed_within_one_hour"` // 1小时内退订用户数
|
||||||
|
UnsubscribeRate string `json:"unsubscribe_rate"` // 退订率
|
||||||
|
UnsubscribeWithinOneHourRate string `json:"unsubscribe_within_one_hour_rate"` // 1小时内退订率
|
||||||
|
}
|
||||||
|
|
||||||
|
type HomepageDataSummaryResp struct {
|
||||||
|
Summary SummaryData `json:"summary"` // 汇总数据
|
||||||
|
DailyDataList []DailyData `json:"daily_data"` // 每天的数据列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// SummaryData represents the overall summary data
|
||||||
|
type SummaryData struct {
|
||||||
|
TotalUserCount int `json:"total_user_count"` // 总用户数
|
||||||
|
UnsubscribedUserCount int `json:"unsubscribed_user_count"` // 退订用户数
|
||||||
|
OneHourUnsubscribedUserCount int `json:"one_hour_unsubscribed_user_count"` // 1小时内退订用户数
|
||||||
|
RetainedUserCount int `json:"retained_user_count"` // 留存用户数
|
||||||
|
UnsubscribeRate string `json:"unsubscribe_rate"` // 退订率 (字符串,保留两位小数,如 "26.35%")
|
||||||
|
OneHourUnsubscribeRate string `json:"one_hour_unsubscribe_rate"` // 1小时退订率 (字符串,保留两位小数,如 "26.35%")
|
||||||
|
RetentionRate string `json:"retention_rate"` // 留存率 (字符串,保留两位小数,如 "73.65%")
|
||||||
|
}
|
||||||
|
|
||||||
// MiGuCaptchaRequest 调用下单接口(森越转发)
|
// MiGuCaptchaRequest 调用下单接口(森越转发)
|
||||||
func MiGuCaptchaRequest(r *MiGuSendCaptchaReq) (MiGuRsp, error) {
|
func MiGuCaptchaRequest(r *MiGuSendCaptchaReq) (MiGuRsp, error) {
|
||||||
var miGuResp MiGuRsp
|
var miGuResp MiGuRsp
|
||||||
|
|
|
@ -27,6 +27,7 @@ func registerMiGuControlManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi
|
||||||
api.POST("realtime_summary/list", apiMiGu.RealtimeSummaryList) // 当日实时汇总
|
api.POST("realtime_summary/list", apiMiGu.RealtimeSummaryList) // 当日实时汇总
|
||||||
api.POST("user_retention/list", apiMiGu.UserRetentionList) // 用户留存记录
|
api.POST("user_retention/list", apiMiGu.UserRetentionList) // 用户留存记录
|
||||||
api.POST("sys_channel/list", apiMiGu.SysChannelList) // 查询系统所有渠道编码
|
api.POST("sys_channel/list", apiMiGu.SysChannelList) // 查询系统所有渠道编码
|
||||||
|
api.POST("home/data", apiMiGu.HomepageDataSummary) // 查询首页汇总数据
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,39 @@ const docTemplateadmin = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/api/v1/admin/home/data": {
|
||||||
|
"post": {
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"2024-咪咕-管理后台"
|
||||||
|
],
|
||||||
|
"summary": "查询首页汇总数据",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "查询首页汇总数据",
|
||||||
|
"name": "request",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/models.HomepageDataSummaryReq"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/models.HomepageDataSummaryResp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/api/v1/admin/order/list": {
|
"/api/v1/admin/order/list": {
|
||||||
"post": {
|
"post": {
|
||||||
"consumes": [
|
"consumes": [
|
||||||
|
@ -4738,7 +4771,7 @@ const docTemplateadmin = `{
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"description": "状态 (0: 停用, 1: 启用) (必填)",
|
"description": "状态 (2: 停用, 1: 启用) (必填)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
"sub_channel_code": {
|
"sub_channel_code": {
|
||||||
|
@ -4899,6 +4932,35 @@ const docTemplateadmin = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.DailyData": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"date": {
|
||||||
|
"description": "日期",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"new_user_count": {
|
||||||
|
"description": "新增用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"unsubscribe_rate": {
|
||||||
|
"description": "退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"unsubscribe_within_one_hour_rate": {
|
||||||
|
"description": "1小时内退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"unsubscribed_user_count": {
|
||||||
|
"description": "退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"unsubscribed_within_one_hour": {
|
||||||
|
"description": "1小时内退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.HistoricalSummaryListReq": {
|
"models.HistoricalSummaryListReq": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -4948,6 +5010,47 @@ const docTemplateadmin = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.HomepageDataSummaryReq": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"channel": {
|
||||||
|
"description": "渠道名称",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"end_time": {
|
||||||
|
"description": "查询结束时间",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"sku_code": {
|
||||||
|
"description": "产品编号",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"start_time": {
|
||||||
|
"description": "查询开始时间",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"models.HomepageDataSummaryResp": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"daily_data": {
|
||||||
|
"description": "每天的数据列表",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/models.DailyData"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"description": "汇总数据",
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/models.SummaryData"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.MgChannel": {
|
"models.MgChannel": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -5006,10 +5109,18 @@ const docTemplateadmin = `{
|
||||||
"description": "当日新用户退订数",
|
"description": "当日新用户退订数",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_on_day_rate": {
|
||||||
|
"description": "当日新用户退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"new_user_unsub_within_hour": {
|
"new_user_unsub_within_hour": {
|
||||||
"description": "当日新用户退订数(1小时以内)",
|
"description": "当日新用户退订数(1小时以内)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_within_hour_rate": {
|
||||||
|
"description": "当日新用户退订率(1小时以内)",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"product_id": {
|
"product_id": {
|
||||||
"description": "产品ID",
|
"description": "产品ID",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -5133,10 +5244,18 @@ const docTemplateadmin = `{
|
||||||
"description": "当日新用户退订数",
|
"description": "当日新用户退订数",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_on_day_rate": {
|
||||||
|
"description": "当日新用户退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"new_user_unsub_within_hour": {
|
"new_user_unsub_within_hour": {
|
||||||
"description": "当日新用户退订数(1小时以内)",
|
"description": "当日新用户退订数(1小时以内)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_within_hour_rate": {
|
||||||
|
"description": "当日新用户退订率(1小时以内)",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"product_id": {
|
"product_id": {
|
||||||
"description": "产品ID",
|
"description": "产品ID",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -5689,6 +5808,39 @@ const docTemplateadmin = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.SummaryData": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"one_hour_unsubscribe_rate": {
|
||||||
|
"description": "1小时退订率 (字符串,保留两位小数,如 \"26.35%\")",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"one_hour_unsubscribed_user_count": {
|
||||||
|
"description": "1小时内退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"retained_user_count": {
|
||||||
|
"description": "留存用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"retention_rate": {
|
||||||
|
"description": "留存率 (字符串,保留两位小数,如 \"73.65%\")",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"total_user_count": {
|
||||||
|
"description": "总用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"unsubscribe_rate": {
|
||||||
|
"description": "退订率 (字符串,保留两位小数,如 \"26.35%\")",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"unsubscribed_user_count": {
|
||||||
|
"description": "退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.SysChannelListReq": {
|
"models.SysChannelListReq": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -6144,8 +6296,8 @@ var SwaggerInfoadmin = &swag.Spec{
|
||||||
Description: "基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档\n添加qq群: 521386980 进入技术交流群 请先star,谢谢!",
|
Description: "基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档\n添加qq群: 521386980 进入技术交流群 请先star,谢谢!",
|
||||||
InfoInstanceName: "admin",
|
InfoInstanceName: "admin",
|
||||||
SwaggerTemplate: docTemplateadmin,
|
SwaggerTemplate: docTemplateadmin,
|
||||||
//LeftDelim: "{{",
|
LeftDelim: "{{",
|
||||||
//RightDelim: "}}",
|
RightDelim: "}}",
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
|
@ -110,6 +110,39 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/api/v1/admin/home/data": {
|
||||||
|
"post": {
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"2024-咪咕-管理后台"
|
||||||
|
],
|
||||||
|
"summary": "查询首页汇总数据",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "查询首页汇总数据",
|
||||||
|
"name": "request",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/models.HomepageDataSummaryReq"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/models.HomepageDataSummaryResp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/api/v1/admin/order/list": {
|
"/api/v1/admin/order/list": {
|
||||||
"post": {
|
"post": {
|
||||||
"consumes": [
|
"consumes": [
|
||||||
|
@ -4730,7 +4763,7 @@
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"description": "状态 (0: 停用, 1: 启用) (必填)",
|
"description": "状态 (2: 停用, 1: 启用) (必填)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
"sub_channel_code": {
|
"sub_channel_code": {
|
||||||
|
@ -4891,6 +4924,35 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.DailyData": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"date": {
|
||||||
|
"description": "日期",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"new_user_count": {
|
||||||
|
"description": "新增用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"unsubscribe_rate": {
|
||||||
|
"description": "退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"unsubscribe_within_one_hour_rate": {
|
||||||
|
"description": "1小时内退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"unsubscribed_user_count": {
|
||||||
|
"description": "退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"unsubscribed_within_one_hour": {
|
||||||
|
"description": "1小时内退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.HistoricalSummaryListReq": {
|
"models.HistoricalSummaryListReq": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -4940,6 +5002,47 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.HomepageDataSummaryReq": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"channel": {
|
||||||
|
"description": "渠道名称",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"end_time": {
|
||||||
|
"description": "查询结束时间",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"sku_code": {
|
||||||
|
"description": "产品编号",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"start_time": {
|
||||||
|
"description": "查询开始时间",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"models.HomepageDataSummaryResp": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"daily_data": {
|
||||||
|
"description": "每天的数据列表",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/models.DailyData"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"description": "汇总数据",
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/models.SummaryData"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.MgChannel": {
|
"models.MgChannel": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -4998,10 +5101,18 @@
|
||||||
"description": "当日新用户退订数",
|
"description": "当日新用户退订数",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_on_day_rate": {
|
||||||
|
"description": "当日新用户退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"new_user_unsub_within_hour": {
|
"new_user_unsub_within_hour": {
|
||||||
"description": "当日新用户退订数(1小时以内)",
|
"description": "当日新用户退订数(1小时以内)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_within_hour_rate": {
|
||||||
|
"description": "当日新用户退订率(1小时以内)",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"product_id": {
|
"product_id": {
|
||||||
"description": "产品ID",
|
"description": "产品ID",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -5125,10 +5236,18 @@
|
||||||
"description": "当日新用户退订数",
|
"description": "当日新用户退订数",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_on_day_rate": {
|
||||||
|
"description": "当日新用户退订率",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"new_user_unsub_within_hour": {
|
"new_user_unsub_within_hour": {
|
||||||
"description": "当日新用户退订数(1小时以内)",
|
"description": "当日新用户退订数(1小时以内)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"new_user_unsub_within_hour_rate": {
|
||||||
|
"description": "当日新用户退订率(1小时以内)",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"product_id": {
|
"product_id": {
|
||||||
"description": "产品ID",
|
"description": "产品ID",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -5681,6 +5800,39 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.SummaryData": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"one_hour_unsubscribe_rate": {
|
||||||
|
"description": "1小时退订率 (字符串,保留两位小数,如 \"26.35%\")",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"one_hour_unsubscribed_user_count": {
|
||||||
|
"description": "1小时内退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"retained_user_count": {
|
||||||
|
"description": "留存用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"retention_rate": {
|
||||||
|
"description": "留存率 (字符串,保留两位小数,如 \"73.65%\")",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"total_user_count": {
|
||||||
|
"description": "总用户数",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"unsubscribe_rate": {
|
||||||
|
"description": "退订率 (字符串,保留两位小数,如 \"26.35%\")",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"unsubscribed_user_count": {
|
||||||
|
"description": "退订用户数",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.SysChannelListReq": {
|
"models.SysChannelListReq": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|
|
@ -872,7 +872,7 @@ definitions:
|
||||||
description: 备注 (非必填)
|
description: 备注 (非必填)
|
||||||
type: string
|
type: string
|
||||||
status:
|
status:
|
||||||
description: '状态 (0: 停用, 1: 启用) (必填)'
|
description: '状态 (2: 停用, 1: 启用) (必填)'
|
||||||
type: integer
|
type: integer
|
||||||
sub_channel_code:
|
sub_channel_code:
|
||||||
description: 子渠道编码 (必填)
|
description: 子渠道编码 (必填)
|
||||||
|
@ -989,6 +989,27 @@ definitions:
|
||||||
requestId:
|
requestId:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
models.DailyData:
|
||||||
|
properties:
|
||||||
|
date:
|
||||||
|
description: 日期
|
||||||
|
type: string
|
||||||
|
new_user_count:
|
||||||
|
description: 新增用户数
|
||||||
|
type: integer
|
||||||
|
unsubscribe_rate:
|
||||||
|
description: 退订率
|
||||||
|
type: string
|
||||||
|
unsubscribe_within_one_hour_rate:
|
||||||
|
description: 1小时内退订率
|
||||||
|
type: string
|
||||||
|
unsubscribed_user_count:
|
||||||
|
description: 退订用户数
|
||||||
|
type: integer
|
||||||
|
unsubscribed_within_one_hour:
|
||||||
|
description: 1小时内退订用户数
|
||||||
|
type: integer
|
||||||
|
type: object
|
||||||
models.HistoricalSummaryListReq:
|
models.HistoricalSummaryListReq:
|
||||||
properties:
|
properties:
|
||||||
channel:
|
channel:
|
||||||
|
@ -1023,6 +1044,33 @@ definitions:
|
||||||
page_size:
|
page_size:
|
||||||
type: integer
|
type: integer
|
||||||
type: object
|
type: object
|
||||||
|
models.HomepageDataSummaryReq:
|
||||||
|
properties:
|
||||||
|
channel:
|
||||||
|
description: 渠道名称
|
||||||
|
type: string
|
||||||
|
end_time:
|
||||||
|
description: 查询结束时间
|
||||||
|
type: string
|
||||||
|
sku_code:
|
||||||
|
description: 产品编号
|
||||||
|
type: string
|
||||||
|
start_time:
|
||||||
|
description: 查询开始时间
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
models.HomepageDataSummaryResp:
|
||||||
|
properties:
|
||||||
|
daily_data:
|
||||||
|
description: 每天的数据列表
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/models.DailyData'
|
||||||
|
type: array
|
||||||
|
summary:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/models.SummaryData'
|
||||||
|
description: 汇总数据
|
||||||
|
type: object
|
||||||
models.MgChannel:
|
models.MgChannel:
|
||||||
properties:
|
properties:
|
||||||
createdAt:
|
createdAt:
|
||||||
|
@ -1065,9 +1113,15 @@ definitions:
|
||||||
new_user_unsub_on_day:
|
new_user_unsub_on_day:
|
||||||
description: 当日新用户退订数
|
description: 当日新用户退订数
|
||||||
type: integer
|
type: integer
|
||||||
|
new_user_unsub_on_day_rate:
|
||||||
|
description: 当日新用户退订率
|
||||||
|
type: string
|
||||||
new_user_unsub_within_hour:
|
new_user_unsub_within_hour:
|
||||||
description: 当日新用户退订数(1小时以内)
|
description: 当日新用户退订数(1小时以内)
|
||||||
type: integer
|
type: integer
|
||||||
|
new_user_unsub_within_hour_rate:
|
||||||
|
description: 当日新用户退订率(1小时以内)
|
||||||
|
type: string
|
||||||
product_id:
|
product_id:
|
||||||
description: 产品ID
|
description: 产品ID
|
||||||
type: integer
|
type: integer
|
||||||
|
@ -1157,9 +1211,15 @@ definitions:
|
||||||
new_user_unsub_on_day:
|
new_user_unsub_on_day:
|
||||||
description: 当日新用户退订数
|
description: 当日新用户退订数
|
||||||
type: integer
|
type: integer
|
||||||
|
new_user_unsub_on_day_rate:
|
||||||
|
description: 当日新用户退订率
|
||||||
|
type: string
|
||||||
new_user_unsub_within_hour:
|
new_user_unsub_within_hour:
|
||||||
description: 当日新用户退订数(1小时以内)
|
description: 当日新用户退订数(1小时以内)
|
||||||
type: integer
|
type: integer
|
||||||
|
new_user_unsub_within_hour_rate:
|
||||||
|
description: 当日新用户退订率(1小时以内)
|
||||||
|
type: string
|
||||||
product_id:
|
product_id:
|
||||||
description: 产品ID
|
description: 产品ID
|
||||||
type: integer
|
type: integer
|
||||||
|
@ -1548,6 +1608,30 @@ definitions:
|
||||||
linkId:
|
linkId:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
models.SummaryData:
|
||||||
|
properties:
|
||||||
|
one_hour_unsubscribe_rate:
|
||||||
|
description: 1小时退订率 (字符串,保留两位小数,如 "26.35%")
|
||||||
|
type: string
|
||||||
|
one_hour_unsubscribed_user_count:
|
||||||
|
description: 1小时内退订用户数
|
||||||
|
type: integer
|
||||||
|
retained_user_count:
|
||||||
|
description: 留存用户数
|
||||||
|
type: integer
|
||||||
|
retention_rate:
|
||||||
|
description: 留存率 (字符串,保留两位小数,如 "73.65%")
|
||||||
|
type: string
|
||||||
|
total_user_count:
|
||||||
|
description: 总用户数
|
||||||
|
type: integer
|
||||||
|
unsubscribe_rate:
|
||||||
|
description: 退订率 (字符串,保留两位小数,如 "26.35%")
|
||||||
|
type: string
|
||||||
|
unsubscribed_user_count:
|
||||||
|
description: 退订用户数
|
||||||
|
type: integer
|
||||||
|
type: object
|
||||||
models.SysChannelListReq:
|
models.SysChannelListReq:
|
||||||
properties:
|
properties:
|
||||||
page_num:
|
page_num:
|
||||||
|
@ -1917,6 +2001,27 @@ paths:
|
||||||
summary: 历史汇总查询
|
summary: 历史汇总查询
|
||||||
tags:
|
tags:
|
||||||
- 2024-咪咕-管理后台
|
- 2024-咪咕-管理后台
|
||||||
|
/api/v1/admin/home/data:
|
||||||
|
post:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
parameters:
|
||||||
|
- description: 查询首页汇总数据
|
||||||
|
in: body
|
||||||
|
name: request
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/models.HomepageDataSummaryReq'
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/models.HomepageDataSummaryResp'
|
||||||
|
summary: 查询首页汇总数据
|
||||||
|
tags:
|
||||||
|
- 2024-咪咕-管理后台
|
||||||
/api/v1/admin/order/list:
|
/api/v1/admin/order/list:
|
||||||
post:
|
post:
|
||||||
consumes:
|
consumes:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user