AMIS + httplib 快速搭建前后端

2023-11-03

1. 简介

本人毫无前端编程经验,只会用C++写一些简单代码,因此想要从头开发一个简单的前端web,从头学html、css、vue……算了,直接放弃。那有没有其他办法呢?
答案是有,因此才有了本文。

本文适用人群:无前端开发经验、会C++进行,需求简单

1.1 AMIS简介

AMIS是百度的一个低代码前端框架,整个框架开源,使用 JSON
配置来生成页面,不需要懂前端代码,只需要会根据需求配置不同json文件即可。

当然,如果你不了解json格式的文件,建议稍微花几分钟时间学习下,很简单。
另外,百度对于AMIS的使用文档也写的十分详尽,入门后直接看官方文档是很有必要的。

AMIS开源库地址:
amis: 低代码前端框架,它使用 JSON 配置来生成页面,可以节省页面开发工作量,极大提升开发前端页面的效率 (gitee.com)

1.2 httplib开源库

httplib库是C++的开源库,简单使用及介绍可参考我另外一篇文章:
httplib库的使用(支持http/https)(一)_秋杪的博客-CSDN博客_httplib

2. 快速使用

2.1 AMIS环境搭建

AMIS有两种使用方法,我在此采用简单的JS SDK方式,这个方式不需要了解前端方面的知识。
SDK包下载地址:Releases · baidu/amis · GitHub
直接下载最新版的 sdk.tar.gz 即可,然后将其解压即可。

2.2 创建一个登陆页面

通过以上步骤我们实际上已经将前端所需环境搭建好了,接下来可以进行页面的开发了。以一个简单登陆界面为例,新建一个登陆页面的 login.html文件,放在sdk解压的目录下,如下:

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8" />
    <title>登录界面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <link rel="stylesheet" href="sdk.css" />
    <link rel="stylesheet" href="helper.css" />
    <link rel="stylesheet" href="iconfont.css" />
    <link rel="shortcut icon" href="login.ico">
    <!-- 这是默认主题所需的,如果是其他主题则不需要 -->
    <!-- 从 1.1.0 开始 sdk.css 将不支持 IE 11,如果要支持 IE11 请引用这个 css,并把前面那个删了 -->
    <!-- <link rel="stylesheet" href="sdk-ie11.css" /> -->
    <!-- 不过 amis 开发团队几乎没测试过 IE 11 下的效果,所以可能有细节功能用不了,如果发现请报 issue -->
    <style>
        html,
        body,
        .app-wrapper {
            position: relative;
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <div id="root" class="app-wrapper"></div>
    <script src="sdk.js"></script>
    <script type="text/javascript">
        (function () {
            let amis = amisRequire('amis/embed');
            // 通过替换下面这个配置来生成不同页面
            let amisJSON = {
                "type": "page",
                "title": "",
                "style": {
                    "textAlign": "center",
                    "fontWeight": "normal",
                    "backgroundImage": "login.jpg"
                },
                "regions": [
                    "body",
                    "toolbar"
                ]
                "toolbar": [
                ]
            };
            let amisScoped = amis.embed('#root', amisJSON);
        })();
    </script>
</body>

</html>

看不懂html不要紧,只需要关注以下几个地方

<title>登录界面</title> <!-- 这是页面的标题,可根据实际需求修改 -->

<link rel="shortcut icon" href="login.ico">  <!-- 这是页面的图标,将ico图标文件一同放在sdk解压目录内即可 -->

接下来是let amisJSON这个字段,这个实际上就是我们搭建页面所需要编辑的json格式的字段,整个字段实际就是一个json文件。而且,针对这个json格式文件,AMIS还提供了可视化编辑,地址为:AMIS编辑器
可以利用编辑器来简单修改json,不过编辑器提供的功能也有限,有一些组件的属性只能通过json来自己配置。不过也可以将自己编辑好的json放到编辑器中查看效果。

在上述json中,只是简单的添加了一个页面 “type”: “page”,然后将页面背景设为了"login.jpg"这张图片,大家可以根据自己需求来设置,最后只需将图片素材与html一起放到sdk解压的目录(实际上所有素材都是如此操作)下即可。

好了,将上述html直接用浏览器打开,是否看到效果了?很神奇吧,一个简单的页面就完成了。

2.3 利用httplib搭建简单的后端

很多时候,我们的html运行环境是在服务器上的,使用者并不能像我们上面那样直接去找到html打开,而是通过浏览器输入网址来打开页面的。为了达到这种效果,就需要我们自己开发一个http服务端的后台程序了。

服务端http程序如下,将html所需资源利用Get来供客户端拉取

#include <string>
#include <stdint.h>
#include <sys/time.h>
#include <vector>
#include <map>
#include "stdio.h"
#include <iostream>
#include <algorithm>
#include "httplib.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <dirent.h>
#include <fstream>
#include <sys/statfs.h>

//读文件
uint64_t sz_read_file(const std::string &path, std::string &out)
{
    std::ifstream fs(path, std::ios_base::binary);
    fs.seekg(0, std::ios_base::end);
    uint64_t size = fs.tellg();
    fs.seekg(0);
    out.resize(static_cast<size_t>(size));
    fs.read(&out[0], static_cast<std::streamsize>(size));
    fs.close();
    return size;
}

int main()
{
	int listen_port = 58030; //可根据需要自己设置
	
	httplib::Server svr;
	
	svr.set_read_timeout(5, 0); // 5 seconds
	svr.set_write_timeout(5, 0); // 5 seconds
	svr.set_idle_interval(0, 100000); // 100 milliseconds

    //在此处添加服务端内容即可

  
    //web 资源//
    //主html文件 sdk.css、helper.css、iconfont.css 这三个如果使用上述html模板则必须要有,其余根据自己需求添加

	 //html
    svr.Get("/", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/login.html", body); //路径可根据实际情况来写
                res.set_content(body, "text/html");
                });

	//字体 ontawesome icon等资源
    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-brands-400.ttf", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-brands-400.ttf", body);
                res.set_content(body, "font/ttf");
                });

    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-brands-400.woff2", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-brands-400.woff2", body);
                res.set_content(body, "font/woff2");
                });
    
    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-regular-400.ttf", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-regular-400.ttf", body);
                res.set_content(body, "font/ttf");
                });

    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-regular-400.woff2", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-regular-400.woff2", body);
                res.set_content(body, "font/woff2");
                });
    
    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-solid-900.ttf", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-solid-900.ttf", body);
                res.set_content(body, "font/ttf");
                });

    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2", body);
                res.set_content(body, "font/woff2");
                });
    
    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-v4compatibility.ttf", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-v4compatibility.ttf", body);
                res.set_content(body, "font/ttf");
                });

    svr.Get("/thirds/@fortawesome/fontawesome-free/webfonts/fa-v4compatibility.woff2", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/thirds/@fortawesome/fontawesome-free/webfonts/fa-v4compatibility.woff2", body);
                res.set_content(body, "font/woff2");
                });
	 
	 //css
    svr.Get("/sdk.css", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/sdk.css", body);
                res.set_content(body, "text/css");
                });
    
    svr.Get("/helper.css", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/helper.css", body);
                res.set_content(body, "text/css");
                });
    
    svr.Get("/iconfont.css", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/iconfont.css", body);
                res.set_content(body, "text/css");
                });

    svr.Get("/sdk.js", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/sdk.js", body);
                res.set_content(body, "application/javascript");
                });
    
    //图标资源
    svr.Get("/login.ico", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/login.ico", body);
                res.set_content(body, "image/x-icon");
                });

    svr.Get("/login.jpg", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/login.jpg", body);
                res.set_content(body, "image/jpeg");
                });

    svr.Get("/charts.js", [&](const httplib::Request &req, httplib::Response &res)
            {
                std::string body;
                sz_read_file("..路径/charts.js", body);
                res.set_content(body, "application/javascript");
                });

    svr.listen("0.0.0.0", listen_port);

}

2.4 运行

后端程序启动后,直接打开浏览器输入后端程序所在电脑/服务器 ip:端口号+html路径即可。
本文中所写html路径为/则直接ip:端口号即可,例如127.0.0.1:58030

尾声总结

AMIS使用体验很不错,使用者不需要过多掌握前端的知识,能节约很多开发时间,而且一直在持续更新,本文只能作为入门介绍,更多组件使用还是直接去看官方文档,可以直接查看json结构,很多示例都可以拿来直接用。
在这里插入图片描述

文中定有不足之处,恳请指出,大家一起加油相互学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AMIS + httplib 快速搭建前后端 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • MySQL字段约束条件,外键约束条件,表关系

    目录 字符编码与配置文件 统一字符编码 存储引擎 修改存储引擎的方式 自定义选项存储引擎 不同存储引擎产生的表文件有几个 MERGE InnoDB Archive BLACKHOLE blackhole与memory存取数据的特征 Blac
  • Cookie 和 Session 归纳

    首先介绍下基本概念 cookie是服务器通知客户端让其保存健值对的一种形式 客户端有了cookie之后 每次请求就会发送给服务器 每个cookie最大是4kb 服务器创建cookie 1Cookie cookie new Cookie 创建
  • Jacoco代码覆盖率测试

    欢迎光临我的博客查看最新文章 https river106 cn 1 简介 JaCoCo Java Code Coverage 是一个开源的覆盖率工具 它针对的开发语言是java 其使用方法很灵活 可以嵌入到Ant Maven中 很多第三方
  • linux下nginx重启命令

    linux下的nginx重启命令常见以下3种 systemctl restart nginx service nginx restart usr sbin nginx s reload
  • 高职教育应对ChatGPT应用的策略

    一 完善顶层设计 提升技术水平 在推广ChatGPT平台的过程中 高职院校需要关注技术本身的问题 这就需要在国家和地方政府的引导下 引入更完善的技术顶层设计 提高人工智能在高职教育中的运用水平 具体来说 一方面需要出台更加高效的法规来确保我
  • Flink CDC 单线程读取 mysql binlog 同步到 Elasticsearch 的压力测试

    硬件环境 MySQL 服务器2核1G Flink 服务器2核4G Elasticsearch 服务器2核8G 软件版本 MySQL 5 7 35 Flink 2 12 1 14 2 Elasticsearch 7 1 0 flink sql
  • Github上传代码菜鸟超详细教程

    最近需要将课设代码上传到Github上 之前只是用来fork别人的代码 这篇文章写得是windows下的使用方法 第一步 创建Github新账户 第二步 新建仓库 第三部 填写名称 简介 可选 勾选Initialize this repos
  • 二分法(二)找到目标值开始位置和结束位置NUSOJ2677

    题目 现在给定一个升序排列的数组num t个目标值 现在你要做的便是找到目标值在数组中的开始位置和结束位置 如果数组中不存在该值 则返回 1 1 输入m Input 第一行输入一个n n 1 lt n lt 1e6 代表数组num长度 第二
  • 如何搭建一个完整的Vue3.0 + ts 的项目

    如何搭建一个完整的Vue3 0 ts 的项目 相信9月18日尤大大的关于Vue3 0的发表演讲大家一定有所关注 现在Vue3 0 也已经进入RC阶段 最终产品的候选版本 如果没有问题则可发布成为正式版本 所以Vue3 0的学习是我们必然的趋
  • matlab无人机路径规划,一种新的优化算法,天牛群算法,比蚁群算法效果好,收敛快

    matlab无人机路径规划 一种新的优化算法 天牛群算法 比蚁群算法效果好 收敛快 在tsp qap二次规划以及三维路径规划上有很好的效果 ID 51100647321750445tbNick id4mr
  • CSDN周赛58期后记,及往期题目记录

    本期周赛没什么bug 体验比较丝滑 提出表扬 咱也不能老吐槽不是 当然 丝滑的根本原因是题目比较水 尤其是最后一道 莫名其妙的键盘 两周前的 56 期刚刚考过 当真是莫名其妙而又迫不及待地又考了一遍 是怕大家背得不够熟吗 而从难度上看 这道
  • go语言安装环境

    go语言安装环境 1 安装包下载 2 安装 最好不要有中文路径 3 测试环境 cmd中输入 go version 回车 4 经典代码 保存文件名 hello go package main import fmt 包含println func
  • c++拆分string型字符串存到vector中

    对数据进行拆分放到vec中 void split string const std string str std vector
  • 关于IDEA无法启动常见的几个问题

    IDEA无法启动 常见的问题及解决办法 第一种 无法启动 大多是因为javaagent 那一行 这种比较简单 出现这种问题 大都是因为编辑vmoptions时出错造成的 这种只需要删除idea 的配置文件就行 一般默认在C盘 例如 C Us
  • Python requests“Max retries exceeded with url” error

    今天写python网络爬虫的时候遇到一个问题 报错的具体内容如下 HTTPConnectionPool host dds cr usgs gov port 80 Max retries exceeded with url ltaauth s
  • 机器学习——朴素贝叶斯、后验概率最大和极大似然

    朴素贝叶斯没有参数估计 给堆数据直接求 属于生成模型 不用优化模型求最佳参数 这区别于判别模型 我遇到的困惑 1 后验概率最大 和 极大似然 这二者有什么区别和联系吗 2 朴素贝叶斯和EM这二者有什么区别和联系吗 答案 1 朴素贝叶斯是根据
  • 怎么维护自己的电脑?

    方向一 我的电脑介绍 我使用的是一台来自知名品牌的笔记本电脑 它具有高性能的核心配置 如快速处理器 大容量内存和高性能显卡 以及宽敞的存储空间 我选择这台电脑主要是因为它的出色性能和可靠性 能够满足我在学习和工作中的需求 方向二 我的日常维
  • 数据分析Power BI数据建模教程(四)——如何创建计算度量值和计算表

    Power BI 是基于云的商业数据分析和共享工具 它能帮您把复杂的数据转化成最简洁的视图 通过它 您可以快速创建丰富的可视化交互式报告 即使在外也能用手机端 APP 随时查看 甚至检测公司各项业务的运行状况 只需它仪表板的一个界面就够了
  • 使用yum安装nginx,几步完成,超级简单!(亲测)

    1 安装yum utils工具包 sudo yum install yum utils 2 设置yum存储库 进入 etc yum repos d目录 cd etc yum repos d 创建nginx repo文件 vim nginx
  • AMIS + httplib 快速搭建前后端

    AMIS httplib 快速搭建前后端 1 简介 1 1 AMIS简介 1 2 httplib开源库 2 快速使用 2 1 AMIS环境搭建 2 2 创建一个登陆页面 2 3 利用httplib搭建简单的后端 2 4 运行 尾声总结 1