【Amis Low Code 结合FastAPI进行前端框架开发】

news2024/11/24 10:20:22

官方文档

封装思想

  • 直接复制官网json数据即可开发
  • 每个json中的接口由fastapi 转发(透传)使其开发模式与前端思维一致

基础组件

from amis import Page, Service, App
from pydantic import BaseModel, Field
from fastapi import FastAPI, Request, Response, APIRouter
from starlette.responses import HTMLResponse


class JsonRegister(BaseModel):
    page_json_url: str = "/demo.json"

    def __init__(self, **kwargs):
        super(JsonRegister, self).__init__(**kwargs)

    def register(self, router: APIRouter):
        router.add_api_route(self.page_json_url, endpoint=self.json)

    def json(self) -> {}:
        """amis json格式数据"""
        return {}


class HtmlRegister(BaseModel):
    page_url = "/"

    def __init__(self, **kwargs):
        super(HtmlRegister, self).__init__(**kwargs)

    def register(self, router: APIRouter):
        router.add_api_route(self.page_url, endpoint=self.html)

    def html(self):
        """渲染html页面"""
        return HTMLResponse(content=Page().render())


class TableRegister(JsonRegister):
    base_url = "/crud/"
    primary_key = "id"
    page_json_url = "/curd/model.json"

    primary_key_url = ""

    def __init__(self, **kwargs):
        super(TableRegister, self).__init__(**kwargs)

    def register(self, router: APIRouter):
        super(TableRegister, self).register(router=router)
        self.primary_key_url = self.base_url + "{" + self.primary_key + "}"
        router.add_api_route(self.primary_key_url, endpoint=self.get_item, methods=["GET"])
        router.add_api_route(self.primary_key_url, endpoint=self.delete_item, methods=["DELETE"])
        router.add_api_route(self.primary_key_url, endpoint=self.put_item, methods=["PUT"])
        router.add_api_route(self.primary_key_url, endpoint=self.options_item, methods=["OPTIONS"])
        router.add_api_route(self.base_url, endpoint=self.get_items, methods=["GET"])
        router.add_api_route(self.base_url, endpoint=self.post_item, methods=["POST"])

    def get_item(self, request: Request):
        return {}

    def delete_item(self, request: Request):
        return {}

    def put_item(self, request: Request):
        return {}

    def options_item(self, request: Request):
        return {}

    def get_items(self, request: Request):
        return []

    def post_item(self, request: Request):
        return {}
  • 上诉组件中定义
  • json格式注册器
  • html页面注册器
  • 表格增删改查注册器

常见业务功能组件封装

class RouterJson(JsonRegister):
    page_json_url = "/router.json"
    children_pages = [
        {
            "label": "父页面",
            "url": "/parent",
            "redirect": "/parent/pageA",
            "children": [
                {
                    "label": "子页面",
                    "url": "pageA",
                    "schemaApi": "get:/pages/crud-list.json"
                },
                {
                    "label": "子页面",
                    "url": "pageB",
                    "schemaApi": "get:/pages/crud-list.json"
                }
            ]
        }
    ]

    def json(self) -> {}:
        return {
            "status": 0,
            "msg": "",
            "data": {
                "pages": {
                    "children": self.children_pages
                }
            }
        }


class AppAdminHtml(HtmlRegister):
    web_url: str = "/"
    """获取静态页面地址"""
    app_brandName = "测试Demo"
    router_json: RouterJson = RouterJson()

    def html(self):
        app_ = App()
        app_.brandName = "测试Demo"
        app_.api = f"get:{self.router_json.page_json_url}"
        return HTMLResponse(app_.render())


class ModelAdminJson(TableRegister):
    base_url = "/crud/"
    primary_key = "id"
    page_json_url = "/curd/model.json"

    def get_item(self, request: Request):
        id_ = request.get(self.primary_key)
        return {"name": "mock data", "id": id_}

    def delete_item(self, request: Request):
        id_ = request.get(self.primary_key)
        return {"name": "mock data", "id": id_}

    def put_item(self, request: Request):
        id_ = request.get(self.primary_key)
        return {"name": "mock data", "id": id_}

    def options_item(self, request: Request):
        id_ = request.get(self.primary_key)
        return {"name": "mock data", "id": id_}

    def get_items(self, request: Request):
        return [{"name": f"mock data {id_}", "id": id_} for id_ in range(10)]

    def post_item(self, request: Request):
        return {"name": "mock data", "id": 0}


class LoginJson(JsonRegister):
    page_json_url: str = "/login.json"
    """获取json配置接口地址"""
    title: str = ""
    """标题"""
    success_redirect_url = "/"
    """成功登陆后的重定向地址"""
    login_params = {
        "url": "${serverUrl}/login/",
        "method": "post",
        "dataType": "form-data"
    }

    def register(self, router: APIRouter):
        super(LoginJson, self).register(router=router)
        router.add_api_route("/login/", endpoint=self.post_item, methods=["POST"])

    def post_item(self, request: Request):
        return {"name": "mock data", "id": 0}

    def json(self):
        return Page(**{
            "type": "page",
            "title": "",
            "style": {
                "backgroundImage": "linear-gradient(180deg, #86a4e9, transparent)"
            },
            "cssVars": {
                "--Form-input-onFocused-borderColor": "#e8e9eb",
                "--Form-input-onHover-borderColor": "#e8e9eb"
            },
            "body": {
                "type": "grid-2d",
                "cols": 12,
                "grids": [
                    {
                        "x": 5,
                        "y": 5,
                        "h": 1,
                        "w": 4,
                        "width": 200,
                        "type": "form",
                        "mode": "horizontal",
                        "title": "",
                        "api": self.login_params,
                        "panelClassName": "p-r p-l p-b-md",
                        "redirect": self.success_redirect_url,
                        "body": [
                            {
                                "type": "tpl",
                                "tpl": f"<div style='text-align: center; font-weight: bold;'><p>{self.title}</p></div>"
                            },
                            {
                                "type": "input-text",
                                "label": False,
                                "name": "userName",
                                "size": "full",
                                "placeholder": "登陆名",
                                "addOn": {
                                    "label": "",
                                    "type": "text",
                                    "position": "left",
                                    "icon": "fa fa-user"
                                }
                            },
                            {
                                "type": "input-password",
                                "label": False,
                                "name": "password",
                                "size": "full",
                                "placeholder": "密码",
                                "addOn": {
                                    "label": "",
                                    "type": "text",
                                    "position": "left",
                                    "icon": "fa fa-lock"
                                }
                            },
                            {
                                "type": "checkbox",
                                "label": False,
                                "name": "record",
                                "option": "记住密码"
                            },
                            {
                                "type": "control",
                                "label": False,
                                "body": {
                                    "type": "button",
                                    "level": "primary",
                                    "actionType": "submit",
                                    "block": True,
                                    "label": "登陆",
                                    "size": "lg"
                                }
                            }
                        ]
                    }
                ]
            }
        }).to_dict()


class LoginHtml(HtmlRegister):
    page_url: str = "/login"
    """获取静态页面地址"""
    login_json: LoginJson = LoginJson()

    def html(self):
        return HTMLResponse(Page(body=Service(schemaApi=f"get:{self.login_json.page_json_url}")).render())

启动运行

import json
import re

from fastapi import FastAPI, Request, APIRouter
from default_template import *

app = FastAPI()


def main_router():
    router = APIRouter()

    login_json = LoginJson()
    login_json.title = "欢迎登录"
    login_json.success_redirect_url = "/#/home"
    login_json.register(router=router)
    """登录json"""
    router_json = RouterJson()
    router_json.children_pages = [
        {
            "label": "首页",
            "url": "/home",
            "schema": {
                "type": "markdown",
                "value": "# title\n markdown **text**"
            }
        },
        {
            "label": "测试页面",
            "url": "/parent",
            "redirect": "/parent/pageA",
            "children": [
                {
                    "label": "测试页面1",
                    "url": "pageA",
                    "schemaApi": "get:/pages/crud-list.json"
                },
                {
                    "label": "测试页面2",
                    "url": "pageB",
                    "schemaApi": "get:/pages/crud-list.json"
                }
            ]
        }
    ]
    router_json.register(router=router)
    """路由json"""

    login_html = LoginHtml()
    login_html.login_json = login_json
    login_html.register(router=router)
    """登录页面"""
    app_admin_html = AppAdminHtml()
    app_admin_html.app_brandName = "测试应用"
    app_admin_html.router_json = router_json
    app_admin_html.register(router=router)
    """后台页面"""
    return router


app.include_router(main_router())

if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=9000)

  • 可以知道当下页面中有登录界面,后台页面
  • 业务中的所有json 页面接口都可以先行注册,再注册静态页面

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js 事件循环简单介绍

1.简介 Node.js 事件循环是 Node.js 运行时环境中的一个核心机制&#xff0c;用于管理异步操作和回调函数的执行顺序。它基于事件驱动模型&#xff0c;通过事件循环来处理和派发事件&#xff0c;以及执行相应的回调函数。 Node.js 是单进程单线程应用程序&#xff0c;但是因为…

java版Spring Cloud+Spring Boot+Mybatis之隐私计算 FATE - 多分类神经网络算法测试

一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练&#xff0c;并使用该模型对数据进行 多分类预测。 二分类算法&#xff1a;是指待预测的 label 标签的取值只有两种&#xff1b;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…

SpringBoot系列之基于Jedis实现分布式锁

Redis系列之基于Jedis实现分布式锁 1、为什么需要分布式锁 在单机环境&#xff0c;我们使用最多的是juc包里的单机锁&#xff0c;但是随着微服务分布式项目的普及&#xff0c;juc里的锁是不能控制分布锁环境的线程安全的&#xff0c;因为单机锁只能控制同个进程里的线程安全&…

独立完成软件的功能的测试(3)

独立完成软件的功能的测试&#xff08;3&#xff09; &#xff08;12.13&#xff09; 执行测试用例 缺陷相关知识 缺陷的定义&#xff1a;软件再使用过程中出现的错误&#xff0c;Bug 评判标准 少功能&#xff0c;需求规格说明书中明确要求的功能功能错误多功能隐性功能错误…

【1.计算机组成与体系结构】流水线技术

目录 1.流水线的定义2.相关参数计算2.1 流水线计算公式2.2 流水线的吞吐率2.3 流水线加速比计算 3.超标量流水线 1.流水线的定义 流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的&#xff0c;它们可同时为多条指令…

【FPGA/verilog -入门学习9】verilog基于查找表的8位格雷码转换

本文参考&#xff1a;FPGA杂记5——格雷码转换设计-CSDN博客 1&#xff0c;什么是查表法&#xff0c;做什么用&#xff0c;有什么好处 查找表&#xff08;Look-Up-Table&#xff09; 查找表&#xff0c;简单说&#xff0c;就是一个预先存储好结果的数据表 通过访问这张预先存储…

解决:WARNING: Ignoring invalid distribution -ip (d:\python37\lib\site-packages)

解决&#xff1a;WARNING: Ignoring invalid distribution -ip (d:\python37\lib\site-packages) 文章目录 解决&#xff1a;WARNING: Ignoring invalid distribution -ip (d:\python37\lib\site-packages)背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结…

CentOS 7 离线安装MySQL审计插件

命令行 cd /data/toolssz mariadb-10.2.38-linux-x86_64.tar.gztar -zxvf mariadb-10.2.38-linux-x86_64.tar.gzinstall lib/plugin/server_audit.so /usr/lib64/mysql/plugin/mysql -uroot -prootinstall plugin server_audit SONAME server_audit.so;show variables like &q…

【图论-匈牙利算法】Hungary Algorithm完整代码(一) 之 matlab实现

学习参考链接 博客 分配问题与匈牙利算法 带你入门多目标跟踪&#xff08;三&#xff09;匈牙利算法&KM算法 视频 运筹学 | 例题详解指派问题 前言 图论-匈牙利算法原理参见上述参考连接中的博客与BiliBili博主的学习视屏&#xff0c;讲的很好很透彻。强烈建议看完&#…

Idea maven打包时 报错 illegalArgumentException: Malformed \uxxxx encoding 解决方法

1 改变打包命令重新打包 在maven打包命令上加入 -e -X 2 找到报错类和方法 可以看到是 java.util.Properties#loadConvert类方法中有个throw new IllegalArgumentException( "Malformed \\uxxxx encoding.")&#xff0c;在此打断点 3 以Debug方式重新运行maven…

原创改进|多策略融合的改进蜣螂优化算法

作者在前段时间的一篇文章中介绍过了蜣螂优化算法(dung beetle optimizer&#xff0c;DBO)的原理及实现&#xff0c;该算法是由东华大学沈波教授团队在2022年提出[1]&#xff0c;其灵感来自蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为这5种习性&#xff0c;其不同的子种群执行了不…

IntelliJ IDEA v2023.3发布——持续演进AI辅助工具、支持Java 21

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

Python 自动化之处理docx文件(一)

批量筛选docx文档中关键词 文章目录 批量筛选docx文档中关键词前言一、做成什么样子二、基本架构三、前期输入模块1.引入库2.路径输入3.关键词输入 三、数据处理模块1.基本架构2.如果是docx文档2.1.读取当前文档内容2.2.遍历匹配关键字2.3.触发匹配并记录日志 3.如果目录下还有…

如何利用宝塔面板和docker快速部署网站

当你有了一台服务器&#xff0c;就会折腾往这台服务器上部署各种好玩的网站。市面上有许多开源的网站项目&#xff0c;通过docker技术可以快速部署并使用&#xff0c;本文将以部署filebrowser举例介绍网站部署的基本流程。 1. 安装宝塔面板 宝塔面板是一款开源的网站运维工具…

云服务器部署可视化Docker私有仓库(Ubuntu)

这里测试的机器为ubuntu22.04 一、环境安装 docker安装就不赘述了 先升级&#xff0c;再从官方仓库安装docker compose apt update apt upgrade apt install docker-compose二、部署私有仓库UI Docker提供了一个叫registry的镜像&#xff0c;给大家搭建私有仓库&#xff0c…

如何在nacos中的配置在不同的环境服务下可实现配置共享

其实在微服务启动时&#xff0c;会去nacos读取多个配置文件&#xff0c;例如&#xff1a; [spring.application.name].yaml&#xff0c;例如&#xff1a;nacos-order-service.yaml[spring.application.name]-[spring.profiles.active].yaml&#xff0c;例如&#xff1a;nacos-o…

《地理信息系统原理》笔记/期末复习资料(10. 空间数据挖掘与空间决策支持系统)

目录 10. 空间数据挖掘与空间决策支持系统 10.1. 空间数据挖掘 10.1.1. 空间数据挖掘的概念 10.1.2. 空间数据挖掘的方法与过程 10.1.3. 空间数据挖掘的应用 10.2. 空间决策支持系统 10.2.1. 空间决策支持系统的概念 10.2.2. 空间决策支持系统的结构 10.2.3. 空间决策…

Flink 有状态流式处理

传统批次处理方法 【1】持续收取数据&#xff08;kafka等&#xff09;&#xff0c;以window时间作为划分&#xff0c;划分一个一个的批次档案&#xff08;按照时间或者大小等&#xff09;&#xff1b; 【2】周期性执行批次运算&#xff08;Spark/Stom等&#xff09;&#xff1b…

Vue3-04-reactive() 响应式失效的三种情况

1.替换对象后导致失效 简单理解 &#xff1a; 变量指向的对象换了&#xff0c;对原来的对象&#xff0c;当然没有了响应式的效果了。// 声明 变量let obj1 reactive({name:"第一个对象"})// 改变 变量的指向obj1 reactive({name:"第二个对象的属性"})co…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建 (new)

0 背景 开发工具idea代码管理mavenjdk1.8webdriver chrome 1 chromedriver & chrome chromedriver和chrome要对应上&#xff1a; chomedriver下载地址&#xff1a;淘宝镜像 这里用的是 chromedriver88-0-4324-96.zipchrome下载地址&#xff1a;如何降级和安装旧版本的C…