Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mall.oytour.com
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
黄奎
mall.oytour.com
Commits
c1e8477a
Commit
c1e8477a
authored
Dec 05, 2024
by
吴春
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1
parent
b2e63c9e
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
629 additions
and
0 deletions
+629
-0
RB_Visit_Log.cs
Mall.Model/Entity/TradePavilion/RB_Visit_Log.cs
+47
-0
RB_Wechat_Statistics.cs
Mall.Model/Entity/TradePavilion/RB_Wechat_Statistics.cs
+167
-0
RB_Wechat_Statistics_Extend.cs
...Model/Extend/TradePavilion/RB_Wechat_Statistics_Extend.cs
+105
-0
WechatStatisticsModule.cs
Mall.Module.TradePavilion/WechatStatisticsModule.cs
+24
-0
RB_Visit_LogRepository.cs
Mall.Repository/TradePavilion/RB_Visit_LogRepository.cs
+60
-0
RB_Wechat_StatisticsRepository.cs
...epository/TradePavilion/RB_Wechat_StatisticsRepository.cs
+40
-0
CuiPingModule.cs
Mall.WindowsService/Module/CuiPingModule.cs
+186
-0
No files found.
Mall.Model/Entity/TradePavilion/RB_Visit_Log.cs
0 → 100644
View file @
c1e8477a
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
namespace
Mall.Model.Entity.TradePavilion
{
/// <summary>
/// 【商载通】访问记录信息 访问载体数,访问楼宇数,访问品牌数,访问企业数
/// </summary>
public
class
RB_Visit_Log
{
/// <summary>
/// 编号
/// </summary>
public
int
ID
{
get
;
set
;
}
/// <summary>
/// 商户号id
/// </summary>
public
int
TenantId
{
get
;
set
;
}
/// <summary>
/// 小程序id
/// </summary>
public
int
MallBaseId
{
get
;
set
;
}
/// <summary>
/// 创建人
/// </summary>
public
int
CreateBy
{
get
;
set
;
}
/// <summary>
/// 创建时间
/// </summary>
public
DateTime
CreateDate
{
get
;
set
;
}
/// <summary>
/// 产品id
/// </summary>
public
int
ProductID
{
get
;
set
;
}
/// <summary>
/// 1-访问载体,2-访问楼宇,3-访问品牌,4-访问企业
/// </summary>
public
int
ProductType
{
get
;
set
;
}
}
}
Mall.Model/Entity/TradePavilion/RB_Wechat_Statistics.cs
0 → 100644
View file @
c1e8477a
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
using
VT.FW.DB
;
namespace
Mall.Model.Entity.WeChatStatistics
{
/// <summary>
/// 微信小程序统计
/// </summary>
[
Serializable
]
[
DB
(
ConnectionName
=
"DefaultConnection"
)]
public
class
RB_Wechat_Statistics
{
//新载体数量,新楼宇数,新品牌数量,新企业数,载体总数,楼宇总数,品牌总数,企业总数,留存用户、活跃留存、打开次数,访问次数、访问人数、人均停留时长、次均停留时长、平均访问深度、转发次数、转发人数、累计用户数,访问载体数,访问楼宇数,访问品牌数,访问企业数。
/// <summary>
/// 编号
/// </summary>
public
int
ID
{
get
;
set
;
}
/// <summary>
/// 商户号id
/// </summary>
public
int
TenantId
{
get
;
set
;
}
/// <summary>
/// 小程序id
/// </summary>
public
int
MallBaseId
{
get
;
set
;
}
/// <summary>
/// 删除状态
/// </summary>
public
int
Status
{
get
;
set
;
}
/// <summary>
/// 新载体数量
/// </summary>
public
int
CarrierNum
{
get
;
set
;
}
/// <summary>
/// 新楼宇数
/// </summary>
public
int
BuildingCarrierNum
{
get
;
set
;
}
/// <summary>
/// 新品牌数量
/// </summary>
public
int
BrandNum
{
get
;
set
;
}
/// <summary>
/// 新企业数
/// </summary>
public
int
EnterpriseNum
{
get
;
set
;
}
/// <summary>
/// 载体总数
/// </summary>
public
int
CarrierTotalNum
{
get
;
set
;
}
/// <summary>
/// 楼宇总数
/// </summary>
public
int
BuildingCarrierTotalNum
{
get
;
set
;
}
/// <summary>
/// 品牌总数
/// </summary>
public
int
BrandTotalNum
{
get
;
set
;
}
/// <summary>
/// 企业总数
/// </summary>
public
int
EnterpriseTotalNum
{
get
;
set
;
}
/// <summary>
/// 访问载体数
/// </summary>
public
int
CarrierVisitNum
{
get
;
set
;
}
/// <summary>
/// 访问楼宇数
/// </summary>
public
int
BuildingCarrierVisitNum
{
get
;
set
;
}
/// <summary>
/// 访问品牌数
/// </summary>
public
int
BrandVisitNum
{
get
;
set
;
}
/// <summary>
/// 访问企业数
/// </summary>
public
int
EnterpriseVisitNum
{
get
;
set
;
}
/// <summary>
/// 日期
/// </summary>
public
string
Ref_Date
{
get
;
set
;
}
#
region
用户访问小程序日留存
/// <summary>
/// 新增用户留存
/// </summary>
public
int
NewVisitUV
{
get
;
set
;
}
/// <summary>
/// 活跃用户留存
/// </summary>
public
int
VisitUV
{
get
;
set
;
}
#
endregion
#
region
用户访问小程序数据概况
/// <summary>
/// 累计用户数
/// </summary>
public
int
Visit_Total
{
get
;
set
;
}
/// <summary>
/// 转发次数
/// </summary>
public
int
Share_PV
{
get
;
set
;
}
/// <summary>
/// 转发人数
/// </summary>
public
int
Share_UV
{
get
;
set
;
}
#
endregion
#
region
用户访问小程序数据日趋势
/// <summary>
/// 打开次数
/// </summary>
public
int
Session_CNT
{
get
;
set
;
}
/// <summary>
/// 访问次数
/// </summary>
public
int
Visit_PV
{
get
;
set
;
}
/// <summary>
/// 访问人数
/// </summary>
public
int
Visit_UV
{
get
;
set
;
}
/// <summary>
/// 新用户数
/// </summary>
public
int
Visit_UV_New
{
get
;
set
;
}
/// <summary>
/// 人均停留时长 (浮点型,单位:秒)
/// </summary>
public
decimal
Stay_Time_UV
{
get
;
set
;
}
/// <summary>
/// 次均停留时长 (浮点型,单位:秒)
/// </summary>
public
decimal
Stay_Time_Session
{
get
;
set
;
}
/// <summary>
/// 平均访问深度 (浮点型)
/// </summary>
public
decimal
Visit_Depth
{
get
;
set
;
}
#
endregion
}
}
Mall.Model/Extend/TradePavilion/RB_Wechat_Statistics_Extend.cs
0 → 100644
View file @
c1e8477a
using
Mall.Model.Entity.WeChatStatistics
;
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
using
VT.FW.DB
;
namespace
Mall.Model.Extend.TradePavilion
{
/// <summary>
/// 用户访问小程序日留存扩展实体
/// </summary>
[
Serializable
]
[
DB
(
ConnectionName
=
"DefaultConnection"
)]
public
class
RB_Wechat_Statistics_Extend
:
RB_Wechat_Statistics
{
/// <summary>
/// 日期
/// </summary>
public
string
ref_date
{
get
;
set
;
}
/// <summary>
/// 新增用户留存
/// </summary>
public
List
<
DailyRetainVisit
>
visit_uv_new
{
get
;
set
;
}
/// <summary>
/// 活跃用户留存
/// </summary>
public
List
<
DailyRetainVisit
>
visit_uv
{
get
;
set
;
}
}
public
class
DailyRetainVisit
{
/// <summary>
/// 标识,0开始,表示当天,1表示1天后。依此类推,key取值分别是:0,1,2,3,4,5,6,7,14,30
/// </summary>
public
int
key
{
get
;
set
;
}
/// <summary>
/// key对应日期的新增用户数/活跃用户数(key=0时)或留存用户数(k>0时)
/// </summary>
public
int
value
{
get
;
set
;
}
}
public
class
DailyVisitTrend
{
/// <summary>
/// 数据列表
/// </summary>
public
List
<
DailyVisitTrendItem
>
list
{
get
;
set
;
}
}
public
class
DailyVisitTrendItem
{
/// <summary>
/// 日期,格式为 yyyymmdd
/// </summary>
public
string
ref_date
{
get
;
set
;
}
#
region
用户访问小程序数据日趋势
/// <summary>
/// 打开次数
/// </summary>
public
int
session_cnt
{
get
;
set
;
}
/// <summary>
/// 访问次数
/// </summary>
public
int
visit_pv
{
get
;
set
;
}
/// <summary>
/// 访问人数
/// </summary>
public
int
visit_uv
{
get
;
set
;
}
/// <summary>
/// 新用户数
/// </summary>
public
int
visit_uv_new
{
get
;
set
;
}
/// <summary>
/// 人均停留时长 (浮点型,单位:秒)
/// </summary>
public
decimal
stay_time_uv
{
get
;
set
;
}
/// <summary>
/// 次均停留时长 (浮点型,单位:秒)
/// </summary>
public
decimal
stay_time_session
{
get
;
set
;
}
/// <summary>
/// 平均访问深度 (浮点型)
/// </summary>
public
decimal
visit_depth
{
get
;
set
;
}
#
endregion
#
region
用户访问小程序数据概况
/// <summary>
/// 转发次数
/// </summary>
public
int
share_pv
{
get
;
set
;
}
/// <summary>
/// 转发人数
/// </summary>
public
int
share_uv
{
get
;
set
;
}
/// <summary>
/// 累计用户数
/// </summary>
public
int
visit_total
{
get
;
set
;
}
#
endregion
}
}
Mall.Module.TradePavilion/WechatStatisticsModule.cs
0 → 100644
View file @
c1e8477a
using
Mall.Model.Extend.TradePavilion
;
using
Mall.Repository.TradePavilion
;
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
namespace
Mall.Module.TradePavilion
{
public
class
WechatStatisticsModule
{
private
readonly
RB_Wechat_StatisticsRepository
wechat_StatisticsRepository
=
new
RB_Wechat_StatisticsRepository
();
/// <summary>
/// 获取列表
/// </summary>
/// <param name="dmodel"></param>
/// <returns></returns>
public
List
<
RB_Wechat_Statistics_Extend
>
GetList
(
RB_Wechat_Statistics_Extend
dmodel
)
{
return
wechat_StatisticsRepository
.
GetList
(
dmodel
);
}
}
}
Mall.Repository/TradePavilion/RB_Visit_LogRepository.cs
0 → 100644
View file @
c1e8477a
using
Mall.Model.Entity.TradePavilion
;
using
Mall.Model.Extend.TradePavilion
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
namespace
Mall.Repository.TradePavilion
{
/// <summary>
///
/// </summary>
public
class
RB_Visit_LogRepository
:
BaseRepository
<
RB_Visit_Log
>
{
/// <summary>
/// 表名称
/// </summary>
public
string
TableName
{
get
{
return
nameof
(
RB_Visit_Log
);
}
}
/// <summary>
/// 获取访问记录信息
/// </summary>
/// <param name="query"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
public
List
<
RB_Visit_Log
>
GetList
(
RB_Visit_Log
query
,
string
startTime
,
string
endTime
)
{
StringBuilder
builder
=
new
StringBuilder
();
builder
.
Append
(
$" SELECT * FROM
{
TableName
}
WHERE 1=1"
);
if
(
query
!=
null
)
{
if
(
query
.
TenantId
>
0
)
{
builder
.
Append
(
$" AND
{
nameof
(
RB_Prize_Extend
.
TenantId
)}
=
{
query
.
TenantId
}
"
);
}
if
(
query
.
MallBaseId
>
0
)
{
builder
.
Append
(
$" AND
{
nameof
(
RB_Prize_Extend
.
MallBaseId
)}
=
{
query
.
MallBaseId
}
"
);
}
if
(!
string
.
IsNullOrWhiteSpace
(
startTime
))
{
builder
.
Append
(
$" AND
{
nameof
(
RB_Prize_Extend
.
CreateDate
)}
=
{
query
.
Id
}
"
);
}
if
(!
string
.
IsNullOrWhiteSpace
(
endTime
))
{
builder
.
Append
(
$" AND
{
nameof
(
RB_Prize_Extend
.
CreateDate
)}
=
{
query
.
Id
}
"
);
}
}
builder
.
Append
(
$" order by Id desc"
);
return
Get
<
RB_Visit_Log
>(
builder
.
ToString
()).
ToList
();
}
}
}
Mall.Repository/TradePavilion/RB_Wechat_StatisticsRepository.cs
0 → 100644
View file @
c1e8477a
using
Mall.Model.Entity.WeChatStatistics
;
using
Mall.Model.Extend.Miai
;
using
Mall.Model.Extend.TradePavilion
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
namespace
Mall.Repository.TradePavilion
{
/// <summary>
/// 微信小程序统计仓储类
/// </summary>
public
class
RB_Wechat_StatisticsRepository
:
BaseRepository
<
RB_Wechat_Statistics
>
{
/// <summary>
/// 获取列表
/// </summary>
/// <param name="dmodel"></param>
/// <returns></returns>
public
List
<
RB_Wechat_Statistics_Extend
>
GetList
(
RB_Wechat_Statistics_Extend
dmodel
)
{
string
where
=
$" 1=1 and
{
nameof
(
RB_Wechat_Statistics_Extend
.
Status
)}
=0 "
;
if
(
dmodel
.
TenantId
>
0
)
{
where
+=
$@" and
{
nameof
(
RB_Wechat_Statistics_Extend
.
TenantId
)}
=
{
dmodel
.
TenantId
}
"
;
}
if
(
dmodel
.
MallBaseId
>
0
)
{
where
+=
$@" and
{
nameof
(
RB_Wechat_Statistics_Extend
.
MallBaseId
)}
=
{
dmodel
.
MallBaseId
}
"
;
}
if
(!
string
.
IsNullOrEmpty
(
dmodel
.
Ref_Date
))
{
where
+=
$@" and
{
nameof
(
RB_Wechat_Statistics_Extend
.
Ref_Date
)}
='
{
dmodel
.
Ref_Date
}
'"
;
}
string
sql
=
$@"select * from RB_Wechat_Statistics where
{
where
}
"
;
return
Get
<
RB_Wechat_Statistics_Extend
>(
sql
).
ToList
();
}
}
}
Mall.WindowsService/Module/CuiPingModule.cs
0 → 100644
View file @
c1e8477a
using
Mall.CacheManager.AppletWeChat
;
using
Mall.CacheManager.DataStatistic
;
using
Mall.Common
;
using
Mall.Common.Plugin
;
using
Mall.Model.Entity.WeChatStatistics
;
using
Mall.Model.Extend.TradePavilion
;
using
Mall.Repository.BaseSetUp
;
using
Mall.Repository.Coffee
;
using
Mall.Repository.TradePavilion
;
using
Mall.Repository.User
;
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
namespace
Mall.WindowsService.Module
{
/// <summary>
/// 宜宾翠屏商务局小程序统计同步
/// </summary>
public
class
CuiPingModule
{
/// <summary>
/// 小程序统计
/// </summary>
private
static
readonly
RB_Wechat_StatisticsRepository
wechatStatisticsRepository
=
new
RB_Wechat_StatisticsRepository
();
/// <summary>
/// 基础配置
/// </summary>
private
static
RB_MallBaseRepository
mallBaseRepository
=
new
RB_MallBaseRepository
();
/// <summary>
/// 基础配置
/// </summary>
private
static
RB_MiniProgramRepository
miniProgramRepository
=
new
RB_MiniProgramRepository
();
/// <summary>
/// 同步小程序统计信息
/// </summary>
/// <returns></returns>
public
static
bool
AddWechatStatistics
()
{
bool
flag
=
false
;
string
mallBaseIds
=
Config
.
WechatStatisticsMallBaseId
;
if
(!
string
.
IsNullOrWhiteSpace
(
mallBaseIds
))
{
var
mallBaseIdList
=
mallBaseIds
.
Split
(
","
);
foreach
(
var
item
in
mallBaseIdList
)
{
if
(!
string
.
IsNullOrWhiteSpace
(
item
))
{
try
{
var
miniProgramModel
=
miniProgramRepository
.
GetEntity
(
Convert
.
ToInt32
(
item
));
if
((
miniProgramModel
?.
MallBaseId
??
0
)
>
0
)
{
RB_Wechat_Statistics
model
=
new
RB_Wechat_Statistics
();
model
.
TenantId
=
miniProgramModel
.
TenantId
??
0
;
model
.
MallBaseId
=
miniProgramModel
.
MallBaseId
;
model
.
Status
=
0
;
model
.
Ref_Date
=
DateTime
.
Now
.
AddDays
(-
1
).
ToString
(
"yyyyMMdd"
);
var
oldList
=
wechatStatisticsRepository
.
GetList
(
new
RB_Wechat_Statistics_Extend
{
TenantId
=
model
.
TenantId
,
MallBaseId
=
model
.
MallBaseId
,
Ref_Date
=
model
.
Ref_Date
,
Status
=
0
});
//判断是否已添加信息
if
(
oldList
?.
Count
()
>
0
)
//已同步则不继续
{
return
false
;
}
var
postdata
=
new
{
begin_date
=
model
.
Ref_Date
,
end_date
=
model
.
Ref_Date
,
};
string
token
=
WeiXinReidsCache
.
Get
(
miniProgramModel
.
MiniAppId
);
if
(
string
.
IsNullOrEmpty
(
token
))
{
token
=
Mall
.
Common
.
Pay
.
WeChatPat
.
TokenHelper
.
GetLXYToken
(
token
,
miniProgramModel
.
MiniAppId
,
miniProgramModel
.
MiniAppSecret
);
System
.
Threading
.
Tasks
.
Task
.
Run
(()
=>
WeiXinReidsCache
.
Set
(
DataConstant
.
DATA_WeiXinToken
+
miniProgramModel
.
MiniAppId
,
token
));
}
if
(
string
.
IsNullOrEmpty
(
token
))
{
return
false
;
}
if
(!
string
.
IsNullOrEmpty
(
token
))
{
string
wenXinResult
=
string
.
Empty
;
string
Url
=
"https://api.weixin.qq.com/datacube/getweanalysisappiddailyretaininfo?access_token="
+
token
;
#
region
获取用户访问小程序日留存
https
:
//developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/data-analysis/visit-retain/getDailyRetain.html
try
{
wenXinResult
=
HttpHelper
.
HttpPost
(
Url
,
JsonHelper
.
Serialize
(
postdata
),
""
);
JObject
jo
=
(
JObject
)
JsonConvert
.
DeserializeObject
(
wenXinResult
);
LogHelper
.
WriteInfo
(
wenXinResult
);
RB_Wechat_Statistics_Extend
tempModel
=
new
RB_Wechat_Statistics_Extend
();
tempModel
=
JsonConvert
.
DeserializeObject
<
RB_Wechat_Statistics_Extend
>(
wenXinResult
);
if
(
tempModel
.
visit_uv_new
!=
null
&&
tempModel
.
visit_uv_new
.
Any
())
{
model
.
NewVisitUV
=
tempModel
?.
visit_uv_new
?.
FirstOrDefault
()?.
value
??
0
;
}
if
(
tempModel
.
visit_uv
!=
null
&&
tempModel
.
visit_uv
.
Any
())
{
model
.
VisitUV
=
tempModel
?.
visit_uv
?.
FirstOrDefault
()?.
value
??
0
;
}
}
catch
(
Exception
ex
)
{
LogHelper
.
Write
(
ex
,
"获取用户访问小程序日留存"
);
}
#
endregion
#
region
获取用户访问小程序数据日趋势
https
:
//developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/data-analysis/visit-trend/getDailyVisitTrend.html
try
{
Url
=
"https://api.weixin.qq.com/datacube/getweanalysisappiddailyvisittrend?access_token="
+
token
;
wenXinResult
=
HttpHelper
.
HttpPost
(
Url
,
JsonHelper
.
Serialize
(
postdata
),
""
);
JObject
jo
=
(
JObject
)
JsonConvert
.
DeserializeObject
(
wenXinResult
);
LogHelper
.
WriteInfo
(
wenXinResult
);
DailyVisitTrend
tempDailyVisitTrendList
=
new
DailyVisitTrend
();
tempDailyVisitTrendList
=
JsonConvert
.
DeserializeObject
<
DailyVisitTrend
>(
wenXinResult
);
if
(
tempDailyVisitTrendList
.
list
!=
null
&&
tempDailyVisitTrendList
.
list
.
Any
())
{
DailyVisitTrendItem
dailyVisitTrendItem
=
tempDailyVisitTrendList
?.
list
?.
FirstOrDefault
();
model
.
Session_CNT
=
dailyVisitTrendItem
.
session_cnt
;
model
.
Visit_PV
=
dailyVisitTrendItem
.
visit_pv
;
model
.
Visit_UV
=
dailyVisitTrendItem
.
visit_uv
;
model
.
Visit_UV_New
=
dailyVisitTrendItem
.
visit_uv_new
;
model
.
Stay_Time_UV
=
dailyVisitTrendItem
.
stay_time_uv
;
model
.
Stay_Time_Session
=
dailyVisitTrendItem
.
stay_time_session
;
model
.
Visit_Depth
=
dailyVisitTrendItem
.
visit_depth
;
}
}
catch
(
Exception
ex
)
{
LogHelper
.
Write
(
ex
,
"获取用户访问小程序数据日趋势"
);
}
#
endregion
#
region
获取用户访问小程序数据概况
https
:
//developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/data-analysis/others/getDailySummary.html
try
{
Url
=
"https://api.weixin.qq.com/datacube/getweanalysisappiddailysummarytrend?access_token="
+
token
;
wenXinResult
=
HttpHelper
.
HttpPost
(
Url
,
JsonHelper
.
Serialize
(
postdata
),
""
);
JObject
jo
=
(
JObject
)
JsonConvert
.
DeserializeObject
(
wenXinResult
);
LogHelper
.
WriteInfo
(
wenXinResult
);
DailyVisitTrend
tempList
=
new
DailyVisitTrend
();
tempList
=
JsonConvert
.
DeserializeObject
<
DailyVisitTrend
>(
wenXinResult
);
if
(
tempList
.
list
!=
null
&&
tempList
.
list
.
Any
())
{
DailyVisitTrendItem
dailyVisitTrendItem
=
tempList
?.
list
?.
FirstOrDefault
();
model
.
Visit_Total
=
dailyVisitTrendItem
.
visit_total
;
model
.
Share_PV
=
dailyVisitTrendItem
.
share_pv
;
model
.
Share_UV
=
dailyVisitTrendItem
.
share_uv
;
}
}
catch
(
Exception
ex
)
{
LogHelper
.
Write
(
ex
,
"获取用户访问小程序数据概况"
);
}
#
endregion
LogHelper
.
WriteInfo
(
JsonConvert
.
SerializeObject
(
model
));
flag
=
wechatStatisticsRepository
.
Insert
(
model
)
>
0
;
}
}
}
catch
(
Exception
ex
)
{
}
}
}
}
return
flag
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment