全网详细介绍百度低代码框架amis及实例讲解

news2024/11/20 1:37:21

文章目录

  • 1. 文章引言
  • 2. amis官网
  • 3. amis介绍
    • 3.1 amis的简述
    • 3.2 amis的初衷
    • 3.3 amis的其他亮点
    • 3.4 amis不适之处
  • 4. amis使用
    • 4.1 amis框架集成
    • 4.2 amis切换主题
    • 4.3 amis配置与组件
    • 4.4 amis变量
  • 5. amis实例
    • 5.1 amis实例
    • 5.2 列表查询
    • 5.3 查看详情
    • 5.4 自定义操作按钮
    • 5.5 提交表单
  • 6. 完整的json配置
  • 7. 文末总结

1. 文章引言


低代码在如今,应该是无人不知,各大公司也争相推出自己的低代码平台,如下图所示:

在这里插入图片描述

更多的低代码平台可以访问该链接:国内低代码交流平台

了解前端低代码更多的开源框架,可以访问该博客:盘点12个前端低代码的框架开源项目

低代码开发是通过页面拖拉拽的形式,实现在线构建应用程序,旨在简化开发过程,缩短开发周期,提高开发效率,节省开发成本。

通过低代码开发平台(有的也叫无代码开发平台),零代码基础也可以快速构建应用。

由于本人最近在学习amis框架,这是百度开源的低代码的前端框架,接下来便详细介绍amis框架。

2. amis官网


amis的官网地址:https://aisuda.bce.baidu.com/amis/zh-CN/docs/index

我们打开官网链接地址,映入眼帘的信息如下图:

在这里插入图片描述

  1. 文档:这部分是介绍amis的相关信息,比如概念,amis的高级用法等。

  2. 组件:这部分介绍amis的布局、功能、数据输入、数据展示、反馈等组件,比如输入框组件,富文本框组件,单选框组件等。

在这里插入图片描述

  1. 样式:这部分介绍amis如何的相关样式,比如css变量,布局样式,表格(grid)样式,边界(margin)等样式。

在这里插入图片描述

  1. 示例:这部分是amis的使用示例,比如表单示例,列表示例,弹框示例等。

在这里插入图片描述

  1. 编辑器:点击编辑器会跳转到github上,下载amis的可视化编辑器。

在这里插入图片描述

3. amis介绍

3.1 amis的简述


百度公司的低代码平台产品叫爱速搭,amis是爱速搭团队开源的前端低代码框架,爱速搭应用中的页面都是基于amis渲染的,同时爱速搭平台自身的绝大部分页面也是基于amis开发。

注意是大部分不是全部哦,也就是项目还是离不开专业开发的。

amis的定位是前端UI框架,通过JSON配置生成各种后台页面,甚至可以不需要了解前端,类似于 ElementAnt Design,可以基于它快速开发前端页面,但需要自己整合到自己内部系统中,并且实现路由功能。

3.2 amis的初衷


在经历了十几年的发展后,前端开发变得越来越复杂,门槛也越来越高,要使用当下流行的UI组件库,你必须懂npm、webpack、react/vue,必须熟悉ES6语法,最好还了解状态管理,比如Redux

如果没接触过函数式编程,光入门都很费劲,而入门之后会发现它还有巨大的生态,相关的库有 2347个,很多功能相似,挑选成本高。

然而前端技术的发展不会停滞,等学完这些后可能会发现大家都用Hooks了、某个打包工具取代Webpack了……

而有时候其实只想做个普通的增删改查界面,用于信息管理,类似下面这种:

在这里插入图片描述

这个界面虽然用Bootstrap及各种前端UI库也能做出个大概,但仔细观察会发现它有大量细节功能,比如:

  1. 可以对数据做筛选

  2. 有按钮可以刷新数据

  3. 编辑单行数据

  4. 批量修改和删除

  5. 按某列排序

  6. 可以隐藏某些列

  7. 可以调整列顺序

  8. 自动生成顶部查询区域

  9. 可调整列宽度

  10. 开启整页内容拖拽排序

  11. 表格有分页(页数还能同步到地址栏,不过这个例子中关了)

  12. 有数据汇总\

  13. 支持导出Excel

  14. 「渲染引擎」那列的表头有提示文字

  15. 鼠标移动到「平台」那列的内容时还有放大镜符号,可以展开查看更多

  16. 如果往下拖动还有首行冻结来方便查看表头(因为文档页面的限制,这个功能在这里看不出来)

全部实现这些需要大量的代码。

但可以看到,用amis只需要157JSON配置(其中47行只有一个括号)。

由于不能展示JSON配置,你可以点击上图中的编辑代码,查看生成该页面的JSON配置,如下图所示:

在这里插入图片描述

你不需要了解React/VueWebpack,甚至不需要很了解JavaScript,即便没学过amis也能猜到大部分配置的作用,只需要简单配置就能完成所有页面开发。

这正是建立amis的初衷,我们认为:对于大部分常用页面,应该使用最简单的方法来实现,甚至不需要学习前端框架和工具。

3.3 amis的其他亮点


除了上述亮点之外,amis还有其他亮点,如下所示:

  1. 提供完整的界面解决方案:其它UI框架必须使用JavaScript来组装业务逻辑,而amis只需JSON配置就能完成完整功能开发,包括数据获取、表单提交及验证等功能,做出来的页面不需要经过二次开发就能直接上线;

  2. 大量内置组件(120+),一站式解决:其它UI框架大部分都只有最通用的组件,如果遇到一些稍微不常用的组件就得自己找第三方,而这些第三方组件往往在展现和交互上不一致,整合起来效果不好,而amis则内置大量组件,包括了富文本编辑器、代码编辑器、diff、条件组合、实时日志等业务组件,绝大部分中后台页面开发只需要了解amis就足够了;

  3. 支持扩展:除了低代码模式,还可以通过 自定义组件 来扩充组件,实际上amis可以当成普通UI库来使用,实现90%低代码,10%代码开发的混合模式,既提升了效率,又不失灵活性;

  4. 容器支持无限级嵌套:可以通过嵌套来满足各种布局及展现需求;

  5. 经历了长时间的实战考验amis在百度内部得到了广泛使用,在6年多的时间里创建了5万页面,从内容审核到机器管理,从数据分析到模型训练,amis满足了各种各样的页面需求,最复杂的页面有超过1万行JSON配置。

3.4 amis不适之处


使用JSON有优点但也有明显缺点,在以下场合并不适合amis

  1. 大量定制UIJSON配置使得amis更适合做有大量常见UI组件的页面,但对于面向普通客户(toC)的页面,往往追求个性化的视觉效果,这种情况下用amis就不合适,实际上绝大部分前端UI组件库也都不适合,只能定制开发。

  2. 极为复杂或特殊的交互:

    • 有些复杂的前端功能,比如 可视化编辑器,其中有大量定制的拖拽操作,这种需要依赖原生DOM实现的功能无法使用amis

    • 但对于某些交互固定的领域,比如图连线,amis后续会有专门的组件来实现。

4. amis使用

4.1 amis框架集成


amis有两种使用方法:

  1. JS SDK,可以用在任意页面中

  2. React,可以用在React项目中

SDK版本适合对前端或React不了解的开发者,它不依赖npmwebpack,可以像Vue/jQuery那样外链代码就能使用。

更多的了解还是参考文档。

4.2 amis切换主题


jssdk版本默认使用sdk.css即云舍主题。

如果你想使用仿Antd,请将css引用改成antd.css

同时js渲染地方第四个参数传入theme属性,如下所示:

amis.embed(
  '#root',
  {
    // amis schema
  },
  {
    // 这里是初始 props
  },
  // 注意是第四个参数
  {
    theme: 'antd'
  }
);

如果想使用amis 1.2.2之前的默认主题,名字是ang

4.3 amis配置与组件


一个最简单的amis配置看起来是这样的:

{
  "type": "page",
  "body": "Hello World!"
}

请观察上面的代码,这是一段 JSON,它的含义是:

  1. typeamis节点中最重要的字段,它告诉amis当前节点需要渲染的是Page组件。

  2. body字段会作为Page组件的属性,Page组件根据这个值来渲染页面内容。

这段配置的效果如下所示:

在这里插入图片描述

这个简单代码在amis编辑器种就会渲染出一个简单页面,可以实时预览。

用过Echarts图表的人可能体会过这种便利性,我们只要修改七种的各个属性值就会看到页面发生神奇的变化。

复杂点的页面也是通过这样一个个简单的组件搭建起来的,比如表单组件、对话框组件、表单组件及表单中的input、select、radio、switch开关、checkbox等,这些组件的不能功能是通过不同的属性来控制的。

4.4 amis变量


amis变量使用${}来表示。

比如列表中存在编辑的操作,当点击编辑弹出框,需要回显数据,如下图所示:

在这里插入图片描述

这个时候就需要用到变量,姓名的代码如下所示:

{
  "clearable": false,
  "showCounter": false,
  "multiple": false,
  "label": "姓名",
  "type": "input-text",
  "required": false,
  "name": "name",
  "disabled": false,
  "style": {
  },
  "drag": false,
  "id": "u:20230404110907713",
  "value": "${name}"
}

5. amis实例

5.1 amis实例


通过一个CRUD组件实现增删改查列表,如下所示:

在这里插入图片描述

在编辑器左侧组件选项卡中选择CRUD组件拖入主界面,找不到的话可以搜一下,通过中英文名字都可以,如下图所示:

在这里插入图片描述

组件拖过来之后会出现一个弹窗配置页面,接口地址是相对地址(除掉IP、端口和项目根路径),选择列表中需要实现的按钮,这里我选了查询、查看详情和编辑功能。

这些配置也可以先不管,在组件初始化后都可以再修改,配置是实时保存编译的。

5.2 列表查询


列表最主要的是查询功能,一般低代码平台会选择在数据建模的基础上实现接口(建模是通过配置字段、表名等生成数据库表模型)。
在这里插入图片描述

右面有个面板可以修改当前组件的各种属性,如下图所示:

在这里插入图片描述

我在常规选项卡中改了启动查询条件,在接口选项卡中改了接口查询方式为post(代码中对应initApi属性),从左面的代码面板中可以查看生成的JSON代码,如下图所示:

在这里插入图片描述

红框中就是列表的的其中一个字段:

  1. name属性是数据库返回的字段名

  2. label是页面显示的列名

  3. type是数据类型

可以根据需求增加需要展示的字段列。

查询功能需要注意:

  1. 查询条件配的api属性接口地址,跟页面初始化的接口initApi的接口是一样的。不用拼接属性参数之类的,参数自动往后端传,比如下图中的查询条件,在后端收到的参数就是keyword

  2. filterColumnCount属性是设置查询后默认返回前多少条

在这里插入图片描述

5.3 查看详情


组件勾选了后自带了查看详情功能,点击详情按钮会弹出一个dialog组件,默认子组件会继承父页面的数据,包括列表中没有展示的字段,所以不用加接口,在列表查询的时候尽量把字段都查出来就行。

如果你不用列表自带的,而是配置了一个新的页面,代码如下图所示:

在这里插入图片描述

通过在dialog组件中加入service组件实现的,url是另一个amis表单的地址(这里页面有个解析接口,每个页面配置后都会生成一个url地址)。

data属性不用传值,来自列表中某一行数据,弹窗详情页面如下图所示:

在这里插入图片描述

5.4 自定义操作按钮


在增删改查列表设计页面,查看详情按钮后面拖入一个提交按钮,点击提交按钮查看相应代码如下:

{
  "type": "button",
  "label": "提交",
  "actionType": "dialog",
  "dialog": {
    "title": "测试表单提交",
    "size": "lg",
    "body": [
      {
        "type": "service",
        "schemaApi": {
          "method": "post",
          "url": "/test/updateTest",
          "data": {
            "id": "${id}",
            "sex": "${sex}",
            "username": "${username}"
          }
        },
        "messages": {
        }
      }
    ],
    "actions": [
    ]
  }
}

跟查看详情的实现方式差不多,也是在dialog弹窗组件中引入了另一个配置页面,不同的是对新页面做了数据映射。

上图中右侧大写的数据是列表数据字段,左侧小写的是提交表单中用到的数据。

5.5 提交表单


如下代码是提交按钮对应的Json代码,点击按钮会发送一个ajax请求。

{
  "type": "button",
  "label": "提交",
  "actionType": "ajax",
  "visibleOn": "this.STATUS!=='1'",
  "api": {
    "method": "post",
    "url": "/flow/amis/startWorkFlow",
    "data": {
      "&": "$$",
      "processDefinitionKey": "flow_asset",
      "businessKey": "",
      "processName": "管理流程",
      "modelCode": "ASSET"
    },
    "dataType": "json"
  }
}

其中data中的参数需要注意:

当数据域里的变量值为$$时, 表示将所有接口返回的data字段值整体赋值到对应的key中。

6. 完整的json配置


如下为curd列表的一个完整的json配置,包含增、删、改、查的操作,如下代码所示:

{
  "type": "crud",
  "api": {
    "method": "get",
    "url": "http://xxx/initApi"
  },
  "id": "u:20230404110907209",
  "outputName": "rows",
  "syncLocation": false,
  "columns": [
    {
      "clearable": false,
      "showCounter": false,
      "multiple": false,
      "name": "sex",
      "disabled": false,
      "drag": false,
      "id": "u:20230404110907712",
      "label": "sex",
      "type": "text",
      "required": false,
      "searchable": {
        "clearable": false,
        "showCounter": false,
        "name": "sex",
        "options": [
          {
            "label": "男",
            "value": "male"
          },
          {
            "label": "女",
            "value": "female"
          },
          {
            "label": "未知",
            "value": "unknown"
          }
        ],
        "style": {
        },
        "label": "sex",
        "placeholder": "请输入sex",
        "type": "select",
        "required": false,
        "id": "u:3c3572e98932"
      }
    },
    {
      "clearable": false,
      "showCounter": false,
      "multiple": false,
      "name": "name",
      "disabled": false,
      "drag": false,
      "id": "u:20230404110907713",
      "label": "姓名",
      "type": "text",
      "required": false,
      "searchable": {
        "clearable": false,
        "showCounter": false,
        "name": "name",
        "style": {
        },
        "label": "name",
        "placeholder": "请输入name",
        "type": "input-text",
        "required": false,
        "id": "u:06edf56b332f"
      }
    },
    {
      "clearable": false,
      "buttons": [
        {
          "actionType": "dialog",
          "dialog": {
            "body": {
              "api": {
                "method": "put",
                "url": "http://xxx/edit/${id}"
              },
              "body": [
                {
                  "clearable": false,
                  "showCounter": false,
                  "multiple": false,
                  "label": "sex",
                  "type": "select",
                  "required": false,
                  "accept": "gender",
                  "name": "sex",
                  "options": [
                    {
                      "label": "男",
                      "value": "male"
                    },
                    {
                      "label": "女",
                      "value": "female"
                    },
                    {
                      "label": "未知",
                      "value": "unknown"
                    }
                  ],
                  "disabled": false,
                  "style": {
                  },
                  "drag": false,
                  "id": "u:20230404110907712",
                  "value": "${sex}"
                },
                {
                  "clearable": false,
                  "showCounter": false,
                  "multiple": false,
                  "label": "姓名",
                  "type": "input-text",
                  "required": false,
                  "name": "name",
                  "disabled": false,
                  "style": {
                  },
                  "drag": false,
                  "id": "u:20230404110907713",
                  "value": "${name}"
                }
              ],
              "type": "form"
            },
            "title": "编辑"
          },
          "level": "link",
          "id": "u:20230404110907448",
          "label": "编辑",
          "type": "button"
        },
        {
          "actionType": "ajax",
          "level": "danger",
          "className": "text-danger",
          "confirmText": "确定删除当前记录吗?",
          "api": {
            "method": "delete",
            "url": "http://xxx/delete/${id}"
          },
          "id": "u:20230404110907449",
          "label": "删除",
          "type": "button"
        },
        {
          "actionType": "dialog",
          "dialog": {
            "body": {
              "body": [
                {
                  "clearable": false,
                  "showCounter": false,
                  "multiple": false,
                  "label": "sex",
                  "type": "select",
                  "required": false,
                  "accept": "gender",
                  "name": "sex",
                  "options": [
                    {
                      "label": "男",
                      "value": "male"
                    },
                    {
                      "label": "女",
                      "value": "female"
                    },
                    {
                      "label": "未知",
                      "value": "unknown"
                    }
                  ],
                  "disabled": true,
                  "style": {
                  },
                  "drag": false,
                  "id": "u:20230404110907712",
                  "value": "${sex}"
                },
                {
                  "clearable": false,
                  "showCounter": false,
                  "multiple": false,
                  "label": "姓名",
                  "type": "input-text",
                  "required": false,
                  "name": "name",
                  "disabled": true,
                  "style": {
                  },
                  "drag": false,
                  "id": "u:20230404110907713",
                  "value": "${name}"
                }
              ],
              "type": "form"
            },
            "title": "查看详情",
            "actions": [
              {
                "actionType": "confirm",
                "label": "关闭",
                "type": "button",
                "primary": true
              }
            ]
          },
          "level": "link",
          "id": "u:20230404110907450",
          "label": "查看详情",
          "type": "button"
        }
      ],
      "showCounter": false,
      "multiple": false,
      "name": "操作",
      "disabled": false,
      "drag": false,
      "id": "u:20230404110907209",
      "label": "操作",
      "type": "operation",
      "required": false
    }
  ],
  "autoGenerateFilter": true,
  "source": "${rows}",
  "inputName": "rows",
  "features": [
    "create",
    "filter",
    "update",
    "view",
    "delete"
  ],
  "perPage": 10,
  "footerToolbar": [
    "statistics",
    "switch-per-page",
    "pagination"
  ],
  "filterColumnCount": 3,
  "position": "bottom",
  "headerToolbar": [
    {
      "actionType": "dialog",
      "dialog": {
        "body": {
          "api": {
            "method": "post",
            "url": "http://xxx/add"
          },
          "body": [
            {
              "clearable": false,
              "showCounter": false,
              "multiple": false,
              "label": "sex",
              "type": "select",
              "required": false,
              "accept": "gender",
              "name": "sex",
              "options": [
                {
                  "label": "男",
                  "value": "male"
                },
                {
                  "label": "女",
                  "value": "female"
                },
                {
                  "label": "未知",
                  "value": "unknown"
                }
              ],
              "disabled": false,
              "style": {
              },
              "drag": false,
              "id": "u:20230404110907712",
              "value": "${sex}"
            },
            {
              "clearable": false,
              "showCounter": false,
              "multiple": false,
              "label": "姓名",
              "type": "input-text",
              "required": false,
              "name": "name",
              "disabled": false,
              "style": {
              },
              "drag": false,
              "id": "u:20230404110907713",
              "value": "${name}"
            }
          ],
          "type": "form"
        },
        "title": "新增"
      },
      "level": "primary",
      "id": "u:20230404110907447",
      "label": "新增",
      "type": "button"
    },
    "bulkActions"
  ]
}

7. 文末总结


amis有很多组件需要学习,具体可以参考amis的官网教程。

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

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

相关文章

你知道ChatGPT中的数据模型是什么吗?

本文将为你揭开ChatGPT和GPT-4中使用的以数据为中心的人工智能技术的秘密。 人工智能在改变我们的生活、工作和与技术互动的方式方面取得了令人难以置信的进步。最近,一个取得重大进展的领域是大型语言模型(LLM)的开发,如​​GPT…

二十、SQL 数据分析基础与进阶(一)

文章目录 一、破冰 SELECT 基础检索1.1 检索所需要的列1.1.1 检索单列数据1.1.2 检索多列数据 1.2 * 符号初体验1.3 独特的 DISTINCT1.4 使用 ORDER BY 排序检索结果1.5 使用 LIMIT 限制返回行数1.6 ORDER BY 与 LIMIT 结合的妙用 二、过滤数据,选你所想三、计算字段…

ArcGIS Pro快捷键

目录 1 常规应用快捷键 2 动画快捷键 3 内容窗格快捷键 4 数据工程试图快捷键 5 编辑工具快捷键 5.1 常规编辑 5.3 选择工具 5.4 表 5.5 文本格式化标签 5.6 编辑注记 5.7 移动 5.8 旋转 5.9 比例 5.10 编辑折点 5.11 几何属性表 5.12 创建注记 5.13 创建点要…

安装 FME Desktop 2020 教程(内置补丁可以有效激活软件)

介绍:FME Desktop 2020是由加拿大Safe Software公司开发的空间数据转换处理系统,采用先进的数据转换技术,内置几十个转换器,能够满足绝大部分用户的空间数据格式转换功能。除此之外,该软件基于OpenGIS组织提出的新的数…

MySQL_第12章_MySQL数据类型精讲

第12章_MySQL数据类型精讲 1. MySQL中的数据类型 类型 类型举例 整数类型 TINYINT 、 SMALLINT 、 MEDIUMINT 、 INT( 或 INTEGER) 、 BIGINT 浮点类型 FLOAT 、 DOUBLE 定点数类型 DECIMAL 位类型 BIT 日期时间类型 YEAR 、 TIME 、 DATE 、 DATETIME 、 TIMESTAMP 文…

Java 7、8 HashMap源码详解与分析

文章目录 一、哈希表的简介二、JDK1.7 HashMap1、构造方法2、添加方法put()方法addEntry()方法 3、存在的问题 三、JDK1.8 HashMap1、红黑树TreeMap2、属性3、存储的结构4、构造方法5、添加方法put(K, V)方法resize扩容方法 5、putAll()方法6、移除方法remove(Objec…

Salesforce官方_中文学习、考证资源

Salesforce将Trailhead描述为学习热门技能的有趣且免费的平台。该平台有助于缩小技能差距,是所有Salesforce用户的宝藏资源。 Trailhead适合所有学习者。它涵盖了适用于Salesforce任何角色的主题和学习模块,从管理员、开发人员、销售主管到最终用户。学…

数据库基础篇 《12.MySQL数据类型精讲》

1. MySQL中的数据类型 2. 整数类型 2.1 类型介绍 整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。 它们的区别如下表所示: 2.2 可选属性 整数类型的可选属性有三个: 2.2.1 M …

【Python】【进阶篇】3、Django ORM模块精讲

目录 3、Django ORM模块精讲1. 什么是 ORM?2. Django中定义数据表1) 模型类2) 定义数据表 3. ORM 管理器对象4. ORM优势与不足 3、Django ORM模块精讲 Django 框架向我们提供了丰富的模块,避免程序员在开发的过程中重复“造轮子”,提高了开发…

Docker开发基础使用(针对开发者足够)

一.Docker概述 容器就是虚拟化吗? 是,但也不竟然。我们用一种简单方式来思考一下: 虚拟化使得许多操作系统可同时在单个系统上运行。 容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。 这意味着什么&#xf…

Kotlin 用于数据科学的基础库(深度学习、数据挖掘)

Kotlin 用于数据科学 从构建数据流水线到生产机器学习模型, Kotlin 可能是处理数据的绝佳选择: Kotlin 简洁、易读且易于学习。静态类型与空安全有助于创建可靠的、可维护的、易于故障排除的代码。作为一种 JVM 语言,Kotlin 提供了出色的性…

机器视觉工程师买车就买“宝马”车-德国制造-世界精工

世界离开德国,整个地球的制造业将会落后五百年。 说起德国制造 在光学领域最牛的卡尔蔡司公司是制造相机镜头的世界级企业。,在机器视觉行业里面公司Mvtec,我们机器视觉工程师大多数用的halcon,就是来自于德国Mvtec,电气工程师使用的西门子PLC,西门子是是全球电子电气工程及…

兼容性测试用例

兼容性测试用例 兼容性测试是软件测试中非常重要的一块,它主要测试两个方面: 1.同一软件系统,不同版本之间的兼容性 在实际项目中,我们会遇到多种不同版本的软件系统,比如 Windows和 Linux,甚至还有 Unix、…

操作系统原理 —— 什么是进程?进程由什么组成?有什么特征?(六)

进程的概念 在我小时候,刚刚接触电脑的时候,只会在浏览器中输入 4399 搜索小游戏玩一玩,到后来,我学会了安装游戏,然后知道安装完成之后,找到对应的 .exe 的图标就可以运行游戏。 好,那么什么…

2.数据库开发

二.数据库开发 1.开发数据库流程 2.数据库,数据表,数据字段的命名 3.数据库字符集和排序规则设置 4.数据表的引擎选择 二.数据库开发 1.开发数据库流程 ①建立数据库

虚幻图文笔记:面部动画基本原理以及在UE5中如何导入面部动画

0. 面部动画的基本原理 之前做过的项目没有涉及过面部动画,所以最这方面不是很了解,一直以为面部动画也是通过骨骼来驱动的(理论上用骨骼驱动当然也是可以的),但很多时候面部动画更多是使用Morph Target(有…

SLAM论文速递【SLAM—— PLD-SLAM:一种基于点线特征的室内动态场景RGB-D SLAM新方法—4.23(1)

论文信息 题目: PLD-SLAM:A New RGB-D SLAM Method with Point and Line Features for Indoor Dynamic Scene PLD-SLAM:一种基于点线特征的室内动态场景RGB-D SLAM新方法论文地址: https://www.mdpi.com/2220-9964/10/3/163发表期刊: ISPR…

MySQL数据落盘原理(redo、undo、binlog、2PC、double write等。)

文章目录 前言一、架构图1、MySQL架构图2、InnoDB架构图 二、落盘分析1.第一阶段2.第二阶段3.第三阶段4.第四阶段5.第五阶段6.第六阶段 前言 在上一章中我们聊到了事务有四大特性:原子性、一致性、隔离性、持久性。本篇文章就持久性重点聊一下,在高性能…

离子交换法处理含铬废水

含铬废水是从哪里来的? 含铬废水来自:冶金、化工、矿物工程、电镀、制铬、颜料、制药、轻工纺织、铬盐及铬化物的生产等一系列行业,都会产生大量的含铬废水。 含铬废水危害有多大? 1、铬化合物具有致癌作用; 2、铬…

做SSM项目的步骤和优化

SSM框架整合 这里说的SSM整合,主要说的是Spring和mybatis之间的整合。因为spring和springMVC都是spring生态系统中的框架,所以spring和springMVC之间的整合是无缝的整合,即,我们在不知不觉中,其实spring和springMVC已…