前端 高级筛选器

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

 

 

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

    <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);
    },

前端高级筛选(Advanced Search)是指在用户界面上提供一组复杂的过滤条件,允许用户通过多条件的组合来精确地查找所需的数据。高级筛选通常包括多个输入框、下拉菜单、日期选择器、复选框等控件,用户可以根据需要选择或输入不同的条件来进行搜索。 高级筛选的实现通常涉及以下几个步骤: 1. **用户界面设计**:设计一个用户友好的界面,包含各种筛选控件,如文本框、下拉菜单、日期选择器等。 2. **数据处理**:在用户提交筛选条件后,前端需要将条件转换为后端可识别的格式,通常是JSON或URL参数。 3. **与后端交互**:通过AJAX或Fetch API将筛选条件发送到后端,后端根据条件进行数据查询,并将结果返回给前端。 4. **结果显示**:前端接收到后端返回的数据后,将其展示在界面上,通常以列表或表格的形式呈现。 以下是一个简单的示例代码,展示了如何使用JavaScript和HTML实现一个基本的高级筛选功能: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>高级筛选示例</title> <style> /* 简单的样式 */ .filter-container { margin-bottom: 20px; } .filter-container input, .filter-container select { margin-right: 10px; } </style> </head> <body> <h1>高级筛选示例</h1> <div class="filter-container"> <input type="text" id="name" placeholder="姓名"> <select id="gender"> <option value="">性别</option> <option value="male">男</option> <option value="female">女</option> </select> <input type="date" id="startDate" placeholder="开始日期"> <input type="date" id="endDate" placeholder="结束日期"> <button onclick="search()">搜索</button> </div> <div id="results"></div> <script> function search() { const name = document.getElementById('name').value; const gender = document.getElementById('gender').value; const startDate = document.getElementById('startDate').value; const endDate = document.getElementById('endDate').value; const filters = { name: name, gender: gender, startDate: startDate, endDate: endDate }; // 模拟与后端交互 fetch('/search', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(filters) }) .then(response => response.json()) .then(data => { displayResults(data); }) .catch(error => console.error('Error:', error)); } function displayResults(data) { const resultsDiv = document.getElementById('results'); resultsDiv.innerHTML = ''; data.forEach(item => { const div = document.createElement('div'); div.textContent = `Name: ${item.name}, Gender: ${item.gender}, Date: ${item.date}`; resultsDiv.appendChild(div); }); } </script> </body> </html> ``` 在这个示例中,用户可以通过姓名、性别和日期范围进行筛选,点击搜索按钮后,前端筛选条件发送到后端,并展示返回的结果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值