前端 高级筛选器

高级筛选器,支持文本和日期类型判断,支持级联字段选择,多用于大数据筛选! 

 

 

 前端代码,主要是通过递归的方式实现

    <el-main style="padding: 10px">
      <el-row>
        <el-row class="child">
          <el-button
            size="small"
            type="primary"
            plain
            icon="el-icon-circle-plus-outline"
            @click='addRule()'
          >新增规则</el-button>
          <el-button
            size="small"
            type="primary"
            plain
            icon="el-icon-circle-plus-outline"
            @click="addRuleList()"
          >新增规则组</el-button>
        </el-row>

        <template v-for="(item, index) in conditionVlueList.list">
          <el-row
            :key="'condition' + index"
            class="child"
            v-if="item.type == 'condition'"
          >
            <el-select
              class="newSeclect"
              v-model="item.concat"
              size="small"
              placeholder="请选择"
            >
              <el-option
                label="and"
                value="and"
              > </el-option>
              <el-option
                label="or"
                value="or"
              > </el-option>
            </el-select>
            <el-cascader
              v-model="item.codeCasder"
              class="codeSeclect"
              filterable
              v-show="caseCarderShow == true"
              :options="codeOptions"
              :show-all-levels="false"
              size="small"
              @change="changeCodeOption(item)"
            ></el-cascader>
            <el-select
              v-show="caseCarderShow == false"
              v-model="item.code"
              placeholder="请选择"
              class="codeSeclect"
              size="small"
              filterable
              @change="changeSelectOption(item)"
            >
              <el-option
                v-for="item in selectOptions"
                :key="item.fieldName"
                :label="item.fieldCaptionByname"
                :value="item.fieldName"
              >
              </el-option>
            </el-select>
            <el-select
              v-model="item.inputLabel"
              placeholder="请选择"
              class="codeSeclect"
              size="small"
              v-show=false
            >
              <el-option
                v-for="item in codeOptions"
                :key="item.fieldCaption"
                :label="item.fieldCaption"
                :value="item.fieldCaption"
              >
              </el-option>
            </el-select>
            <el-select
              v-model="item.fileter"
              size="small"
              placeholder="请选择"
              class="filterSelect"
            >
              <el-option
                v-for="item in filterList"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
            <el-input
              v-model="item.inputValue"
              v-show="item.codeType !== 'datetime'"
              size="small"
              class="inputSelect"
              placeholder="请输入规则"
            ></el-input>
            <el-date-picker
              v-show="item.codeType == 'datetime'"
              v-model="item.inputValue"
              class="inputSelect"
              type="date"
              size="small"
              placeholder="选择日期"
              value-format="yyyy-MM-dd"
            >
            </el-date-picker>
            <i
              @click="parDelete(item,index)"
              size="mini"
              type="danger"
              style="margin-left:10px"
              class="el-icon-delete deleIcon"
            ></i>
          </el-row>
          <el-row
            v-if="item.type == 'group' && item.list.length > 0"
            :key="'group' + index"
            class="child"
          >
            <createChild
              :conditionVlueList="item"
              :codeOptions="codeOptions"
              :filterList="filterList"
              :caseCarderShow="caseCarderShow"
              :selectOptions="selectOptions"
            ></createChild>
          </el-row>
        </template>
      </el-row>
      <el-button
        v-show="saveButton == true"
        @click="save"
        type="primary"
        class="saveButton"
      >保存</el-button>
      <el-button
        v-show="saveButton == false"
        @click="save"
        type="success"
        icon="el-icon-edit"
        size="small"
        plain
        class="getButton"
      >保存</el-button>
    </el-main>

 递归函数,并且判断数据源是否为sqlServer,对拼接字段进行特殊处理

    // 递归将数组转为字符串
    foreachArr(arr) {
      let sql = ''
      let newCode = ''
      for (let i = 0; i < arr.length; i++) {
        if (this.isSqlServer == 'sqlserver') {
          newCode = '[' + arr[i].code + ']'
        }
        else {
          newCode = arr[i].code
        }
        // 判断是否为规则组
        if (arr[i].type == 'group' && arr[i].list.length > 0) {
          sql = sql + ' ' + arr[i].concat + ' (' + this.foreachArr(arr[i].list) + ') '
        }
        else if (arr[i].concat == '') {
          if (arr[i].codeType == 'DateTime' || arr[i].codeType == 'String' || arr[i].codeType == 'Date') {
            sql = sql + ' ' + newCode + ' ' + arr[i].fileter + ' ' + "'" + arr[i].inputValue + "'"
          }
          else {
            sql = sql + ' ' + newCode + ' ' + arr[i].fileter + ' ' + "'" + arr[i].inputValue + "'"
          }
        }
        else if (arr[i].type == 'condition') {
          // 判断是否为日期
          if (arr[i].codeType == 'DateTime' || arr[i].codeType == 'String' || arr[i].codeType == 'Date') {
            sql = sql + ' ' + arr[i].concat + ' ' + newCode + ' ' + arr[i].fileter + ' ' + "'" + arr[i].inputValue + "'"
          }
          else {
            sql = sql + ' ' + arr[i].concat + ' ' + newCode + ' ' + arr[i].fileter + ' ' + "'" + arr[i].inputValue + "'"
          }
        }
      }
      return sql
    },

保存进行传参 

    save() {
      // 数组插入key
      if (this.conditionVlueList.list.length > 0) {
        this.conditionVlueList.list[0].concat = ''
        this.sqlCode = ' and ' + '(' + this.foreachArr(this.conditionVlueList.list) + ')'
        this.sqlZh = this.foreachArrZh(this.conditionVlueList.list)
      }
      else {
        this.sqlCode = ''
        this.sqlZh = ''
      }
      this.$emit("saveFilter", this.conditionVlueList.list, this.sqlCode, this.sqlZh);
    },

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值