app列表页(复杂筛选)

<template>
  <div class="wh main bxs">
    <div class="header bxs w">
      <van-row>
        <van-col @click="backFn" span="8" class="f18 corm pl10"
          ><van-icon name="arrow-left" class="corm" />返回</van-col
        >
        <van-col span="8" class="tc f20">用户管理</van-col>
        <van-col span="8" class="tr f16 pr10 corm">
          <span @click="addFn">新增</span>
        </van-col>
      </van-row>
    </div>
    <div class="wh bxs content">
      <div class="contentSea bxs w">
        <div class="search_condition f12" @click="showFilterFn">
          <span>筛选</span>
          <van-icon name="filter-o" />
        </div>
        <van-search
          v-model="bizTitle"
          placeholder="输入用户名/登录账号/身份证号搜索"
          @search="onSearch"
        />
      </div>
      <!-- main.js 引入注册 -->
      <scroller
        :on-infinite="infinite"
        :noDataText="noDataText"
        class="bxs p10 h"
        ref="myscroller"
      >
        <div class="contentList bxs w ptnew">
          <van-swipe-cell v-for="(item, i) of tableData" :key="i">
            <div class="w p10 list bxs mb10" @click="detailFn(item)">
              <div class="list-item">
                <div class="f16 titleInfo flex">
                  <span class="text_1">{{ item.nickName }}</span>
                </div>
                <div class="f12 mt5">
                  {{ item.userName }}
                </div>
                <div class="list-item-lf bxs p10 bgcm">
                  <div class="wh flexca">
                    <van-icon name="manager" size="25" />
                  </div>
                </div>
                <div class="list-item-rt bxs p10 bgf f12">
                  <div class="h flexca" style="color: #2e7cf9">
                    <span>
                      <i class="iconfont icon-ticket_renlianshibie"> </i>
                      信息登记</span
                    >
                    <span class="ml10 f13"
                      ><van-icon name="more-o" class="f16" /> 操作</span
                    >
                  </div>
                </div>
              </div>
            </div>
            <template #right>
              <van-button
                square
                style="margin-left: 1px"
                type="info"
                text="删除"
                class="delete-button"
                @click="deleteFn(item)"
              />
            </template>
          </van-swipe-cell>
        </div>
      </scroller>
    </div>
    <!-- 筛选组14 -->
    <van-popup
      class="page-filter"
      v-model="showFilter"
      position="bottom"
      :style="{ height: '450px' }"
    >
      <div class="filter-header tc f20 pt20">全部筛选</div>
      <div class="filter-content">
        <div>
          <div class="pl10 pr10 pb10 f14">是否录入人脸</div>
          <div class="pl10 pr10 pb10">
            <span
              :class="
                filterObj.identity === true
                  ? 'filter-tag filter-tag-active '
                  : 'filter-tag'
              "
              @click="filterObjChangeFn(1, true)"
              ></span
            >
            <span
              :class="
                filterObj.identity === false
                  ? 'filter-tag filter-tag-active '
                  : 'filter-tag'
              "
              @click="filterObjChangeFn(1, false)"
              ></span
            >
          </div>
        </div>
        <div>
          <div class="pl10 pr10 pb10 f14">用户类型</div>
          <div class="pl10 pr10 pb10">
            <span
              :class="
                filterObj.dataType === 0
                  ? 'filter-tag filter-tag-active'
                  : 'filter-tag'
              "
              @click="filterObjChangeFn(2, 0)"
              >内部用户</span
            >
            <span
              :class="
                filterObj.dataType === 1
                  ? 'filter-tag filter-tag-active'
                  : 'filter-tag'
              "
              @click="filterObjChangeFn(2, 1)"
              >外部用户</span
            >
          </div>
        </div>
        <div>
          <div class="pl10 pr10 pb10 f14">按单位筛选</div>
          <div class="pl10 pr10 pb10">
            <span
              :class="'filter-tag'"
              @click="mechanismChangeFn(1)"
              v-if="filterObj.companyIds.length == 0"
              >选择机构</span
            >
            <span
              @click="mechanismChangeFn(1)"
              class="filter-tag filter-tag-active"
              v-else
              >{{ filterObj.companyNames }}</span
            >
            <span v-if="filterObj.companyIds.length > 0">
              <span
                v-if="!filterObj.deptIds || filterObj.deptIds.length == 0"
                :class="'filter-tag'"
                @click="mechanismChangeFn(2)"
                >选择部门</span
              >
              <span
                @click="mechanismChangeFn(2)"
                class="filter-tag filter-tag-active"
                v-else
                >{{ filterObj.deptNames }}</span
              >
            </span>
          </div>
        </div>
        <div>
          <div class="pl10 pr10 pb10 f14">职务筛选</div>
          <div class="pl10 pr10 pb10">
            <span
              :class="'filter-tag'"
              @click="companyChangeFn"
              v-if="!filterObj.postValues || filterObj.postValues.length == 0"
              >选择职务</span
            >
            <span
              @click="companyChangeFn"
              class="filter-tag filter-tag-active"
              v-else
              >{{ filterObj.postValuesName }}</span
            >
          </div>
        </div>
      </div>
      <div class="filter-btm-btn flexca bxs pb20 f14">
        <div class="btn_l btn" @click="reSetFn">重置</div>
        <div class="btn_r btn" @click="complageFn">完成</div>
      </div>
    </van-popup>
  </div>
</template>
<script>
import {
  getUserQueryList,
  delByUserIds,
} from "@/api/mine_userManage";
import {
  getDictTypeList,
} from "@/api/sys";
// 状态关联关键词*
// 筛选组
export default {
  data () {
    return {
      bizTitle: "",//搜索参数
      tableData: [],//列表初始化数据
      page: {
        index: 0,
        size: 10,
        total: null,
      },
      // 筛选弹框是否弹起
      showFilter: false,
      //弹框临时用
      filterObj: {
        identity: "", //没录入人脸
        dataType: "", //0内部 1外部
        companyIds: [],//机构id
        companyNames: '',
        deptIds: [],//部门id
        deptNames: '',
        postValues: [],//职务
        postValuesName: ''

      },
      //筛选组1 筛选条件
      formSearch: {//实际搜索用
        identity: "", //没录入人脸
        dataType: "", //0内部 1外部
        companyIds: [],
        companyNames: '',
        deptIds: [],
        deptNames: '',
        postValues: [],
      },
      //筛选组--2 start
      formSearchCopy: {}, //备份重置用
      companyShow: false,
      haveFilter: false,
      noDataTextEnd: "没有更多数据了",
      noDataText: "",
      positions: [],//职务列表
      //筛选组2-- end
    };
  },
  created () {
    //筛选组3
    this.formSearchCopy = JSON.parse(JSON.stringify(this.filterObj));
    this.employeeId = JSON.parse(localStorage.getItem("employeeId"));
    this.departmentId = localStorage.getItem("departmentId");
    //筛选组4
    var deptObj = JSON.parse(localStorage.getItem("depId"));
    if (deptObj) {
      this.showFilter = true;
      let selectNames = [];
      let selectIds = [];
      deptObj.depId.forEach((item) => {
        selectNames.push(item.label);
        selectIds.push(item.id);
      });
      if (localStorage.getItem("filterObj")) {
        this.filterObj = JSON.parse(
          localStorage.getItem("filterObj")
        );
      }
      if (deptObj.name == 'userManageList') {
        this.filterObj.companyNames = selectNames.toString();
        this.filterObj.companyIds = selectIds;
      } else {
        this.filterObj.deptNames = selectNames.toString();
        this.filterObj.deptIds = selectIds;
      }
      setTimeout(() => {
        localStorage.removeItem("depId");
        localStorage.removeItem("filterObj");
      }, 50);
    }
    //筛选组5 筛选条件
    if (localStorage.getItem("formSearch")) {
      this.haveFilter = true;
      this.formSearch = JSON.parse(
        localStorage.getItem("formSearch")
      );
    }
  },
  // 页面销毁生命周期方法
  beforeDestroy () {
    this.$toast.clear();
  },
  methods: {
    // 删除
    async deleteFn (item) {
      const res = await delByUserIds(item.userId);
      if (res.code == 200) {
        this.$toast.success("刪除成功");
        this.page.index = 0;
        this.tableData = [];
        this.getData();
      }
    },
    // 详情跳转
    detailFn (item) {
      this.$router
        .push({
          name: "userManageDetail",
          params: {
            userId: item.userId,
            item: item,
          },
        })
        .then((res) => {
          console.log(res);
        })
        .catch((error) => {
          console.log(error);
        }); //把error 抛出来;
    },
    // 新增
    addFn () {
      this.$router
        .push({ name: "userMessAdd" })
        .then((res) => {
          console.log(res);
        })
        .catch((error) => {
          console.log(error);
        }); //把error 抛出来;
    },
    // 搜索
    onSearch () {
      this.page = {
        index: 0,
        size: 10,
        total: null,
      };
      console.log(this.page);
      this.$refs.myscroller.finishInfinite(false);
      this.tableData = [];
    },
    infinite (done) {
      setTimeout(() => {
        this.page.index++;
        this.getData(done);
      }, 500);
    },
    // 初始化数据
    async getData (done) {
      let datVal = {
        keyword: this.bizTitle,
        ...this.formSearch,
        pageNum: this.page.index,
        pageSize: this.page.size,
      };
      console.log(this.page.index, "index");
      const result = await getUserQueryList(datVal);
      if (this.$refs.myscroller) {
        this.$refs.myscroller.finishInfinite(true);
      }
      if (result.data.length < 10) {
        this.noDataText = this.noDataTextEnd;
      }
      if (result.data && result.data.length > 0) {
        if (typeof done == "function") {
          done();
        }
        this.tableData = this.tableData.concat(result.data);
        console.log(this.tableData, result.data);
        if (result.pageNum) {
          this.page.index = result.pageNum;
        }
        this.page.total = result.total;
      }
    },
    backFn () {
      this.$router.back();
    },
    // page筛选组件----------------------------start
    // #region
    // 筛选组6 职务
    async getlistAppointmentType () {
      const res = await getDictTypeList('user_post_type', {
        dictType: "user_post_type",
        status: 0,
      });
      this.positions = res.data;
    },
    // 筛选组7 职务 确定
    companyOnConfirm (value) {
      this.filterObj.postValues = [value.dictValue];
      this.filterObj.postValuesName = value.dictLabel;
      this.companyShow = false;
      this.showFilter = true;
    },
    //筛选组8 弹出职务
    companyChangeFn () {
      this.companyShow = true;
    },
    // 筛选组9 选择机构
    mechanismChangeFn (num) {
      localStorage.setItem(
        "filterObj",
        JSON.stringify(this.filterObj)
      );
      if (num == 1) {
        this.$router
          .push({
            name: "selectdep2",
            query: {
              name: "userManageList",
              depId: this.filterObj.companyIds,
              select: true,
            },
          })
          .catch((error) => {
            console.log(error);
          });
      } else {
        this.$router
          .push({
            name: "selectdep2",
            query: {
              name: "userManageList_dept",
              companyIds: this.filterObj.companyIds.toString(),
              select: true,
              disabledCompany: true
            },
          })
          .catch((error) => {
            console.log(error);
          });
      }
    },

    //筛选组10 重置
    reSetFn () {
      this.filterObj = { ...this.formSearchCopy };
      localStorage.setItem(
        "formSearch",
        JSON.stringify(this.formSearchCopy)
      );
    },

    //筛选组11 完成
    complageFn () {
      this.formSearch = { ...this.filterObj };
      if (this.formSearch.companyFilter) {
        this.formSearch.companyFilter = JSON.parse(
          localStorage.getItem("departmentObj")
        ).belongToCompanyId;
      }
      localStorage.setItem(
        "formSearch",
        JSON.stringify(this.filterObj)
      );
      this.showFilter = false;
      this.onSearch();
    },
    //筛选组12 完成
    filterObjChangeFn (num, type) {
      let filterObj = this.filterObj;
      if (num == 1) {
        filterObj.identity = type;
      } else if (num == 2) {
        filterObj.dataType = type;
      } else {
        filterObj.companyFilter = type;
      }
      this.filterObj = { ...filterObj };
    },
    //筛选组13 筛选弹框
    showFilterFn () {
      this.getlistAppointmentType()
      this.filterObj = { ...this.formSearch };
      this.showFilter = true;
    },
    // #endregion
    // page筛选组件----------------------------end


  },
};
</script>
<style lang="scss" scoped>
.contentList.ptnew {
  padding-top: 105px;
}
.search_condition {
  position: absolute;
  top: 15px;
  right: 15px;
  display: inline-block;
  padding: 3px 8px;
  background-color: #fff;
  border-radius: 5px;
  z-index: 999;
}

.main {
  position: relative;
  .header {
    height: 50px;
    line-height: 50px;
    position: fixed;
    background: #fff;
    top: 0;
    left: 0;
    z-index: 100;
  }
  .content {
    background: #f5f8f8;
    padding-top: 105px;
    .contentSea {
      position: fixed;
      top: 50px;
      left: 0;
      background: #fff;
      z-index: 100;
    }
    .contentList {
      .list {
        background: #fff;
        position: relative;
        border-radius: 4px;
        .list-item {
          width: 100%;
          box-sizing: border-box;
          position: relative;
          padding-left: 50px;
        }
        .list-item-lf {
          position: absolute;
          left: 0;
          top: 0;
          width: 40px;
          height: 40px;
          border-radius: 50%;
        }
        .list-item-rt {
          position: absolute;
          right: 0;
          top: 0;
        }
        // div:nth-child(1) {
        //   width: 80%;
        // }
        // .flotDiv {
        //   position: absolute;
        //   top: 10px;
        //   right: 0;
        //   background: #cc0000;
        //   color: #fff;
        // }
      }
    }
  }
}
.delete-button {
  height: 100%;
}
.filter-btm-btn {
  width: 100%;
  position: absolute;
  bottom: 0;
  left: 0;
  background-color: #fff;
  box-sizing: border-box;
  padding-top: 10px;
  .btn {
    display: inline-block;
    width: 40%;
    height: 40px;
    line-height: 40px;
    background-color: #8a8a8a;
    color: #fff;
    text-align: center;
  }
  .btn_l {
    border-radius: 20px 0 0 20px;
  }
  .btn_r {
    border-radius: 0 20px 20px 0;
    background-color: #2e7cf9;
  }
}
</style>

 

posted @ 2023-05-06 11:35  ThisCall  阅读(42)  评论(0编辑  收藏  举报