在网站内容日益丰富的今天,如何让用户快速找到他们感兴趣的信息,是一个至关重要的运营课题。安企CMS(AnQiCMS)提供了强大的内容管理能力,而其API接口更是为前端开发者构建灵活多变的交互界面提供了坚实的基础。今天,我们就来深入探讨如何利用archiveFilters接口的响应数据,动态地构建出前端筛选UI,例如常见的下拉菜单或多选框。

动态筛选界面的价值

想象一下,如果您的网站有大量商品、文章或职位信息,用户可能希望根据“价格区间”、“发布时间”、“城市”、“学历”等多种条件进行筛选。如果这些筛选条件是固定的,每次后端调整都需要前端工程师修改代码,这无疑增加了维护成本。而通过动态构建筛选UI,前端可以根据后端接口实时返回的筛选条件,自动生成相应的下拉菜单或多选框,极大地提升了网站的灵活性和可维护性。

揭秘archiveFilters接口:筛选条件的数据源

安企CMS的archiveFilters接口正是实现这一功能的核心。它允许我们获取指定内容模型的筛选条件列表。

调用这个接口非常简单,只需向 {域名地址}/api/archive/filters 发送一个 GET 请求,并附带一个必填参数 moduleId,这个 moduleId 指明了您想获取哪个内容模型(比如文章模型、产品模型等)下的筛选条件。

该接口的响应数据结构清晰明了,通常会返回一个包含多个筛选器对象的数组。每个筛选器对象都包含了几个关键信息:

  • name: 这是筛选器在前端展示时应该使用的中文名称,比如“城市”、“学历”等,用户会直接看到这个名称。
  • field_name: 这是筛选器对应的后端字段名称,例如 citycertificate。这个名称非常重要,因为当用户选择筛选条件后,我们会将这个 field_name 作为参数名,连同用户选择的值,一同发送给archiveList接口,从而获取到符合条件的文档列表。
  • items: 这是一个数组,包含了当前筛选器所有可用的选项。每个选项又包含 label(实际显示的选项文本,如“北京”、“本科”)和 total(表示该选项下有多少条文档,虽然示例中显示为0,但实际项目中可以根据需要用于显示数量)。

通过解析这个响应,我们就能知道当前内容模型支持哪些筛选维度,每个维度又有哪些具体的选项。

{
  "code": 0,
  "data": [
    {
      "name": "城市",
      "field_name": "city",
      "items": [
        { "label": "全部", "total": 0 },
        { "label": "北京", "total": 0 },
        { "label": "上海", "total": 0 }
      ]
    },
    {
      "name": "学历",
      "field_name": "certificate",
      "items": [
        { "label": "全部", "total": 0 },
        { "label": "硕士", "total": 0 },
        { "label": "本科", "total": 0 }
      ]
    }
  ],
  "msg": ""
}

动态构建前端UI的实践步骤

有了archiveFilters提供的强大数据,接下来就是如何在前端将这些数据转化为用户友好的筛选界面。

第一步:获取筛选数据

首先,在页面加载时,或者当用户切换内容模型时,我们需要调用archiveFilters接口获取最新的筛选条件。这通常是一个异步操作,可以使用JavaScript的 fetchaxios 等库来完成。

async function fetchFilters(moduleId) {
  try {
    const response = await fetch(`/api/archive/filters?moduleId=${moduleId}`);
    const result = await response.json();
    if (result.code === 0) {
      return result.data; // 返回筛选器数据数组
    } else {
      console.error('获取筛选条件失败:', result.msg);
      return [];
    }
  } catch (error) {
    console.error('请求筛选条件接口出错:', error);
    return [];
  }
}

第二步:解析与渲染UI组件

获取到data数组后,我们就可以遍历这个数组,为每个筛选器动态地创建前端UI元素。对于每个筛选器对象,我们可以根据其name来作为筛选区域的标题,field_name将作为后端请求的参数名,而items数组则用来生成具体的选项。

这里,我们可以根据实际需求来决定是使用下拉菜单(<select>)还是多选框(<input type="checkbox">)。

创建下拉菜单 (适用于单选筛选,如“城市”)

如果某个筛选维度用户通常只选择一个值(比如“城市”),下拉菜单是一个简洁有效的选择。

function renderDropdownFilter(filterData) {
  const filterContainer = document.getElementById('filters-area'); // 假设页面上有一个ID为'filters-area'的容器
  const div = document.createElement('div');
  div.className = 'filter-group';

  const label = document.createElement('label');
  label.textContent = filterData.name + ':';
  div.appendChild(label);

  const select = document.createElement('select');
  select.setAttribute('data-field-name', filterData.field_name); // 存储field_name,方便后续获取选中的值

  filterData.items.forEach(item => {
    const option = document.createElement('option');
    option.value = item.label === '全部' ? '' : item.label; // 如果是“全部”选项,值可以设置为空字符串
    option.textContent = item.label;
    select.appendChild(option);
  });

  select.addEventListener('change', (event) => {
    // 处理用户选择的变化,触发文档列表更新
    // 例如:updateArchiveList(filterData.field_name, event.target.value);
    console.log(`选中 ${filterData.name}: ${event.target.value}`);
  });

  div.appendChild(select);
  filterContainer.appendChild(div);
}

创建多选框组 (适用于多选筛选,如“标签”或某些自定义属性)

如果某个筛选维度用户可能需要选择多个值(比如筛选多个“特长”),那么一组多选框会更加合适。

”`javascript function renderCheckboxFilter(filterData) { const filterContainer = document.getElementById(‘filters-area’); const div = document.createElement(‘div’); div.className = ‘filter-group’;

const label = document.createElement(‘label’); label.textContent = filterData.name + ‘:’; div.appendChild(label);

const checkboxGroup = document.createElement(‘div’); checkboxGroup.className = ‘checkbox-options’;

filterData.items.forEach(item => {

// 排除“全部”选项,多选框通常不需要