R语言:使用flexdashboard制作公司人力资源 dashboard

效果展示

效果如下图所示:

image-20210723170115096

image-20210723171105904

image-20210723171154979

RMD代码

---
title: "人力资源变动dashboard"
output: 
  flexdashboard::flex_dashboard:
    # storyboard: true
    # social: menu
    orientation: rows
    vertical_layout: scroll
    source: embed
    theme: journal
---
<style>                     
.navbar {
  background-color:#D87A80;
  border-color:white;
}
.navbar-brand {
color:white!important;
}
</style>

​```{r setup, include=FALSE}
library(flexdashboard)
library(readxl)
library(dplyr)
library(tidyr)
library(tidyverse)
library(leaflet)
library(echarts4r)
library(recharts)
require(knitr)
#读入数据
USA_data3<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Americas.xlsx","data")
APAC_data3<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - APAC.xlsx","data")
EU_data3<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Europe.xlsx","data")
country_coor3<-read_excel("C:/Users/asus/Desktop/R语言期末//country coord.xlsx")

#数据预处理
##清除无用数据
America3<-USA_data3[,c(-1,-4,-5,-6,-7,-14,-16)]
APAC3<-APAC_data3[,c(-1,-4,-5,-6,-7,-14,-16)]
EU3<-EU_data3[,c(-1,-4,-5,-6,-7,-14,-16)]
##绘制新表:总表、离职表、入职表
global3<-rbind(America3,APAC3,EU3)  #总表
colnames(global3)[10]<-'movement_type'
dplyr::filter(global3,movement_type=="Entry")->entry3 #入职表
dplyr::filter(global3,movement_type=="Exit")->exit3   #离职表
##新表处理
global_1=global3 %>% group_by(Country) %>% summarise(count=n())
global_1=left_join(global_1,country_coor3[,2:4],by=c("Country"="name"))
exit_1=exit3 %>% group_by(Country) %>% summarise(count=n())
exit_1=left_join(exit_1,country_coor3[,2:4],by=c("Country"="name"))
entry_1=entry3 %>% group_by(Country) %>% summarise(count=n())
entry_1=left_join(entry_1,country_coor3[,2:4],by=c("Country"="name"))
colnames(America3)[10]<-'movement_type'
number1=America3 %>% group_by(movement_type) %>% 
  summarise(count=n())
number1$location<-c("America","America")
colnames(APAC3)[10]<-'movement_type'
number2=APAC3 %>% group_by(movement_type) %>% 
  summarise(count=n())
number2$location<-c("APAC","APAC")
colnames(EU3)[10]<-'movement_type'
number3=EU3 %>% group_by(movement_type) %>% 
  summarise(count=n())
number3$location<-c("EU","EU")


#读取数据
USA_data1<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Americas.xlsx","data")
APAC_data1<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - APAC.xlsx","data")
EU_data1<-read_excel("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Europe.xlsx","data")
#数据预处理
##清除无用数据
America1<-USA_data1[,c(-1,-2,-4,-5,-6,-7,-14,-16)]
APAC1<-APAC_data1[,c(-1,-2,-4,-5,-6,-7,-14,-16)]
EU1<-EU_data1[,c(-1,-2,-4,-5,-6,-7,-14,-16)]
##绘制新表:总表、离职表、入职表
global1<-rbind(America1,APAC1,EU1)  #总表

colnames(global1)[9]<-'movement_type'
dplyr::filter(global1,movement_type=="Entry")->entry1 #入职表
#导入数据集
Americadata2 <- read_xlsx("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Americas.xlsx")
Apacdata2 <- read_xlsx("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - APAC.xlsx")
Europedata2<- read_xlsx("C:/Users/asus/Desktop/R语言期末/Regional files/HR Dashboard_v1 - Europe.xlsx")

##清除无用数据
America2<-Americadata2[,c(-1,-4,-5,-6,-7,-14)]
APAC2<-Apacdata2[,c(-1,-4,-5,-6,-7,-14)]
EU2<-Europedata2[,c(-1,-4,-5,-6,-7,-14)]

##绘制新表:总表、离职表、入职表
global2<-rbind(America2,APAC2,EU2)  #总表
colnames(global2)[11]<-'movement_type'
colnames(global2)[10]<-'manager_name'

dplyr::filter(global2,movement_type=="Entry")->entry2 #入职表
dplyr::filter(global2,movement_type=="Exit")->exit2   #离职表
colnames(exit2)[13]<-'leaving_reason'
colnames(exit2)[14]<-'attri_type'
​```
<!-- # page1 {.storyboard,data-icon="fa-user-alt"} -->
# 总览 {data-icon="fa-user-alt"}
Row {data-width=150}
--------------------------------------
### 新进总人数
​```{r}
newhires=entry3 %>%  nrow()
valueBox(value = newhires,icon = "fa-user-plus",caption = "新进人员",color = "#FFB980")
​```

### 离职总人数
​```{r}
exits=exit3 %>% nrow()
valueBox(value = exits,icon = "fa-user-minus",caption = "离职人员", color = "#5AB1EF")
​```

### 净变动
​```{r}
netchange=(newhires-exits)
#If loop to have either up-arrow or down-arrow icon on valuebox based on the value of netchange
if(netchange>0){
  valueBox(value = netchange,icon = "fa-arrow-up",caption = "净变动", color = "#2EC7C9")
} else{
valueBox(value = netchange,icon = "fa-arrow-down",caption = "净变动", color = "lightblue")}
​```

Row {data-height=300}
----------------------------------
### 各国变动情况展示 
​```{r}
#地图可视化
global_1$entrycount<-c(7,10,1,4,20,35,16)
global_1$exitcount<-c(0,5,0,0,15,15,12)
globallabels<-sprintf(
  "%s<br/>新进 %d<br/>离职%d",global_1$Country,global_1$entrycount,global_1$exitcount
)%>%
  lapply(htmltools::HTML)
entrylabels<-sprintf(
  "%s<br/>新进 %d",entry_1$Country,entry_1$count
)%>%
  lapply(htmltools::HTML)
exitlabels<-sprintf(
  "%s<br/>离职%d",exit_1$Country,exit_1$count
)%>%
  lapply(htmltools::HTML)
map<-leaflet(data=global_1) %>% addTiles() %>%
  addMarkers(~longitude,~latitude,
             label=globallabels,
             labelOptions(style=list("font-weight"="normal",padding="3px 8px"),
                          textsize = "15px",direction = "auto"),
             group = "global_1")%>%
  addCircles(data=global_1,~longitude,~latitude,color="yellow",weight=global_1$count/1,group="global_1")%>%
  addMarkers(data=entry_1,~longitude,~latitude,
             label=entrylabels,
             labelOptions(style=list("font-weight"="normal",padding="3px 8px"),
                          textsize = "15px",direction = "auto"),
             group = "entry_1")%>%
  addCircles(~longitude,~latitude,color="red",weight=global_1$entrycount/1,group="entry_1")%>%
  addMarkers(data = exit_1,~longitude,~latitude,
             label=exitlabels,
             labelOptions(style=list("font-weight"="normal",padding="3px 8px"),
                          textsize = "15px",direction = "auto"),
             group = "exit_1")%>%
  addCircles(~longitude,~latitude,color="blue",weight=global_1$exitcount/1,group="exit_1")%>%
  addLayersControl(overlayGroup=c("global_1","entry_1","exit_1"),options = layersControlOptions(collapsed = FALSE))
map

​```

Row {data-height=150}
----------------------------------
### America离职变动情况 
​```{r}
t1<-echartr(number1, movement_type,count, type='ring') %>%
  setTheme(palette=c(
     '#D87A80','#5AB1EF' ))%>%setToolbox(show=FALSE)
t1
​```
### APAC离职变动情况
​```{r}
t2<-echartr(number2, movement_type,count, type='ring') %>%
  setTheme(palette=c(
     '#D87A80','#5AB1EF' ))%>%setToolbox(show=FALSE)
t2
​```
### EU离职变动情况
​```{r}
t3<-echartr(number3, movement_type,count, type='ring') %>%
  setTheme(palette=c(
     '#D87A80','#5AB1EF' ))%>%setToolbox(show=FALSE)
t3
​```

Row {data-height=400}
----------------------------------

### 月变动情况
​```{r}
month=global3 %>% group_by(Month,movement_type) %>% 
  summarise(count=n())
month$Month<-as.character(month$Month)
####创建净流入表并合并
month1<-data.frame(Month=c("2019-01-01","2019-02-01","2019-03-01","2019-04-01","2019-05-01","2019-06-01","2019-07-01","2019-08-01","2019-09-01"),
                   movement_type=c("netinflow"),
                   count=c("1","-4","5","2","4","11","5","14","8"))
month1$count<-as.integer(month1$count)
month<-rbind(month,month1)
t4<-echartr(month, Month, count,movement_type, type='line') %>%
  setTitle('月变动情况')%>%
  setSymbols('emptycircle')%>%
   setTheme("macarons")%>%
  setToolbox(show=FALSE)
t4
​```

### 整体新进离职比例
​```{r}
number<-rbind(number1,number2,number3)
t5<-echartr(number,location,count,movement_type,type='hbar',subtype='stack')%>%
  setTitle("整体新进离职比例情况")%>%
  setTheme("macarons")%>%
  setToolbox(show=FALSE)
t5
​```






# 新入职员工分析 {data-icon="fa-user-plus"}
Row{data-height=350}
--------------
### 新入职员工国家、月份分布

​```{r}
##绘制new hired by country堆积图
#分离年月和日
entrybycountry<-entry1%>%select(c(3,4))
entrybycountry<-entrybycountry%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
  unite("yearmonth",year,month,sep='-')
##数据汇总
p1=entrybycountry%>% 
  group_by(yearmonth,Country) %>% 
  summarise(count=n())

echartr(p1, yearmonth, count, Country,type='hbar', subtype='stack') %>%
  setTitle('新入职员工国家、月份分布')%>%setTheme('macarons')%>%setToolbox(show=FALSE)
​```

### 新入职员工隶属单位分布
​```{r}
# 绘制new hired by org图
#分离年月和日
entrybyorg<-entry1%>%select(c(6,4))
entrybyorg<-entrybyorg%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
  unite("yearmonth",year,month,sep='-')
##数据汇总
p2=entrybyorg%>% 
  group_by(yearmonth,Org) %>% 
  summarise(count=n())
#绘制new hired by country堆积图
echartr(p2, yearmonth, count, Org,type='hbar', subtype='stack') %>%
  setTitle('新入职员工隶属单位分布')%>%setTheme('macarons')%>%setToolbox(show=FALSE)
​```



Row{data-height=400}
-------------
### 各经理员工流动人员分布 {data-width=1600}

​```{r}
global4<-rbind(USA_data1,APAC_data1,EU_data1)
exitbymanager <- global4%>%select(c(16,17))
names(exitbymanager)<-c("manager_name","movement_type")

p5=exitbymanager%>%
  group_by(manager_name,movement_type)%>%
  summarise(count=n())

p5$count[p5$movement_type=='Entry'] <- -p5$count[p5$movement_type=='Entry']
g <- echartr(p5, manager_name, count, movement_type, type='hbar', subtype='stack') %>%
  setTitle("各经理员工流动人员分布")%>%
  setTheme('macarons')%>%setToolbox(show=FALSE)


g %>% setYAxis(axisLine=list(onZero=TRUE)) %>% 
  setXAxis(axisLabel=list(
    formatter=JS('function (value) {return Math.abs(value);}')
  ))
​```

### 新入职员工工作许可分布

​```{r warning=FALSE}
#绘制new hired split by work authorization信息图样环图
entrybyworkauthorization<-entry1%>%select(c(14))
names(entrybyworkauthorization)<-c("workauthorization")
p3=entrybyworkauthorization%>% 
  group_by(workauthorization) %>% 
  summarise(count=n())

p3<-p3[order(p3$count, decreasing= T), ]
h1<-echartr(p3,workauthorization,count, type='ring', subtype='info') %>%
  setTheme(palette=c(
     '#D87A80','#5AB1EF', '#B6A2DE' ),width=800, height=500) %>%
  setTitle('', pos=c('center','center', 'horizontal'))%>%setToolbox(show=FALSE)
h1
​```

### 新入职员工岗位性质分布 
​```{r warning=FALSE}
#绘制new hired split by employment信息图样环图
entrybyemployment<-entry1%>%select(c(13))
names(entrybyemployment)<-c("employment_type")
p4=entrybyemployment%>% 
  group_by(employment_type) %>% 
  summarise(count=n())
p4<-p4[order(p4$count, decreasing= T), ]

h2<-echartr(p4,employment_type,count, type='ring', subtype='info') %>% 
  setTheme(palette=c(
     '#FFB980','#5AB1EF',  '#FFB980', 'limegreen', 'cyan', 'violet'),width=800, height=500)%>%
  setTitle('', pos=c('center','center', 'horizontal'))%>%setToolbox(show=FALSE)
h2
​```
# 离职员工分析 {data-icon="fa-user-minus"}
Row {data-height=300}
-----------------------------------------------------------------------

### 离职员工国家、月份分布

​```{r}
#分离年月和日
exitbycountry<-exit2%>%select(c(4,1))
exitbycountry<-exitbycountry%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
  unite("yearmonth",year,month,sep='-')


##数据汇总
a1=exitbycountry%>% 
  group_by(yearmonth,Country) %>% 
  summarise(count=n())
##绘制条形图
echartr(a1, yearmonth, count, Country,type='hbar', subtype='stack') %>%
  setTitle('离职员工国家、月份分布')%>% 
  setTheme('macarons')%>% 
  setToolbox(show=FALSE)
​```

### 离职员工隶属单位分布
​```{r}
#分离年月和日
exitbyorg<-exit2%>%select(c(7,1))
exitbyorg<-exitbyorg%>%separate(col=c(2),into =c('year','month','day'),sep ='-')%>%
  unite("yearmonth",year,month,sep='-')


##数据汇总
a2=exitbyorg%>% 
  group_by(yearmonth,Org) %>% 
  summarise(count=n())
##绘制条形图
echartr(a2, yearmonth, count, Org,type='hbar', subtype='stack') %>%
  setTitle('离职员工隶属单位分布')%>% 
  setTheme('macarons')%>% 
  setToolbox(show=FALSE)
​```

### 离职原因与类型分布
​```{r}
exitbyreasontype<-exit2%>%select(c(13,14))
a3=exitbyreasontype%>%
  group_by(leaving_reason,attri_type)%>%
  summarise(count=n())
  
echartr(a3,leaving_reason, count,facet=attri_type,type='ring') %>%
  setTitle('离职原因与类型分布')%>%
  setTheme('macarons')%>% 
  setToolbox(show=FALSE)

​```

Column {data-width=350}
-----------------------------------------------------------------------

### 离职员工在职工作时间分布 {data-width=1600}

​```{r}
file1<-exit2
colnames(file1)[5]<-'hiremonth'
Dates.exit <- cut(file1$Month, breaks = "month") 
Dates.entry <- cut(file1$hiremonth, breaks = "month") 
file1 <- data.frame(file1, Dates.entry)
file1 <- data.frame(file1, Dates.exit)

time<-c(as.Date(file1$Dates.exit)-as.Date(file1$Dates.entry))
time<-data.frame(time)
time<-data.frame(c(1:47),time)
names(time)=c('staff','days')

time$days=as.numeric(time$days)
time$staff=as.character(time$staff)


echartr(time, staff, days, type='column') %>%
  setTitle('离职员工工作时间分布')%>%
  setTheme('macarons') #%>% 
  #setToolbox(show=FALSE)
​```



### 离职员工工作许可分布

​```{r}
#信息图样环图
exitbyworkauthorization<-exit2%>%select(c(16))
names(exitbyworkauthorization)<-c("workauthorization")
a5=exitbyworkauthorization%>% 
  group_by(workauthorization) %>% 
  summarise(count=n())


a5<-a5[order(a5$count, decreasing= T), ]
a5[is.na(a5)] <-  'unknown'


a6<-echartr(a5,workauthorization,count, type='ring', subtype='info') %>% 
   setTheme(palette=c(
    '#B6A2DE', '#5AB1EF', '#FFB980', 'limegreen', 'cyan', 'violet'))%>%
  setToolbox(show=FALSE)

a6
​```


### 离职员工岗位性质分布

​```{r}
#信息图样环图
exitbyemtype<-exit2%>%select(c(15))
names(exitbyemtype)<-c("em_type")
a7=exitbyemtype%>% 
  group_by(em_type) %>% 
  summarise(count=n())


a7<-a7[order(a7$count, decreasing= T), ]



a8<-echartr(a7,em_type,count, type='ring', subtype='info') %>% 
   setTheme(palette=c(
     '#D87A80','#B6A2DE',  '#FFB980', 'limegreen', 'cyan', 'violet'))%>%
  setToolbox(show=FALSE)
a8
​```











# 整体分析{data-navmenu="分析"}

## Row{data-height=80}
### 公司整体的人员流动(新进/离职)情况怎样?哪些区域表现较好,哪些区域存在问题?

- 公司整体上人员流动呈现净流入趋势,且净流入人员呈现波动增长趋势,原因为人员新进数量波动较大,而离职数量呈现递减趋势。
- 三个地区均有人员流入流出现象,其中欧盟地区(EU)表现较好,美洲地区(America)表现次之,两者均呈现净流入趋势,APAC地区表现较差,呈现净流出趋势。

Row {data-height=400}
----------------------------------

### 月变动情况
​```{r}
t4
​```

### 整体新进离职比例
​```{r}
t5
​```


# 人员流动具体分析{data-navmenu="分析"}
## Row{data-height=120}
### 公司的新进人员情况怎样?呈现怎样的特点?

- 公司新进人员时间集中在2019年6月份和8月份.
- 新进人员最多的单位为Delivery单位,尤其以Delivery单位中由Kelly Paul负责的CelA,由Gibson Max负责的DelB,由Burgess Deirdre负责的DelC中新入职人员最多;其次是隶属于Support单位的Jackson Megan负责的Shared Se。
- 新入职人员中81.72%的员工为全职员工,78.49%的员工为当地公民,3.23%为永久居民;另外18.28%的新入职员是签了劳务合同获得工作许可证进入公司。

## Row{data-height=120}
### 公司的人员离职情况怎样?呈现怎样的特点?

- 公司人员离职员工均为全职员工(full time employee),离职员工数量呈现逐年递减趋势。
离职人员最多的单位与新进人员最多的单位相同,均为Delivery和Support单位,但与新进情况不同的是,在Delivery单位中,离职人数最多的为Gibson Max负责的DelB以及Burgess Deirdre负责的DelC,由Kelly Paul负责的CelA项目,人员稳定性较好。
- 离职员工中自愿离职与非自愿离职的比例为40:7,其中自愿离职的员工多是由于工作机会与补偿原因不满意,非自愿离职员工中,超半数的人是因为工作项目结束而离职。
- 通过离职员工的在职时间分布可看出:大多数员工的在职时间为1500天左右。

Row {data-height=235}
----------------------------------

### India员工流动工作室分布
​```{r}
dplyr::filter(APAC2,Country=="India")->APAC2India

Indiastudio <- APAC2India%>%select(c(3,11))
colnames(Indiastudio)[2]<-'Movement_Type'

a11=Indiastudio %>%
  group_by(Studio,Movement_Type)%>%
  summarise(count=n())

a11$count[a11$Movement_Type=='Exit'] <- -a11$count[a11$Movement_Type=='Exit']
a12 <- echartr(a11, Studio, count,Movement_Type, type='hbar', subtype='stack') %>%
  setTitle("India员工流动工作室分布")%>%
  setTheme('macarons')


a12 %>% setYAxis(axisLine=list(onZero=TRUE)) %>% 
  setXAxis(axisLabel=list(
    formatter=JS('function (value) {return Math.abs(value);}')
  ))
​```

### Europe人员流动工作室分布
​```{r}
EUstudio <- EU2%>%select(c(3,11))
colnames(EUstudio)[2]<-'Movement_Type'

a13=EUstudio %>%
  group_by(Studio,Movement_Type)%>%
  summarise(count=n())

a13$count[a13$Movement_Type=='Exit'] <- -a13$count[a11$Movement_Type=='Exit']
a14 <- echartr(a13, Studio, count,Movement_Type, type='hbar', subtype='stack') %>%
  setTitle("Europe员工流动工作室分布")%>%
  setTheme('macarons')


a14 %>% setYAxis(axisLine=list(onZero=TRUE)) %>% 
  setXAxis(axisLabel=list(
    formatter=JS('function (value) {return Math.abs(value);}')
  ))
​```




# 问题、趋势发现以及建议{data-navmenu="分析"}
Row {data-height=120}
---------
### 人员数据反映出公司的人员新进和离职流动有无需要改进之处?
- 公司应加强员工福利待遇,并改善工作体系,为优秀员工预留晋升空间,以减少优秀人员流出。
- 公司可开展优秀工作室表彰、优秀经理表彰工作以及通告批评会,对表现突出的工作室及经理,如Baia Mare工作室,负责CelA项目的Kelly Paul经理,通过工作绩效表彰来增强员工的归属感、认同感,鼓励优秀员工,激发员工干劲及潜力;但对于工作懈怠者、纪律违反者也应加强通报警告,让全体员工引以为戒,整顿公司风气。
- 开展经验交流会,公司各子公司之间交流管理经验以及项目攻克经验,促进子公司之间的交流,带动公司整体向上发展。

Row {data-height=270}
---------
### 现有数据集还能揭示公司人员流动的哪些新问题、新趋势,值得公司领导重视?
- America地区:进一步观察发现,America区域的canada,Brazil,Argentina这三个国家没有人员流出,但相应的,其新进人数也是最少,可推测当地公司人员数量较为精简,公司待遇较好,整体凝聚力强,公司领导可关注公司在该地区的发展状况,合理改进公司资源倾斜情况。
- EU地区:Romania的新进以及离职人数均为最多,人员流动性强,稳定性较弱,但整体呈现净流入趋势。从员工的离职原因中可看出Romania地区人员为追求更好地晋升机会以及补偿待遇而自愿离职。
在EU地区所有的工作室(Studio)中,Baia Mare,Bucuresti,Iasi,Remote,Timisoara仅有新进人员,推测原因可能是工作室待遇较好或者工作室因人员稀缺而扩招;其余工作室中仅有Cluj-Napoca工作室没有新进职员,推测可能是由于员工已饱和,或者工作室待遇未能达到寻职者的要求;公司领导可在进一步考察原因后做出在当地区域的战略调整。
- APAC地区:Australia的新进职员均为contractor(合同)类型,该类型可保证人员流动在一定时间段的稳定性;India的离职员工全部隶属Mysore工作室,当地领导可靠查当地区其他类似公司职员的福利待遇,根据自身工作室的情况合理进行福利改善。
- 公司整体:从员工的新进以及离职情况可看出,全职员工(full time employee)是造成公司人员变动的主力,这类员工由于有足够的工作变动自由,会为了自身发展以及待遇而选择辞职,但这类员工也是公司的主体员工,公司领导应注意倾听他们的工作体验,降低这类员工的离职率,从而改进公司的人员流动情况。

生成的dashboard(html文件)下载

链接如下:

html下载链接

一些说明

  • 在数据可视化中我们使用了百度的Echart进行绘图。

  • 我们的dashboard由三人完成,所以在代码上存在冗余,请见谅。

  • 大家如有问题和建议可以在评论区指出。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值