实现表单项按配置展示

春风化雨
• 阅读 958

实现表单展示方式通过数据库表配置实现

  1. 数据库配置表
  2. 表单元素按数据库配置来确定展示形式text,时间框,文本框等
  3. 配置校验,校验实现

    一、数据库配置表

    ①建表

    create table *_config
    (
    item_id bigint auto_increment comment '主键',
    form_id bigint not null comment '表单编号',
    item_type varchar(10) null comment '对象类型,1、字段物理名称、2:属性ID,3:模块标识',
    item_key varchar(30) null comment '属性id',
    item_name varchar(30) null comment '字段名称',
    item_value varchar(30) null comment '属性值',
    default_value varchar(30) null comment '默认值',
    show_type varchar(30) default 'text' not null comment '展示形式 text、date、picker、smartInput',
    is_display char null comment '是否显示,0:否、1:是',
    is_editable char null comment '是否可编辑,0:否、1:是',
    is_data_mask char null comment '是否脱敏,0:否、1:是',
    mask_type varchar(5) null comment '脱敏类型,1:名称、2:证件号码、3:地址、4:电话号码',
    check_rule varchar(50) null comment '校验规则名称',
    remark varchar(300) null comment '备注',
    seq tinyint not null comment '顺序',
    status_cd char(2) default '00' not null comment '状态 00:有效,其他:无效',
    CREATE_DATE datetime default CURRENT_TIMESTAMP null comment '创建时间'
    )
    comment '表单属性项配置';

    ②插入示例记录

    INSERT INTO *_config(item_id, form_id, item_type, item_key, item_name, item_value, default_value, show_type, is_display, is_editable, is_data_mask, mask_type, check_rule, remark, seq, status_cd, CREATE_DATE)
    VALUES (1, 2, '1', '20210810067', '支局名称', '', null, 'text', '1', '0', '0', null, null, '', 1, '00', '2022-02-28 09:57:47');
    INSERT INTO *_config(item_id, form_id, item_type, item_key, item_name, item_value, default_value, show_type, is_display, is_editable, is_data_mask, mask_type, check_rule, remark, seq, status_cd, CREATE_DATE)
    VALUES (3, 2, '1', '20210810069', '小区名称', '', null, 'smartInput', '1', '1', '0', null, '', '', 3, '00', '2022-02-28 09:58:05');
    INSERT INTO *_config(item_id, form_id, item_type, item_key, item_name, item_value, default_value, show_type, is_display, is_editable, is_data_mask, mask_type, check_rule, remark, seq, status_cd, CREATE_DATE)
    VALUES (6, 2, '1', '20210810072', '合约到期时间', '', null, 'date', '1', '1', '0', null, null, '', 6, '00', '2022-02-28 09:58:12');
    INSERT INTO *_config(item_id, form_id, item_type, item_key, item_name, item_value, default_value, show_type, is_display, is_editable, is_data_mask, mask_type, check_rule, remark, seq, status_cd, CREATE_DATE)
    VALUES (7, 2, '1', '20210810074', '现有宽带速率', '', null, 'picker', '1', '1', '0', null, null, '', 7, '00', '2022-02-28 09:58:14');

二、表单页面实现

<van-form ref="attrFrom" @submit="onSubmit">
    <div v-for="attr in attrList">
        <div v-if="attr.cfg.showType == 'text'">
          <van-field v-model="attr.value" :label="attr.attrName"
            :readonly="attr.cfg.isEditable=='0'"
            :clickable="attr.cfg.isEditable=='1'"
            label-align="right"
            label-width="8em"
            :rules="te(attr.cfg.checkRule)"
            :right-icon="attr.cfg.isEditable=='1'?'edit':''"
            @change="onSubmit"
            @click="clickField(attr.cfg)"
          >
          </van-field>
        </div>
        <div v-else-if="attr.cfg.showType == 'date'">
          <van-field v-if="attr.cfg.isEditable=='0'" v-model="attr.value" :label="attr.attrName"
            readonly
            label-align="right"
            label-width="8em"
          >
          </van-field>
          <van-field v-if="attr.cfg.isEditable=='1'" v-model="attr.value" is-link readonly
            :label="attr.attrName"
            label-align="right"
            label-width="8em"
            @click="clickField(attr.cfg)"
          >
          </van-field>
          <van-calendar 
            v-if="attr.cfg.isEditable=='1'" 
            v-model:show="attr.cfg.isShowPopup" 
            @confirm="(value) => onConfirmDate(value, attr)">
          </van-calendar>
        </div>
        <div v-else-if="attr.cfg.showType == 'picker'">
          <van-field v-if="attr.cfg.isEditable=='0'" v-model="attr.cfg.valueMap[attr.value]" :label="attr.attrName"
            readonly
            label-align="right"
            label-width="8em"
          >
          </van-field>
          <van-field v-if="attr.cfg.isEditable=='1'"
            v-model="attr.value"
            is-link
            readonly
            :label="attr.attrName"
            name="picker"
            label-align="right"
            label-width="8em"
            @click="clickField(attr.cfg)">
          </van-field>
          <van-popup round v-if="attr.cfg.isEditable=='1'" 
          v-model:show="attr.cfg.isShowPopup" 
          position="bottom">
            <van-picker
              show-toolbar
              confirm-button-text="确定"
              cancel-button-text="取消"
              :columns="values"
              value-key="attrValueName"
              :colunmsFieldNames="{text:'attrValueName'}"
              @confirm="(value) => onConfirm(value, attr)"
              @cancel="onCancel(attr.cfg)"
            />
          </van-popup>
        </div>
        <div v-else-if="attr.cfg.showType == 'smartInput'">
          <van-field v-if="attr.cfg.isEditable=='0'" v-model="attr.value" :label="attr.attrName"
            readonly
            label-align="right"
            label-width="8em"
          >
          </van-field>
          <van-field v-if="attr.cfg.isEditable=='1'"
           name="my-field" 
           :label="attr.attrName"
           label-align="right"
           label-width="8em"
           :right-icon="'edit'"
           >
            <template #input>
              <smart-input id="service" @sync="syncService" :props="attr"></smart-input>
            </template>
          </van-field>    
        </div>
    </div>
</van-form>

三、校验实现

data () {

  return {
    loadingMap: {},
    showSubmit: false,
    showPicker: {},
    attrList: [],
    attrMap: {},
    cfgMap: {},
    customFieldName: {
      text: 'attrValueName',
      values: 'valueList'
    },
    values: [],
    rules: {
      isMobile: [
        {
          pattern: /^1[0-9]{10}$/,
          message: '请输入正确手机号'
        }
      ],
      isNumber: [
        {
          pattern: /^[0-9]+(.[0-9]{1,3})?$/,
          message: '请输入正确数字'
        }
      ]
    },
    addrName: '',
    addrId: ''
  }
},
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
灯灯灯灯 灯灯灯灯
4年前
年后腾讯二面,第一个问MySQL主从结构,给我整不会了
一、MySQL一主一从数据库服务器192.168.4.51配置为主数据库服务器数据库服务器192.168.4.52配置为从数据库服务器客户端192.168.4.50测试配置其中192.168.4.51是主服务器,另一台192.168.4.52作为从服务器,通过调取主服务器上的binlog日志,在本地重做对应的库、表,实现与主服务器的数据同步
似梦清欢 似梦清欢
2年前
线性表
线性表的顺序存储实现(数组形式)称为顺序表。线性表顺序表示原理解析这里描述的线性表是逻辑结构的,独立于存储结构。线性表的顺序表示简称顺序表。顺序表实现线性表的方式是使用数组。线性表第一个元素的数组下标是0。另外一种实现顺序表的方法:使用数组方式比动态分配更
Stella981 Stella981
3年前
Spring Security使用详解4(基于数据库的URL权限规则配置)
虽然前面我们实现了通过数据库来配置用户与角色,但认证规则仍然是使用HttpSecurity进行配置,还是不够灵活,无法实现资源和角色之间的动态调整。要实现动态配置 URL权限,就需要开发者自定义权限配置,具体步骤如下。四、基于数据库的URL权限规则配置 1、数据库设计这里的数据库在前文(点击查看)的基础上增加一张资
Stella981 Stella981
3年前
MybatisPlus知识详解以及用十数个例子完成MybatisPlus的入门到进阶
1\.MybatisPlus1.1业务需求Mybatis缺点:1.Mybatis操作数据库的过程中,需要编辑大量的sql语句.无论该sql是否复杂或者简单.2.Mybatis操作时在xml配置文件中需要额外记忆单独的标签.需求:能否实现单表操作的CRUD的全自动的实现.能否实现
Stella981 Stella981
3年前
ShardingSphere学习:06
实战代码后续上传(https://gitee.com/"实战代码后续上传")代码同上篇一致,只是配置文件不同。我们主要看一下,配置文件。分表配置由于的单库分表,所以只配置一个数据源就可以了配置数据源spring.shardingsphere.datasource.namestest0tes
Stella981 Stella981
3年前
ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引
0x00 filebeat配置多个topicfilebeat.prospectors:input_type:logencoding:GB2312fields_under_root:truefields:添加字段
Stella981 Stella981
3年前
JFinal使用笔记2
大部分步骤按cf官方的教程就可以了。遇到的问题如下:1、使用C3p0Plugin配置数据库连接,代码如下//配置C3p0数据库连接池插件//C3p0Pluginc3p0PluginnewC3p0Plugin(getProperty("jdbcUrl"),getProperty("user"),getP
Stella981 Stella981
3年前
EntityFrameworkCore 中实体的几种配置方法
EntityFramework有几种方式可实现数据库表与实体的关系配置(relationship)1.convention2.annotation3.fluentapi使用数据注解实体类通常是在Models目录下,直接在实体类上添加属性注解,比如Required/Key等.
春风化雨
春风化雨
Lv1
往事与你兵戎相见,岁月对你张牙舞爪,你选择屈从
文章
2
粉丝
0
获赞
0