Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
H
hg-front
Overview
Overview
Details
Activity
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
platform
hg-front
Commits
d0cda602
Commit
d0cda602
authored
Oct 22, 2024
by
zhangzhen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加设备管理驾驶舱
parent
2a2a40fc
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
795 additions
and
3 deletions
+795
-3
device-manager.js
api/device-manager.js
+5
-1
pages.json
pages.json
+11
-0
index.vue
pages/daily-inspection/index.vue
+1
-1
index.vue
pages/device-cockpit/index.vue
+777
-0
list.vue
pages/rectification/list.vue
+1
-1
d_s_1.png
static/d_s_1.png
+0
-0
d_s_2.png
static/d_s_2.png
+0
-0
No files found.
api/device-manager.js
View file @
d0cda602
...
@@ -127,4 +127,8 @@ export const updateSubmitStatus = (data) => {
...
@@ -127,4 +127,8 @@ export const updateSubmitStatus = (data) => {
return
http
.
post
(
url
,
d
)
return
http
.
post
(
url
,
d
)
}
}
export
const
getDataStatistics
=
(
params
)
=>
{
let
url
=
`/service/S_SB_TJ_01`
let
d
=
setParamsData
(
params
)
return
http
.
post
(
url
,
d
)
}
pages.json
View file @
d0cda602
...
@@ -468,6 +468,17 @@
...
@@ -468,6 +468,17 @@
}
}
},
},
{
{
"path"
:
"pages/device-cockpit/index"
,
"style"
:
{
"navigationBarTitleText"
:
"管理驾驶舱"
,
"navigationBarBackgroundColor"
:
"#0072fc"
,
"navigationBarTextStyle"
:
"white"
,
"navigationStyle"
:
"custom"
,
"enablePullDownRefresh"
:
false
}
},
{
"path"
:
"pages/device-manager/list"
,
"path"
:
"pages/device-manager/list"
,
"style"
:
"style"
:
{
{
...
...
pages/daily-inspection/index.vue
View file @
d0cda602
...
@@ -56,7 +56,7 @@
...
@@ -56,7 +56,7 @@
<view
class=
"header-title"
>
<view
class=
"header-title"
>
<image
src=
"../../static/icon5.png"
mode=
"widthFix"
></image>
<image
src=
"../../static/icon5.png"
mode=
"widthFix"
></image>
<view
class=
"flex-between"
>
<view
class=
"flex-between"
>
<text
class=
"text-black text-bold"
>
{{
item
.
projName
}}
</text>
<text
class=
"text-black text-bold
ellipsis
"
>
{{
item
.
projName
}}
</text>
<view
class=
"text-blue"
>
<view
class=
"text-blue"
>
<!--
<text
:class=
"item.status==1?'text-red':'text-gray'"
>
{{
statusEnum
[
item
.
status
]
}}
</text>
-->
<!--
<text
:class=
"item.status==1?'text-red':'text-gray'"
>
{{
statusEnum
[
item
.
status
]
}}
</text>
-->
<text>
详情
</text>
<text>
详情
</text>
...
...
pages/device-cockpit/index.vue
0 → 100644
View file @
d0cda602
<
template
>
<view>
<cu-custom
bgColor=
"bg-blue"
:isBack=
"true"
>
<block
slot=
"backText"
>
<view
class=
"list-icon"
@
tap=
"onBack"
>
<text
class=
"cuIcon-back text-white text-bold text-xl"
></text>
</view>
</block>
<block
slot=
"content"
>
<text
class=
"text-white"
>
管理驾驶舱
</text>
</block>
</cu-custom>
<view
v-if=
"statusBarHeight>0"
class=
"content-black"
:style=
"
{height:statusBarHeight+'px'}">
</view>
<view
v-if=
"value === 0"
class=
"flex-col"
>
<view
class=
"flex-between header-title"
>
<picker
mode=
"selector"
:range=
"factoryList"
v-model=
"factoryIndex"
range-key=
"name"
@
change=
"onFactoryChange"
>
<view
class=
"factory-name flex-row-center"
>
<text
:class=
"factoryList.length&& factoryList[factoryIndex].name.length>=10?'factory-title':'text-nowrap'"
>
{{
factoryList
.
length
?
factoryList
[
factoryIndex
].
name
:
'厂别'
}}
</text>
<text
class=
"cuIcon-unfold text-sm"
></text>
</view>
</picker>
<view
class=
"flex-between margin-left-sm"
@
tap=
"onOpenCalendar"
>
<image
class=
"image"
src=
"../../static/big-data/calendar.png"
mode=
"widthFix"
></image>
<text
class=
"text-blue"
>
{{
date
}}
</text>
</view>
</view>
<view
class=
"flex-col data-content"
>
<view
v-for=
"(item,k) in dataChatList"
:key=
"k"
class=
"flex-col data-chart"
>
<view
class=
"header-title"
>
<view
class=
"flex-between"
>
<view
class=
"flex-row-center"
>
<image
class=
"icon"
src=
"../../static/big-data/line_icon.png"
mode=
"widthFix"
></image>
<text
class=
"text-title text-lg text-bold"
>
{{
item
.
deviceName
}}
</text>
</view>
<view
class=
"flex-row-center"
>
<image
v-if=
"['1','2','3','4'].includes(item.status)"
class=
"icon"
src=
"../../static/d_s_1.png"
mode=
"widthFix"
></image>
<image
v-else
class=
"icon"
src=
"../../static/d_s_2.png"
mode=
"widthFix"
></image>
<text>
{{
deviceStatus
[
item
.
status
]
}}
</text>
</view>
</view>
</view>
<view
class=
"circle-par"
>
<view
class=
"flex-content"
style=
"width: 100%; height:560rpx"
>
<view
v-if=
"item.echartShow"
style=
"width:720rpx; height:550rpx"
>
<l-echart
:ref=
"'chartRef'+k"
@
finished=
"init(k)"
></l-echart>
</view>
</view>
<view
class=
"flex-content"
style=
"width: 100%; height:560rpx"
>
<view
v-if=
"item.echartShow"
style=
"width:720rpx; height:550rpx"
>
<l-echart
:ref=
"'chartRef2'+k"
@
finished=
"init2(k)"
></l-echart>
</view>
</view>
</view>
</view>
<view
v-if=
"dataChatList.length
<
=
0
"
class=
"empty-box"
>
<u-empty
text=
"暂无数据"
textColor=
'#C1C1C1'
width=
"120"
>
</u-empty>
</view>
</view>
</view>
<view>
<uni-calendar
ref=
"calendar"
:startDate=
"startDate"
:endDate=
"endDate"
:date=
"date"
:insert=
"false"
@
confirm=
"onConfirmDate"
/>
</view>
</view>
</
template
>
<
script
>
import
nav1
from
"@/static/big-data/nav_1.png"
import
nav2
from
"@/static/big-data/nav_1_active.png"
import
nav3
from
"@/static/big-data/nav_2.png"
import
nav4
from
"@/static/big-data/nav_2_active.png"
import
{
toJsonData
}
from
"@/utils/tools.js"
;
import
moment
from
"@/common/moment.js"
;
import
*
as
echarts
from
'@/uni_modules/lime-echart/static/echarts.min'
;
import
{
getFactoryList
,
getSearchDate
,
getHarvestData1
,
getHarvestData2
,
getHarvestData3
,
getHarvestData4
,
getHarvestData5
}
from
"@/api/bigData.js"
import
{
getDataStatistics
}
from
"@/api/device-manager.js"
export
default
{
data
()
{
return
{
scrollTop
:
0
,
statusBarHeight
:
uni
.
getStorageSync
(
"statusHeight"
)
||
0
,
nav1
,
nav2
,
nav3
,
nav4
,
value
:
0
,
date
:
moment
().
subtract
(
1
,
'd'
).
format
(
"YYYY-MM-DD"
),
startDate
:
moment
().
subtract
(
1
,
'Y'
).
format
(
"YYYY-MM-DD"
),
endDate
:
moment
().
format
(
"YYYY-MM-DD"
),
status
:
'nomore '
,
loadingText
:
'努力加载中'
,
loadmoreText
:
'上划加载'
,
nomoreText
:
'到底啦'
,
projectDataList
:
[],
statusEnum
:
{
0
:
"计划中"
,
1
:
"生产中"
,
2
:
"已完成"
},
factoryIndex
:
0
,
factoryList
:
[],
queryData
:
{},
dataList
:
[{
YGL
:
24
,
SJCL
:
126
,
RJCL
:
24900
},
{
LJYGL
:
231
,
LJSJCL
:
1543
,
LJRJCL
:
34123
},
{
NLJYG
:
234
,
NLJSJCL
:
4554
,
NLJRJCL
:
32345
}
],
dataChatList2
:
[],
dataChatList
:
[],
groupData
:
''
,
groupDataList
:
[],
groupInfoList
:
[],
titleEnum
:
{
0
:
'产量'
,
1
:
"项目"
},
productData
:
''
,
processData
:
[],
pageData
:
{
showCount
:
"true"
,
limit
:
5
,
offset
:
0
},
timer
:
null
,
deviceStatus
:{
0
:
"异常"
,
1
:
"默认"
,
2
:
"运行"
,
3
:
"暂停"
,
4
:
"复位"
,
5
:
"一级报警"
,
6
:
"二级报警"
}
};
},
onLoad
()
{
this
.
date
=
moment
().
subtract
(
1
,
'd'
).
format
(
"YYYY-MM-DD"
);
this
.
endDate
=
moment
().
format
(
"YYYY-MM-DD"
);
this
.
onGetFactoryList
();
},
onReachBottom
()
{
if
(
this
.
status
==
'loadmore'
)
{
this
.
queryData
.
offset
+=
1
;
}
},
methods
:
{
onBack
()
{
uni
.
redirectTo
({
url
:
"/"
})
},
onGetFactoryList
()
{
getFactoryList
({
date
:
moment
().
format
(
"YYYY-MM-DD"
)
}).
then
(
res
=>
{
if
(
res
.
data
.
length
)
{
this
.
factoryList
=
res
.
data
.
map
(
item
=>
({
name
:
`
${
item
.
companyName
||
''
}
-
${
item
.
factoryName
}
`
,
value
:
item
.
factoryCode
,
companyName
:
item
.
companyName
,
companyCode
:
item
.
companyCode
}));
this
.
onLoading
();
}
})
},
onFactoryChange
(
e
)
{
this
.
factoryIndex
=
e
.
target
.
value
;
this
.
onLoading
();
},
onLoading
()
{
this
.
echartShow
=
false
;
getDataStatistics
({
...
this
.
queryData
,
factoryCode
:
this
.
factoryList
[
this
.
factoryIndex
].
value
,
companyCode
:
this
.
factoryList
[
this
.
factoryIndex
].
companyCode
,
date
:
moment
(
this
.
date
).
format
(
"YYYYMMDD"
)
}).
then
(
res
=>
{
if
(
res
.
data
.
__sys__
.
status
===
0
)
{
this
.
dataChatList
=
res
.
data
.
result
.
map
(
item
=>
{
return
{
...
item
,
echartShow
:
false
,
echartShow2
:
false
}
})
this
.
$nextTick
(()
=>
{
setTimeout
(()
=>
{
this
.
dataChatList
.
forEach
(
item
=>
{
item
.
echartShow
=
true
;
item
.
echartShow2
=
true
;
this
.
$forceUpdate
();
})
},
500
)
})
}
})
},
onOpenCalendar
()
{
this
.
$refs
.
calendar
.
open
();
},
onConfirmDate
(
e
)
{
this
.
date
=
e
.
fulldate
;
this
.
onLoading
();
},
async
init
(
i
)
{
if
(
!
this
.
dataChatList
.
length
)
return
;
let
xData
=
[]
let
yData
=
[]
this
.
dataChatList
[
i
].
runTime
.
forEach
(
item
=>
{
xData
.
push
(
Object
.
keys
(
item
)[
0
]);
yData
.
push
(
Object
.
values
(
item
)[
0
])
})
console
.
log
(
yData
,
xData
)
let
option
=
{
color
:
[
'#157DFF'
,
'#5FD77E'
,
'#FF8C00'
,
'#e05aff'
],
tooltip
:
{
trigger
:
'axis'
,
axisPointer
:
{
type
:
'shadow'
}
},
legend
:
{
orient
:
'horizontal'
,
x
:
'center'
,
y
:
"2%"
,
},
grid
:
{
top
:
'34%'
,
left
:
'3%'
,
right
:
'4%'
,
bottom
:
'6%'
,
containLabel
:
true
},
xAxis
:
[{
type
:
'category'
,
axisLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'rgba(151, 151, 151, 1)'
}
},
axisLabel
:
{
show
:
true
,
textStyle
:
{
color
:
'#000'
,
},
},
axisTick
:
{
show
:
true
},
data
:
xData
,
}],
yAxis
:
[{
name
:
'小时'
,
type
:
'value'
,
nameTextStyle
:
{
color
:
"#000"
},
axisLine
:
{
show
:
false
,
lineStyle
:
{
color
:
'rgba(151, 151, 151, 1)'
}
},
axisLabel
:
{
show
:
true
,
textStyle
:
{
color
:
'#000'
,
},
},
axisTick
:
{
show
:
false
,
color
:
'rgba(151, 151, 151, 1)'
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'rgba(226, 232, 236, 1)'
,
type
:
'solid'
,
}
},
}],
series
:
[{
name
:
'近7日作业时长'
,
type
:
"line"
,
label
:
{
show
:
true
,
position
:
'top'
},
data
:
yData
}]
};
let
chartRef
=
'chartRef'
+
i
;
const
chart
=
await
this
.
$refs
[
chartRef
][
0
].
init
(
echarts
);
chart
.
setOption
(
option
)
},
async
init2
(
i
)
{
if
(
!
this
.
dataChatList
.
length
)
return
;
let
xData
=
[]
let
yData
=
[]
this
.
dataChatList
[
i
].
errerTime
.
forEach
(
item
=>
{
xData
.
push
(
Object
.
keys
(
item
)[
0
]);
yData
.
push
(
Object
.
values
(
item
)[
0
])
})
console
.
log
(
yData
,
xData
)
let
option
=
{
color
:
[
'#157DFF'
,
'#5FD77E'
,
'#FF8C00'
,
'#e05aff'
],
tooltip
:
{
trigger
:
'axis'
,
axisPointer
:
{
type
:
'shadow'
}
},
legend
:
{
orient
:
'horizontal'
,
x
:
'center'
,
y
:
"2%"
,
},
grid
:
{
top
:
'34%'
,
left
:
'3%'
,
right
:
'4%'
,
bottom
:
'6%'
,
containLabel
:
true
},
xAxis
:
[{
type
:
'category'
,
axisLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'rgba(151, 151, 151, 1)'
}
},
axisLabel
:
{
show
:
true
,
textStyle
:
{
color
:
'#000'
,
},
},
axisTick
:
{
show
:
true
},
data
:
xData
,
}],
yAxis
:
[{
name
:
'次'
,
type
:
'value'
,
nameTextStyle
:
{
color
:
"#000"
},
axisLine
:
{
show
:
false
,
},
axisLabel
:
{
show
:
true
,
textStyle
:
{
color
:
'#000'
,
},
},
axisTick
:
{
show
:
false
,
color
:
'rgba(151, 151, 151, 1)'
}
}],
series
:
[{
name
:
'近7日故障次数'
,
type
:
"bar"
,
itemStyle
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
color
:
'#83bff6'
},
{
offset
:
0.5
,
color
:
'#188df0'
},
{
offset
:
1
,
color
:
'#188df0'
}
]
)
},
emphasis
:
{
itemStyle
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
color
:
'#2378f7'
},
{
offset
:
0.7
,
color
:
'#2378f7'
},
{
offset
:
1
,
color
:
'#83bff6'
}
]
)
}
},
label
:
{
show
:
true
,
position
:
'top'
},
data
:
yData
}]
};
let
chartRef
=
'chartRef2'
+
i
;
const
chart
=
await
this
.
$refs
[
chartRef
][
0
].
init
(
echarts
);
chart
.
setOption
(
option
)
}
}
}
</
script
>
<
style
>
page
{
background-color
:
#ffffff
;
}
</
style
>
<
style
lang=
"less"
>
.text-blue
{
color
:
#1890FF
;
font-weight
:
bold
;
}
.header-title
{
display
:
flex
;
flex-direction
:
row
;
width
:
90%
;
align-items
:
center
;
margin
:
24
upx
auto
;
.flex-between
{
display
:
flex
;
border-radius
:
10
upx
;
//
padding
:
12
upx
16
upx
;
//
background-color
:
rgba
(
246
,
246
,
248
,
1
);
width
:
100%
;
.image
{
width
:
24
upx
;
margin-right
:
8
upx
;
max-height
:
32
upx
;
}
}
.factory-name
{
max-width
:
400
upx
;
.text-nowrap{
white-space
:
nowrap
;
}
.factory-title
{
width
:
400
upx
;
overflow
:
hidden
;
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
}
}
}
.scroll-view
{
position
:
relative
;
display
:
flex
;
flex
:
1
;
width
:
100vw
;
height
:
100vh
;
.black-header
{
width
:
100%
;
height
:
340
upx
;
}
}
.data-content
{
display
:
flex
;
flex-direction
:
column
;
margin
:
0
auto
;
width
:
96%
;
.part-table
{
width
:
100%
;
box-shadow
:
0px
4px
11px
0px
rgba
(
3
,
12
,
29
,
0.28
);
border-radius
:
6px
;
opacity
:
0.99
;
background
:
#FFFFFF
;
margin-bottom
:
32
upx
;
}
.data-chart
{
width
:
100%
;
margin-bottom
:
32
upx
;
.header-title
{
width
:
100%
;
padding
:
24
upx
30
upx
20
upx
;
margin
:
0
;
background-image
:
linear-gradient
(
to
right
,
#D7EBFF
FF
,
#F7FBFF
FF
);
border-radius
:
10
upx
10
upx
0
0
;
.icon
{
width
:
40
upx
;
}
}
.circle-par
{
box-shadow
:
0px
4px
11px
0px
rgba
(
3
,
12
,
29
,
0.28
);
border-radius
:
6px
;
opacity
:
0.99
;
background
:
#FFFFFF
;
.flex-content
{
margin
:
20
upx
0
;
}
}
}
.header
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
padding
:
24
upx
0
16
upx
;
}
.content
{
border-radius
:
0
0
12
upx
12
upx
;
background-color
:
#ffffff
;
color
:
#101010
;
font-size
:
30
upx
;
border
:
1px
solid
#cecece
;
border-top
:
none
;
.part
{
display
:
flex
;
.text-title
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
height
:
56
upx
;
}
}
.part-1
{
width
:
20%
;
}
.part-2
{
width
:
24%
;
}
}
.item
{
margin-bottom
:
24
upx
;
.header-box
{
width
:
100%
;
padding
:
24
upx
20
upx
40
upx
;
margin
:
0
;
background-image
:
linear-gradient
(
to
right
,
#D7EBFF
FF
,
#F7FBFF
FF
);
border-radius
:
20
upx
20
upx
0
0
;
.icon
{
display
:
block
;
width
:
64
upx
;
max-height
:
100
upx
;
}
}
.content-box
{
position
:
relative
;
margin-top
:
-20
upx
;
width
:
100%
;
background
:
#FFFFFF
;
box-shadow
:
0px
4px
11px
0px
rgba
(
3
,
12
,
29
,
0.2
);
border-radius
:
20
upx
;
opacity
:
0.99
;
min-height
:
120
upx
;
.par-item-box
{
padding
:
0
15
upx
;
.flex-1
{
min-height
:
160
upx
;
background
:
#E8EFFB
;
border-radius
:
2px
;
margin
:
20
upx
15
upx
;
}
}
}
}
.item
:last-child
{
margin-bottom
:
120
upx
;
}
}
.u-page__item__slot-icon
{
width
:
24px
;
height
:
24px
;
}
.icon
{
width
:
36
upx
;
max-height
:
50
upx
;
margin-right
:
6
upx
;
}
.flex-center
{
display
:
flex
;
align-items
:
center
;
}
.flex-row-center
{
display
:
flex
;
flex-direction
:
row
;
align-items
:
center
;
}
.part-3
{
flex-direction
:
column
;
padding-bottom
:
120
upx
;
.content-item
{
display
:
flex
;
flex-direction
:
column
;
width
:
90%
;
margin
:
24
upx
auto
8
upx
;
padding-bottom
:
24
upx
;
.header-title
{
position
:
relative
;
width
:
100%
;
margin
:
0
;
image
{
width
:
100%
;
max-height
:
100
upx
;
}
.flex-between
{
position
:
absolute
;
top
:
0
;
left
:
12%
;
width
:
88%
;
height
:
70%
;
padding
:
0
;
justify-content
:
space-between
;
background-color
:
transparent
;
}
}
.content-box
{
position
:
relative
;
z-index
:
2
;
box-shadow
:
0
0
12
upx
rgba
(
0
,
0
,
0
,
0.34
);
border-radius
:
12
upx
;
margin-top
:
-20
upx
;
background-color
:
#ffffff
;
padding
:
24
upx
;
.part-left
{
display
:
flex
;
flex
:
1
;
.flex-1
{
display
:
flex
;
flex-direction
:
row
;
align-items
:
center
;
width
:
100%
;
}
}
.line-progress
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
width
:
40%
;
}
}
}
.content-item
:last-child
{
border-bottom
:
none
;
}
}
.content
{
.
flex-row
:
last-child
{
.
part-left
{
border-bottom
:
none
;
}
.part-right
{
border-bottom
:
none
;
}
}
.part-left
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
width
:
40%
;
border-right
:
1px
solid
#cecece
;
border-bottom
:
1px
solid
#cecece
;
padding
:
8
upx
0
;
}
.part-right
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
width
:
60%
;
border-bottom
:
1px
solid
#cecece
;
padding
:
8
upx
;
}
}
.line
{
width
:
4
upx
;
height
:
80
upx
;
background-image
:
linear-gradient
(
to
bottom
,
#ffffff
,
#C9CDD1
,
#ffffff
);
}
.border-bottom
{
border-bottom
:
1px
solid
#E0E2E4
;
}
</
style
>
\ No newline at end of file
pages/rectification/list.vue
View file @
d0cda602
...
@@ -32,7 +32,7 @@
...
@@ -32,7 +32,7 @@
<view
class=
"header-title"
@
tap=
"onNavToOrderInfo(item)"
>
<view
class=
"header-title"
@
tap=
"onNavToOrderInfo(item)"
>
<image
src=
"../../static/icon5.png"
mode=
"widthFix"
></image>
<image
src=
"../../static/icon5.png"
mode=
"widthFix"
></image>
<view
class=
"flex-between"
>
<view
class=
"flex-between"
>
<text
class=
"text-black text-bold"
>
{{
item
.
projName
}}
</text>
<text
class=
"text-black text-bold
ellipsis
"
>
{{
item
.
projName
}}
</text>
<view
class=
"margin-right text-blue"
>
<view
class=
"margin-right text-blue"
>
<text
class=
""
>
详情
</text>
<text
class=
""
>
详情
</text>
<text
class=
"cuIcon-right"
></text>
<text
class=
"cuIcon-right"
></text>
...
...
static/d_s_1.png
0 → 100644
View file @
d0cda602
2.82 KB
static/d_s_2.png
0 → 100644
View file @
d0cda602
3.01 KB
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