Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
X
xiaomai-cloud-class-web
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xiaomai-cloud-class
xiaomai-cloud-class-web
Commits
a8b87dd6
Commit
a8b87dd6
authored
Feb 24, 2021
by
chenshu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:初始化数据面板
parent
30fd2e03
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
509 additions
and
3 deletions
+509
-3
src/domains/basic-domain/constants.ts
+1
-1
src/h5.html
+1
-1
src/index.html
+1
-1
src/modules/home/Home.jsx
+270
-0
src/modules/home/Home.less
+224
-0
src/routes/config/mainRoutes.tsx
+6
-0
src/routes/config/menuList.tsx
+6
-0
No files found.
src/domains/basic-domain/constants.ts
View file @
a8b87dd6
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
import
{
MapInterface
}
from
'@/domains/basic-domain/interface'
import
{
MapInterface
}
from
'@/domains/basic-domain/interface'
// 默认是 dev 环境
// 默认是 dev 环境
const
ENV
:
string
=
process
.
env
.
DEPLOY_ENV
||
'
prod
'
;
const
ENV
:
string
=
process
.
env
.
DEPLOY_ENV
||
'
dev
'
;
console
.
log
(
"process.env.DEPLOY_ENV"
,
process
)
console
.
log
(
"process.env.DEPLOY_ENV"
,
process
)
const
BASIC_HOST_MAP
:
MapInterface
=
{
const
BASIC_HOST_MAP
:
MapInterface
=
{
dev
:
'https://dev-heimdall.xiaomai5.com/'
,
dev
:
'https://dev-heimdall.xiaomai5.com/'
,
...
...
src/h5.html
View file @
a8b87dd6
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
-->
<link
rel=
"manifest"
href=
"%PUBLIC_URL%/manifest.json"
/>
<link
rel=
"manifest"
href=
"%PUBLIC_URL%/manifest.json"
/>
<link
rel=
"stylesheet"
href=
"//at.alicdn.com/t/font_2223403_
qb6r10go4s
.css"
>
<link
rel=
"stylesheet"
href=
"//at.alicdn.com/t/font_2223403_
80qwxi5x2ed
.css"
>
<!--
<!--
Notice the use of %PUBLIC_URL% in the tags above.
Notice the use of %PUBLIC_URL% in the tags above.
...
...
src/index.html
View file @
a8b87dd6
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
-->
<link
rel=
"manifest"
href=
"%PUBLIC_URL%/manifest.json"
/>
<link
rel=
"manifest"
href=
"%PUBLIC_URL%/manifest.json"
/>
<link
rel=
"stylesheet"
href=
"//at.alicdn.com/t/font_2223403_
qb6r10go4s
.css"
>
<link
rel=
"stylesheet"
href=
"//at.alicdn.com/t/font_2223403_
80qwxi5x2ed
.css"
>
<!--
<!--
Notice the use of %PUBLIC_URL% in the tags above.
Notice the use of %PUBLIC_URL% in the tags above.
...
...
src/modules/home/Home.jsx
0 → 100644
View file @
a8b87dd6
import
React
from
'react'
;
import
{
Select
}
from
'antd'
;
import
moment
from
'moment'
import
Service
from
"@/common/js/service"
;
import
User
from
'@/common/js/user'
;
import
'./Home.less'
;
const
Option
=
Select
.
Option
;
class
Home
extends
React
.
Component
{
constructor
(
props
)
{
super
(
props
);
this
.
state
=
{
scheduleType
:
'LIVE'
,
list
:
[],
dataList
:
[],
incCustomerNum
:
0
,
incLiveCourseNum
:
0
,
incVideoCourseNum
:
0
,
liveCourseNum
:
0
,
totalCustomerNum
:
0
,
videoCourseNum
:
0
,
timeRange
:
'7'
,
studyTimeRange
:
'7'
,
}
}
componentDidMount
()
{
this
.
getPanelInfo
();
this
.
getStudyInfo
();
this
.
getHotCourse
();
}
getHotCourse
()
{
const
{
timeRange
,
scheduleType
}
=
this
.
state
;
const
data
=
{
hotNum
:
5
,
scheduleType
,
storeId
:
User
.
getStoreId
(),
timeRange
,
}
Service
.
Hades
(
'public/courseCloud/hotCourse'
,
data
).
then
((
res
)
=>
{
if
(
res
.
success
)
{
this
.
setState
({
list
:
res
.
result
})
}
})
}
getStudyInfo
()
{
const
{
studyTimeRange
}
=
this
.
state
;
Service
.
Hades
(
'public/hades/studyInfo'
,
{
storeId
:
User
.
getStoreId
(),
timeRange
:
studyTimeRange
}).
then
((
res
)
=>
{
if
(
res
.
success
)
{
this
.
setState
({
dataList
:
res
.
result
})
}
});
}
getPanelInfo
()
{
Service
.
Hades
(
'public/hades/storePanelInfo'
,
{
storeId
:
User
.
getStoreId
()
}).
then
((
res
)
=>
{
if
(
res
.
success
)
{
this
.
setState
({
incCustomerNum
:
res
.
result
.
incCustomerNum
,
incLiveCourseNum
:
res
.
result
.
incLiveCourseNum
,
incVideoCourseNum
:
res
.
result
.
incVideoCourseNum
,
liveCourseNum
:
res
.
result
.
liveCourseNum
,
totalCustomerNum
:
res
.
result
.
totalCustomerNum
,
videoCourseNum
:
res
.
result
.
videoCourseNum
,
})
}
})
}
showNumber
(
index
)
{
switch
(
index
)
{
case
0
:
return
'https://image.xiaomaiketang.com/xm/D64QhNn74S.png'
;
case
1
:
return
'https://image.xiaomaiketang.com/xm/Qfib4mnGJT.png'
;
case
2
:
return
'https://image.xiaomaiketang.com/xm/8jKXHyrDaG.png'
;
default
:
return
'https://image.xiaomaiketang.com/xm/D64QhNn74S.png'
;
}
}
render
()
{
const
{
list
,
incCustomerNum
,
incLiveCourseNum
,
incVideoCourseNum
,
liveCourseNum
,
totalCustomerNum
,
videoCourseNum
,
timeRange
,
scheduleType
,
}
=
this
.
state
;
return
(
<
div
className=
"home-page"
>
<
div
className=
"home-title"
>
数据概况
</
div
>
<
div
className=
"data-box"
>
<
div
className=
"data-item"
>
<
div
className=
"header"
>
<
img
className=
"header-icon"
src=
"https://image.xiaomaiketang.com/xm/wAaFtjeRsM.png"
/>
<
span
className=
"header-word"
>
用户总数 (人)
</
span
>
</
div
>
<
div
className=
"data-number"
>
{
totalCustomerNum
}
</
div
>
<
div
className=
"data-footer"
>
<
span
className=
"footer-word"
>
本月新增
</
span
>
{
incCustomerNum
>
0
&&
<
span
className=
"icon iconfont"
>

</
span
>
}
<
span
className=
"footer-number"
>
{
incCustomerNum
}
</
span
>
</
div
>
</
div
>
<
div
className=
"data-item course-data"
>
<
div
className=
"header"
>
<
img
className=
"header-icon"
src=
"https://image.xiaomaiketang.com/xm/jPrRhw8EMF.png"
/>
<
span
className=
"header-word"
>
课程总数 (个)
</
span
>
</
div
>
<
div
className=
"data-number"
>
{
videoCourseNum
+
liveCourseNum
}
</
div
>
<
div
className=
"course-box"
>
<
div
className=
"course-item"
>
<
div
className=
"course-title"
>
直播课
</
div
>
<
div
className=
"data"
>
<
span
className=
"course-number"
>
{
liveCourseNum
}
</
span
>
<
span
className=
"course-word"
>
本月新增
</
span
>
{
incLiveCourseNum
>
0
&&
<
span
className=
"icon iconfont"
>

</
span
>
}
<
span
className=
"add-number"
>
{
incLiveCourseNum
}
</
span
>
</
div
>
</
div
>
<
div
className=
"course-item"
>
<
div
className=
"course-title"
>
视频课
</
div
>
<
div
className=
"data"
>
<
span
className=
"course-number"
>
{
videoCourseNum
}
</
span
>
<
span
className=
"course-word"
>
本月新增
</
span
>
{
incVideoCourseNum
>
0
&&
<
span
className=
"icon iconfont"
>

</
span
>
}
<
span
className=
"add-number"
>
{
incVideoCourseNum
}
</
span
>
</
div
>
</
div
>
<
div
className=
"course-item"
>
<
div
className=
"course-title"
>
图文课
</
div
>
<
div
className=
"data"
>
<
span
className=
"course-number"
>
0
</
span
>
<
span
className=
"course-word"
>
本月新增
</
span
>
{
false
&&
<
span
className=
"icon iconfont"
>

</
span
>
}
<
span
className=
"add-number"
>
0
</
span
>
</
div
>
</
div
>
<
div
className=
"course-item"
>
<
div
className=
"course-title"
>
线下课
</
div
>
<
div
className=
"data"
>
<
span
className=
"course-number"
>
0
</
span
>
<
span
className=
"course-word"
>
本月新增
</
span
>
{
false
&&
<
span
className=
"icon iconfont"
>

</
span
>
}
<
span
className=
"add-number"
>
0
</
span
>
</
div
>
</
div
>
</
div
>
</
div
>
<
div
className=
"data-item"
>
<
div
className=
"header"
>
<
img
className=
"header-icon"
src=
"https://image.xiaomaiketang.com/xm/jZf3GNY5tY.png"
/>
<
span
className=
"header-word"
>
培训计划总数 (个)
</
span
>
</
div
>
<
div
className=
"data-number"
>
0
</
div
>
<
div
className=
"data-footer"
>
<
span
className=
"footer-word"
>
本月新增
</
span
>
{
false
&&
<
span
className=
"icon iconfont"
>

</
span
>
}
<
span
className=
"footer-number"
>
0
</
span
>
</
div
>
</
div
>
<
div
className=
"data-item"
>
<
div
className=
"header"
>
<
img
className=
"header-icon"
src=
"https://image.xiaomaiketang.com/xm/3CfrPs23Re.png"
/>
<
span
className=
"header-word"
>
考试总数 (个)
</
span
>
</
div
>
<
div
className=
"data-number"
>
0
</
div
>
<
div
className=
"data-footer"
>
<
span
className=
"footer-word"
>
本月新增
</
span
>
{
false
&&
<
span
className=
"icon iconfont"
>

</
span
>
}
<
span
className=
"footer-number"
>
0
</
span
>
</
div
>
</
div
>
</
div
>
<
div
className=
"home-title"
>
学习概况
</
div
>
<
div
className=
"study-box"
>
<
div
className=
"study-item"
>
<
div
className=
"study-title"
>
课程学习排行榜
</
div
>
<
div
className=
"study-header"
>
<
div
className=
"study-tab"
>
<
span
className=
{
`tab${scheduleType === 'LIVE' ? ' selected' : ''}`
}
onClick=
{
()
=>
this
.
setState
({
scheduleType
:
'LIVE'
},
()
=>
this
.
getHotCourse
())
}
>
直播课
</
span
>
<
span
className=
{
`tab${scheduleType === 'VOICE' ? ' selected' : ''}`
}
onClick=
{
()
=>
this
.
setState
({
scheduleType
:
'VOICE'
},
()
=>
this
.
getHotCourse
())
}
>
视频课
</
span
>
</
div
>
<
div
className=
"study-select"
>
<
span
className=
"select-word"
>
(
{
moment
().
subtract
(
timeRange
,
'day'
).
format
(
'MM.DD'
)
}
~
{
moment
().
format
(
'MM.DD'
)
}
)
</
span
>
<
Select
style=
{
{
width
:
88
}
}
value=
{
timeRange
}
onChange=
{
(
value
)
=>
{
this
.
setState
({
timeRange
:
value
},
()
=>
this
.
getHotCourse
());
}
}
>
<
Option
value=
"7"
>
近7天
</
Option
>
<
Option
value=
"15"
>
近15天
</
Option
>
<
Option
value=
"30"
>
近30天
</
Option
>
</
Select
>
</
div
>
</
div
>
{
_
.
isEmpty
(
list
)
?
<
div
className=
"study-empty"
>
<
img
src=
"https://image.xiaomaiketang.com/xm/7fNziTkEaA.png"
/>
<
div
>
暂无课程上榜
</
div
>
</
div
>
:
list
.
map
((
item
,
index
)
=>
(
<
div
className=
{
`table-item${index % 2 ? '' : ' odd'}`
}
key=
{
item
.
id
}
>
{
index
<
3
?
<
img
src=
{
this
.
showNumber
(
index
)
}
className=
"table-image"
/>
:
<
span
className=
"table-number"
>
{
index
+
1
}
</
span
>
}
<
div
className=
"table-data"
>
<
div
className=
"table-name"
>
{
item
.
courseName
}
</
div
>
<
div
className=
"table-tag"
>
{
item
.
categoryName
}
</
div
>
</
div
>
<
span
className=
"table-study"
>
{
item
.
studyNum
||
0
}
人已学习
</
span
>
</
div
>
))
}
</
div
>
<
div
className=
"study-item"
>
<
div
className=
"study-title"
>
培训计划完成情况
<
span
></
span
>
</
div
>
</
div
>
</
div
>
<
div
className=
"study-chart"
>
<
div
className=
"study-title"
>
学习人数与时长
</
div
>
</
div
>
</
div
>
)
}
}
export
default
Home
;
\ No newline at end of file
src/modules/home/Home.less
0 → 100644
View file @
a8b87dd6
.home-page {
padding: 0 16px 16px;
min-width: 1100px;
.home-title {
height: 44px;
line-height: 44px;
color: #999;
}
@font-face {
font-family: 'number';
src: url('https://image.xiaomaiketang.com/xm/n2sADd2jY6.TTF');
}
.data-box {
display: flex;
justify-content: space-between;
.data-item {
position: relative;
height: 156px;
background: #fff;
width: ~'calc(16.67% - 8px)';
padding: 16px;
&.course-data {
width: ~'calc(50% - 24px)';
}
.header {
display: flex;
.header-icon {
width: 18px;
height: 18px;
margin-right: 4px;
}
.header-word {
display: inline-block;
font-size: 12px;
line-height: 18px;
color: #999;
}
}
.data-number {
font-family: 'number';
font-size: 28px;
color: #333;
margin-top: 24px;
}
.data-footer {
margin-top: 12px;
.footer-word {
font-size: 12px;
color: #999;
margin-right: 8px;
}
.iconfont {
font-size: 12px;
margin-right: 4px;
color: #EC4B35;
}
.footer-number {
font-size: 12px;
color: #999;
}
}
.course-box {
border-radius: 4px;
background: #FAFAFA;
height: 124px;
width: 66%;
position: absolute;
right: 16px;
top: 16px;
padding: 8px 24px 0;
.course-item {
display: inline-block;
width: 50%;
padding: 4px 0 12px;
.course-title {
font-size: 12px;
color: #999;
}
.data {
display: flex;
align-items: center;
.course-number {
font-size: 16px;
font-family: 'number';
margin-right: 16px;
}
.course-word {
font-size: 12px;
color: #999;
margin-right: 8px;
}
.iconfont {
font-size: 12px;
margin-right: 4px;
color: #EC4B35;
}
.add-number {
font-size: 12px;
color: #999;
}
}
}
}
}
}
.study-box {
display: flex;
justify-content: space-between;
.study-item {
height: 414px;
background: #fff;
width: ~'calc(50% - 8px)';
padding: 16px;
.study-title {
font-size: 16px;
color: #333;
font-weight: 500;
line-height: 22px;
margin-bottom: 12px;
}
.study-header {
display: flex;
justify-content: space-between;
margin-bottom: 16px;
.study-tab {
.tab {
position: relative;
padding-right: 24px;
color: #666;
cursor: pointer;
&.selected {
color: #FDB513;
&::after {
position: absolute;
width: 24px;
height: 2px;
content: '';
background: #FDB513;
border-radius: 1px;
left: 9px;
bottom: -4px;
}
}
}
}
.study-select {
.select-word {
color: #999;
margin-right: 8px;
}
}
}
.table-item {
width: 100%;
height: 60px;
display: flex;
align-items: center;
&.odd {
background: #FAFAFA;
}
.table-image {
width: 24px;
height: 24px;
margin: 0 16px;
}
.table-number {
width: 10%;
color: #999;
padding: 0 16px;
}
.table-data {
width: 60%;
padding: 0 16px;
.table-name {
color: #333;
line-height: 20px;
margin-bottom: 2px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.table-tag {
line-height: 17px;
color: #999;
font-size: 12px;
}
}
.table-study {
width: 30%;
color: #999;
padding: 0 16px;
}
}
.study-empty {
margin-top: 102px;
img {
display: block;
width: 100px;
height: 100px;
margin: 0 auto 8px;
}
div {
text-align: center;
color: #333;
}
}
}
}
.study-chart {
width: 100%;
height: 396px;
background: #fff;
padding: 16px;
margin-top: 16px;
.study-title {
font-size: 16px;
color: #333;
font-weight: 500;
line-height: 22px;
margin-bottom: 12px;
}
}
}
\ No newline at end of file
src/routes/config/mainRoutes.tsx
View file @
a8b87dd6
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
* @LastEditTime: 2021-01-18 21:23:08
* @LastEditTime: 2021-01-18 21:23:08
* @Description: 内容线路由配置
* @Description: 内容线路由配置
*/
*/
import
Home
from
'@/modules/home/Home'
;
import
EmployeesManagePage
from
'@/modules/store-manage/EmployeesManagePage'
;
import
EmployeesManagePage
from
'@/modules/store-manage/EmployeesManagePage'
;
import
personalInfoPage
from
'@/modules/personalInfo'
;
import
personalInfoPage
from
'@/modules/personalInfo'
;
import
UserManagePage
from
'@/modules/store-manage/UserManagePage'
;
import
UserManagePage
from
'@/modules/store-manage/UserManagePage'
;
...
@@ -21,6 +22,11 @@ import SwitchRoute from '@/modules/root/SwitchRoute';
...
@@ -21,6 +22,11 @@ import SwitchRoute from '@/modules/root/SwitchRoute';
const
mainRoutes
=
[
const
mainRoutes
=
[
{
{
path
:
'/home'
,
component
:
Home
,
name
:
'中心首页'
},
{
path
:
'/employees-manage'
,
path
:
'/employees-manage'
,
component
:
EmployeesManagePage
,
component
:
EmployeesManagePage
,
name
:
'员工管理'
name
:
'员工管理'
...
...
src/routes/config/menuList.tsx
View file @
a8b87dd6
export
const
menuList
:
any
=
[
export
const
menuList
:
any
=
[
{
{
groupName
:
"中心首页"
,
groupCode
:
"CloudPage"
,
icon
:
''
,
link
:
'/home'
},
{
groupName
:
"课程管理"
,
groupName
:
"课程管理"
,
groupCode
:
"CloudCourse"
,
groupCode
:
"CloudCourse"
,
icon
:
''
,
icon
:
''
,
...
...
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