Symmetric Web Server






4.95/5 (12投票s)
轻量级 SQL 和 HTML Web 服务器报告。
引言
Symmetric Web Server 是一款轻量级的 SQL & HTML Web 服务器报表工具。该工具为用户提供了一种在本地网络上访问 SQL 报表的便捷方式,无需配置整个 Web 服务器。Web 服务器还支持用户账户管理。REST 接口(API)为用户与第三方应用程序的集成提供了能力。
此应用程序的优点包括:
- 易于部署
- 集中式配置
- 可定制的报表模板创建
- 以 HTML 格式显示和打印报表
- 支持 MySQL 和 MSSQL 数据库
- 集成的用户账户和安全管理
- 面向用户的 REST 接口(API)
背景
我在一家从事楼宇自动化(控制和监控建筑内的 PLC)的公司工作。我过去曾与部署的应用程序一起编写 SQL 报表。这些应用程序会接受用户输入并将数据输出到数据表中。我发现这些应用程序的报表仅限于其所在的 PC 可用,这使得报表的部署变得困难。这种方法的另一个限制是它不够动态,意味着每次客户需要新报表时,我都必须为用户输入字段和数据布局进行编程。然后,我决定创建自己的报表解决方案,该方案易于使用,并且可以方便地部署在可以存储报表的中央位置。
下面是我过去制作报表的示例。用户可以输入所需的时间范围,然后点击“Go”在数据表中显示结果。当您点击“Print”按钮时,会打开一个包含数据表的 HTML 报表。
所用库的概述
在编写此应用程序时,我使用了一些第三方库。首先,它是用 C# 编写的,不仅打算在 Windows 的 .NET 中运行,还打算在 Linux 和 Mac 的 Mono 中运行。我还没有将此应用程序移植过去,但正在进行中。我还使用了 Nancy (http://nancyfx.org/),这是一个用 C# 编写的轻量级 Web 服务器(这是我用过的最好、最有趣的rible 代码之一)。我还使用了 Bootstrap (https://bootstrap.ac.cn/) 和一个 Metro 主题 (http://talkslab.github.io/) 来美化我的网页。
使用应用程序
启动服务器
打开应用程序后,您会在系统托盘中看到一个弹出气球,提示服务器已启动。如果服务器未启动,您可以在应用程序文件夹下的“WebServer_MESSAGE.txt”中查看日志。
双击图标会在浏览器中打开 Web 服务器,右键单击图标则提供**打开**服务器、**重新启动**服务器、查看**关于**屏幕或**关闭**服务器的选项。
现在可以使用默认账户:“Admin”并留空密码来登录服务器。
环境设置
要访问此页面,请转到管理面板 > 环境设置。
环境设置允许您配置 Web 服务器要使用的网络 IP 地址。例如,如果计算机有 3 个网络接口卡,即 3 个不同的 IP 地址,如果希望同一网络上的计算机能够访问您的 Web 服务器,则必须在 Web 服务器上启用这些不同的网络接口卡。
从环境设置页面,您还可以设置服务器启动时使用的端口;服务器是否必须在系统登录时启动;以及 `getusers` REST 方法是否已公开(此 REST 方法将在后面的“REST 用户界面”部分进行解释)。
注意:请记住允许在防火墙中开放该端口。
服务器状态
要访问此页面,请转到管理面板 > 服务器状态。
在此,您可以查看服务器正在使用的 IP 地址。
用户
要访问此页面,请转到导航栏上的用户链接。
在此,您可以添加/编辑和删除用户。
默认管理员用户
由于默认管理员没有密码,因此这是您应该首先更改的内容。单击管理员账户的编辑按钮并更改密码。
用户说明
所有用户都存储在应用程序目录的“Web_Content”文件夹中的一个名为“user.db
”的 SQLite 数据库中。每个用户都有一个与之关联的安全级别。默认管理员账户无法删除,安全级别为 100(可用最高安全级别)。
有不同级别的安全级别:
- 0 - 19:初级操作员(可查看报表)
- 20 - 39:高级操作员(可查看报表)
- 40 - 59:主管(可查看报表)
- 60 - 79:经理(可查看报表并管理用户)
- 80 - 100:管理员(可查看报表、管理用户和管理报表)
如果您的安全级别允许,登录服务器将使您能够管理用户。您无法删除自己的账户,无法调整自己的安全级别,也无法添加或编辑安全级别高于您的用户。
REST 用户界面
我在 Web 服务器的用户部分包含了一个 REST 接口。这样做的目的是让开发人员可以在他们自己的应用程序中使用这些用户。
这些是 REST 方法:
getbasicusers
(GET
) - 获取所有用户的基本属性(不含密码)getusers
(GET
) - 获取用户的全部属性,包括密码(以 SHA256 格式存储)。注意:此 REST 方法必须从您的环境设置中启用。remotelogin
(POST
) - 登录服务器remotelogout
(POST
) - 退出服务器deleteuser
(POST
) - 删除用户addedituser
(POST
) - 添加或编辑用户readuserlastupdated
(GET
) - 获取 `user.db` 文件最后更新时间
创建报表
在本节中,我将快速概述如何创建报表。请注意,只有管理员可以创建报表。
您创建的每个报表都必须链接到一个连接项、一个 HTML 模板,并且可以选择链接到一个 HTML 表单。
我认为通过示例解释事物是最好的方式,因此我将使用“Northwind
”数据库创建一个报表。此示例以及其他报表示例可以在 github 仓库的“Northwind Example”文件夹中找到。
连接
首先,设置连接。转到管理面板 > 报表 > 管理连接。
在这里,您可以创建到 MySQL 或 MSSQL 数据库的连接。
在这里,我已经连接到了我本地 PC 上的 Northwind 数据库。
表单
下一步是设置一个表单(这是可选的)。转到管理面板 > 报表 > 管理表单。
表单是报表中用于用户向 HTML 模板输入数据的部分。
表单可以使用不同类型的标签进行输入,即:
inputdate
- 用于用户选择日期inputtext
- 用于用户输入文本select
- 用于用户从组合框中选择一项。当您转到管理报表部分时,将能够为此组合框定义 SQL 查询。SQL 查询的格式如下:select [id], [要显示的名称] from [表]
。`select` 必须有 2 列,第一列必须是 id,第二列必须是要显示的名称(即用户将使用的名称)。var
- 这是在管理报表阶段输入的。管理员使用它来输入要显示在表单上的文本。
注意:标签名称在表单页面上可用。
所以,我创建了一个包含 `var` 标签和一个 `select` 标签的简单表单。
此表单的输出将如下所示:
我在“管理报表”部分将 `var` 标签命名为 `var1`,并将名称输入为“Customers
”。“管理报表”部分还要求我为 `select` 标签输入 SQL 查询,因此我输入了“SELECT customerid, contactname FROM customers
”,这符合 select SQL 格式。
模板
下一步是设置模板。转到管理面板 > 报表 > 管理模板。
模板是报表中用于将实际数据回显给用户的部分。
模板可以使用不同类型的标签来显示数据,即:
date
- 用于显示当前日期。inputtext
- 用于显示表单的文本输入。如果表单中的文本输入与模板中的文本输入同名,则模板将显示该值。inputdate
- 用于显示表单的日期输入。如果表单中的日期输入与模板中的日期输入同名,则模板将显示该值。select
- 用于显示表单的 `select`。如果表单中的 `select` 与模板中的 `select` 同名,则模板将显示所选项目的显示名称。var
- 这是在“管理报表”阶段输入的。管理员使用它来输入要显示在模板上的文本。query
- 这将创建一个要显示给用户的数据表。在“管理报表”部分,可以编写 SQL 查询来填充此处表格。
要向模板添加图像,可以引用“report_resources”文件夹中的文件。
在下面的示例中,我添加了一个图像“/report_resources/northwindlogo.png”;一个名为 `var1` 的 `var` 标签,将在创建实际报表时使用;一个名为 `select1` 的 `select` 标签,将用于显示从表单中选择的项目;一个 `date` 标签,将显示当前日期;最后是一个名为 `query1` 的 `query` 标签,它将用 SQL 结果填充 HTML 表。
此模板的输出将如下所示:
我在“管理报表”部分将 `var` 标签命名为 `var1`,并输入名称“Customers
”。`date` 标签显示当前日期。名为 `select1` 的 `select` 标签显示了我在表单中选择的项目。最后,“管理报表”部分要求我为名为 `query1` 的 `query` 标签输入 SQL 查询,我输入了:
"SELECT [CustomerID] AS ID
,[CompanyName] AS [Company Name]
,[ContactName] AS [Name]
,[Country] AS [Country]
FROM [dbo].[Customers]
WHERE customerID = @select1".
列被赋予了别名。我还选择 `customerid` 等于 `select1` 的地方,这是表单中 `select1` 标签的选定项目 ID。
报告
最后,您必须设置实际报表。转到管理面板 > 报表 > 管理报表。
这是我们定义实际报表的地方。
在这里,您可以看到我创建了一个名为“Northwind Reports”的报表组,并将报表命名为“Customers
”。我已选择之前定义的“Northwind
”连接。我还选择了之前定义的“Basic Select Form”表单。注意:表单字段可以留空。对于表单,我设置了 `var1` 和 `select1` 标签。正如您所见,对于 `select1` 标签,我从 `customers` 表中选择 `customerid` 和 `contactname` 来填充我的 `select combobox`,这与 `select` 标签所需的 [id]、[要显示的名称] 相匹配。
我选择了“Basic Template”,这也是之前定义的。对于模板,我设置了 `var1` 和 `query1` 标签。在 `query1` 标签中,您可以看到我输入了“WHERE customerid = @select1
”,这将使用“select1
”组合框中选定项目的 ID。
查看报表
现在我们可以查看刚刚创建的报表。转到导航栏上的“查看报表”链接,然后选择“Customers
”报表。
项目示例
我在 github 仓库的“Northwind Example”下包含了一个报表示例,您需要安装 Microsoft SQL Server 2005 或更高版本才能使用它。此示例向您展示了如何使用 Symmetric Web Server 中的所有不同类型的标签。
实际应用示例
我只想快速举一个我在工作中如何使用 Symmetric Web Server 的例子。我是一家从事楼宇自动化的公司,即控制和监控建筑内的 PLC。Symmetric Web Server 被不同工作站 PC 上的各种用户用来查看报表。这些报表范围从某个站点有多少灯具出现故障,到过去一个月有多少火灾探测器激活,再到谁可以访问建筑内的哪个区域等等。
限制
此应用程序最明显的限制是,在 Chrome/Firefox 中打印表格时会切掉底部一行。有趣的是,在 Internet Explorer 中,它工作正常。解决办法可能是将 HTML 保存为 PDF,然后进行打印。
未来
我计划将来有时间时更新此应用程序。我想要重点关注的一些事项包括:
- 使用 Mono 支持 Linux
- 为表单/模板添加 HTML 编辑器
- 进一步优化代码
- 添加保存为 PDF 的支持
- 创建更直观的报表创建界面。例如,您可以在保存报表之前预览报表。
如果人们发现这篇文章有任何用处,欢迎他们向 github 仓库贡献代码。:)
谢谢
感谢 Tiaan Wolmarans 编辑本文,也感谢您的阅读。我希望这对您的报表工作有所帮助!