最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表单(五)

    正文概述 掘金(crudapi)   2021-03-29   627

    基于Vue和Quasar的前端SPA项目实战之动态表单(五)

    回顾

    通过上一篇文章 基于Vue和Quasar的前端SPA项目实战之序列号(四)的介绍,我们已经完成了元数据中序列号的增删改查,本文主要介绍动态表单设计功能的实现。

    简介

    在crudapi系统中,所有的业务表单都是通过配置动态生成的,代码无需写死,有关基本概念参考之前文章 元数据管理—动态表单设计器在crudapi系统中完整实现 ,表单配置好之后,对应的crud接口就自动生成了。

    UI界面

    「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表单(五) 表单列表

    「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表单(五) 创建表单

    「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表单(五) 索引管理

    API

    「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表单(五) 表单API包括基本的CRUD操作,具体的通过swagger文档可以查看。通过axios封装api,名称为metadataTable

    import { axiosInstance } from "boot/axios";
    
    const metadataTable = {
      create: function(data) {
        return axiosInstance.post("/api/metadata/tables",
           data
        );
      },
      update: function(id, data) {
        return axiosInstance.patch("/api/metadata/tables/" + id,
           data
        );
      },
      list: function(page, rowsPerPage, search, query) {
        if (!page) {
          page = 1
        }
    
        if (!rowsPerPage) {
          rowsPerPage = 10
        }
    
        return axiosInstance.get("/api/metadata/tables",
          {
            params: {
              offset: (page - 1) * rowsPerPage,
              limit: rowsPerPage,
              search: search,
              ...query
            }
          }
        );
      },
      count: function(search, query) {
        return axiosInstance.get("/api/metadata/tables/count",
          {
            params: {
              search: search,
              ...query
            }
          }
        );
      },
      get: function(id) {
        return axiosInstance.get("/api/metadata/tables/" + id,
          {
            params: {
            }
          }
        );
      },
      getByName: function(name) {
        return axiosInstance.get("/api/metadata/tables/name/" + name,
          {
            params: {
            }
          }
        );
      },
      delete: function(id) {
        return axiosInstance.delete("/api/metadata/tables/" + id);
      },
      batchDelete: function(ids) {
        return axiosInstance.delete("/api/metadata/tables",
          {data: ids}
        );
      }
    };
    
    export { metadataTable };
    

    核心代码

    q-table控件

    表单设计页面用到了q-table控件,每一个字段对应一个行,

     <q-table
            :data="table.columns"
            :columns="columns"
            :visible-columns="visibleColumns"
            :pagination.sync="tablePagination"
            row-key="id"
            selection="multiple"
            :selected.sync="selected"
            :loading="loading"
            flat
            separator="cell"
            hide-bottom>
    </q-table>
    

    columns定义

    columns定义了q-table的列属性,涵盖表单的全部属性,比如名称,是否为一,数据类型,长度等。

    columns: [
      {
        name: "dataClickAction",
        align: "center",
        label: "操作",
        field: "dataClickAction",
        sortable: false
      },
      {
        name: "displayOrder",
        align: "left",
        label: "顺序",
        field: "displayOrder",
        sortable: false
      }, {
        name: "caption",
        align: "left",
        label: "中文名称",
        field: "caption",
        sortable: false
      }, {
        name: "name",
        align: "left",
        label: "英文字段",
        field: "name",
        sortable: false
      }, {
        name: "description",
        align: "left",
        label: "描述",
        field: "description",
        sortable: false
      }, {
        name: "unsigned",
        align: "left",
        label: "无符号",
        field: "unsigned",
        sortable: false
      }, {
        name: "dataType",
        align: "left",
        label: "数据类型",
        field: "dataType",
        sortable: false
      }, {
        name: "indexType",
        align: "left",
        label: "索引类型",
        field: "indexType",
        sortable: false
      }, {
        name: "indexStorage",
        align: "left",
        label: "索引存储",
        field: "indexStorage",
        sortable: false
      }, {
        name: "indexName",
        align: "left",
        label: "索引名称",
        field: "indexName",
        sortable: false
      }, {
        name: "length",
        align: "left",
        label: "长度",
        field: "length",
        sortable: false
      }, {
        name: "precision",
        align: "left",
        label: "精度",
        field: "precision",
        sortable: false
      }, {
        name: "scale",
        align: "left",
        label: "小数",
        field: "scale",
        sortable: false
      }, {
        name: "autoIncrement",
        align: "left",
        label: "自增长",
        field: "autoIncrement",
        sortable: false
      }, {
        name: "nullable",
        align: "left",
        label: "空",
        field: "nullable",
        sortable: false
      }, {
        name: "defaultValue",
        align: "left",
        label: "默认值",
        field: "defaultValue",
        sortable: false
      },{
        name: "seqId",
        align: "left",
        label: "序列号",
        field: "seqId",
        sortable: false
      }, {
        name: "insertable",
        align: "left",
        label: "插入",
        field: "insertable",
        sortable: false
      }, {
        name: "updatable",
        align: "left",
        label: "编辑",
        field: "updatable",
        sortable: false
      }, {
        name: "queryable",
        align: "left",
        label: "查询",
        field: "queryable",
        sortable: false
      }
    ]
    

    字段顺序调整

    支持上移,下移,置顶,置底四种操作。

    onTopClick: function(row) {
      const columns = this.table.columns;
      const index = columns.findIndex(t => t.id === row.id);
      if (index != 0){
        columns.unshift(columns.splice(index, 1)[0]);
        }
    },
    onUpClick: function(row) {
      const columns = this.table.columns;
      const index = columns.findIndex(t => t.id === row.id);
      if (index != 0){
        columns[index] = columns.splice(index - 1, 1, columns[index])[0];
        console.dir(columns);
        }
    },
    onDownClick: function(row) {
      const columns = this.table.columns;
      const index = columns.findIndex(t => t.id === row.id);
      if (index != columns.length - 1){
        columns[index] = columns.splice(index + 1, 1, columns[index])[0];
      }
    },
    onBottomClick: function(row) {
      const columns = this.table.columns;
      const index = columns.findIndex(t => t.id === row.id);
      if (index != columns.length - 1){
        columns.push(columns.splice(index, 1)[0]);
      }
    }
    

    增删改查

    通过列表页面,新建页面和编辑页面实现了动态表单基本的crud操作,其中编辑和新建页面类似,编辑页面除了可以设置单个字段的索引,还可以设置多个字段的联合索引,更多内容参考源码即可。

    小结

    本文主要介绍了元数据中动态表单设计功能,支持常见的数据类型和索引,然后实现了动态表单的crud增删改查功能,下一篇文章会介绍元数据中表关系功能。

    demo演示

    官网地址:crudapi.cn
    测试地址:demo.crudapi.cn/crudapi/log…

    附源码地址

    GitHub地址

    github.com/crudapi/cru…

    Gitee地址

    gitee.com/crudapi/cru…

    由于网络原因,GitHub可能速度慢,改成访问Gitee即可,代码同步更新。


    起源地下载网 » 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表单(五)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元