在日常的数据工作中,常会碰到需要上传配置数据的情况,比如字典表、指定特定的用户或商品等。若能快速地做出相应的配置后台,只需在浏览器上就能上传数据,既方便自己,更重要的是还能够开放给需要的业务人员自己去管理。
这里分享一个用R快速搭建配置后台的方式,借助R的shiny包,能方便的做出这个web应用。
这个简单的配置管理后台具有两个模块:1、查询现有的配置列表2、上传更新配置列表
OK,下面开始coding。
首先,载入用到的包。这里使用xlsx上传数据,因为对于业务人员来说excel更通用,远端数据库用的是MySQL。这里你完全可以根据自己的需要修改。
library(shiny)
library(xlsx)
library(RMySQL)
接着,进行必要的信息配置。首先,在数据库中新建表,并定义字段,这是用来存储配置数据的。
yourtable <- "tmp_peizhi_test_yueshi" #此处修改为对应的表名
# 配置数据库连续信息
host <- "xxxx"
user <- "yueshi"
password <- "VcXDBcGEC1aI"
port <- 3305
dbname <- "test"
然后,开始进行shiny的部分,shiny的代码包括ui和server两个主模块。
ui采用navbarPage的布局,分别建立两个tabPanel,对应"现有配置列表"和"上传配置"。为了保证上传的数据符合规范,这里设计提供上传模板,让用户下载模板后,按模板上传数据即可。在成功上传后,会提示上传成功状态,并说明数据位置,同时在右侧展示新上传的配置数据。
以上提到的这些,在ui上的代码其实很简短,如下。
# ui----------------------------------
ui <- shinyUI(navbarPage(
"配置管理",
tabPanel(
"现有配置列表",
dataTableOutput("t1")
),
tabPanel("下载及上传配置", sidebarLayout(
sidebarPanel(
downloadButton("downloadData",
"下载数据及模板"),
br(),
br(),
fileInput("file1",
"按模板上传xlsx文件", accept = c(".xlsx")),
p("覆盖更新,请全量上传"),
verbatimTextOutput("suss")
),
mainPanel(tableOutput("content"))
))
))
server上的代码看起来稍微多一些,主要是数据库的连接关闭部分,但实际上依然只是用到几个固定的函数。
# server----------------------------
server <- shinyServer(function(input, output) {
# 数据库查询
con <- dbConnect(
drv = MySQL(),
host = host,
user = user,
password = password,
port = port,
dbname = dbname
)
dbSendQuery(con, "set names utf8")
t <- dbGetQuery(con, paste("select * from",yourtable))
dbDisconnect(con)
# 显示查询结果
output$t1 <- renderDataTable(t)
# 下载模板
output$downloadData <- downloadHandler(
filename = "dl.xlsx",
content = function(file) {
write.xlsx(t,file,row.names = F,showNA=F)
}
)
# 显示上传数据
output$content <- renderTable({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
read.xlsx(inFile$datapath,1)
})
# 更新数据库表
output$suss <- renderText({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
t_new <- read.xlsx(inFile$datapath,1)
con <- dbConnect(
drv = MySQL(),
host = host,
user = user,
password = password,
port = port,
dbname = dbname
)
dbSendQuery(con, "set names utf8")
dbWriteTable(
con,
name = yourtable,
t_new,
# 可选,定义字段类型
# field.types=list(source_mark='varchar(255)',username='varchar(255)',phone='bigint'),
overwrite = T, # 覆盖模式
row.names = F
)
dbDisconnect(con)
print(paste0("更新成功,查询请刷新页面。表:",yourtable))
})
})
最后,因为我是将ui和server集中在一个脚本中,所以需要配置shinyApp。
shinyApp(ui,server)
以上就是coding的部分,之后可以重复使用,只需3个步骤:
1、在mysql的xxxx.test库(根据实际情况)里新建表,并定义字段
2、将此脚本中的yourtable修改为你自己的表名
3、脚本上传到shinyserver的指定目录(需服务器操作)