manage-table.vue 3.14 KB
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import useLoading from '@/hooks/loading';
import { AnyObject } from '@/types/global';
import useProjectApi from '@/api/project';
import { Card, Input, Select } from '@arco-design/web-vue';
import EnumTableColumn from '@/components/filter/enum-table-column.vue';
import PhoneTableColumn from '@/components/filter/phone-table-column.vue';
import FilterSearch from '@/components/filter/search.vue';
import FilterSearchItem from '@/components/filter/search-item.vue';
import FilterTable from '@/components/filter/table.vue';
import FilterTableColumn from '@/components/filter/table-column.vue';
import useUserApi from '@/api/user';
import UserTableColumn from '@/components/filter/user-table-column.vue';

const props = defineProps<{ projectKey: number; queryHook?: () => void }>();

const { loading, setLoading } = useLoading(false);
const { manageUsers } = useProjectApi;

const { sexOption, statusOption, officialStatusOption } = useUserApi;

const filter = ref({});
const tableRef = ref();

const onSearch = () => tableRef.value?.onPageChange(1);

const onReset = () => {
  filter.value = { nick_name: '', sex: '', phone_like: '', email_like: '', status: '' };
  onSearch();
};

const onQuery = async (params: AnyObject) => {
  setLoading(true);
  props.queryHook?.();
  return manageUsers(props.projectKey, { ...filter.value, ...params, setSort: 'id' }).finally(() => setLoading(false));
};

onMounted(() => onReset());
</script>

<template>
  <Card :bordered="false">
    <FilterSearch :model="filter" :loading="loading" @search="onSearch" @reset="onReset">
      <FilterSearchItem label="用户艺名">
        <Input v-model="filter.nick_name" allow-clear placeholder="请输入" />
      </FilterSearchItem>
      <FilterSearchItem label="性别">
        <Select v-model="filter.sex" allow-clear placeholder="请选择" :options="sexOption" />
      </FilterSearchItem>
      <FilterSearchItem label="用户邮箱">
        <Input v-model="filter.email_like" allow-clear placeholder="请输入" />
      </FilterSearchItem>
      <FilterSearchItem label="手机号码">
        <Input v-model="filter.phone_like" allow-clear placeholder="请输入" />
      </FilterSearchItem>
      <FilterSearchItem label="状态">
        <Select v-model="filter.status" allow-clear placeholder="请选择" :options="statusOption" />
      </FilterSearchItem>
    </FilterSearch>
    <FilterTable ref="tableRef" :loading="loading" :on-query="onQuery">
      <user-table-column title="用户艺名" data-index="id" :width="200" show-avatar />
      <EnumTableColumn title="性别" data-index="sex" :option="sexOption" :dark-value="0" :width="70" />
      <FilterTableColumn title="用户邮箱" data-index="email" :width="180" />
      <PhoneTableColumn title="手机号码" data-index="phone" area-index="area_code" :width="160" />
      <EnumTableColumn title="关注服务号" data-index="official_status" :option="officialStatusOption" :dark-value="0" :width="120" />
      <EnumTableColumn title="状态" data-index="status" :option="statusOption" :dark-value="0" :width="80" />
    </FilterTable>
  </Card>
</template>

<style scoped lang="less"></style>