考核3

知识点总结

表格的样式

用组件构成,需要引用

<a-table
      size="small"
      :dataSource="tableData"
      :columns="columns"
      rowKey="id"
      bordered
      :loading="tableLoading"
      :pagination="false"
      :row-selection="{ selectedRowKeys: selectedRowKeyList, onChange: onSelectChange }"
    >
      <template #bodyCell="{ text, record, column }">
        <template v-if="column.dataIndex === 'enableFlag'">
         <a-tag 
          :color="record.enableFlag === 1 ? 'success' : 'error'"
          style="cursor: pointer"
          @click="toggleEnableFlag(record)"
        >
          {{ record.enableFlag === 1 ? '启用' : '禁用' }}
        </a-tag>
</template>
        <template v-if="column.dataIndex === 'action'">
          <div class="smart-table-operate">
            <a-button @click="showForm(record)" type="link">编辑</a-button>
            <a-button @click="onDelete(record)" danger type="link">删除</a-button>
          </div>
        </template>
      </template>
    </a-table>

Ant Design Vue 提供的表格组件。

<a-table>这是 Ant Design Vue 提供的表格组件。

需要引入所需的组件

import { message, Modal } from 'ant-design-vue';

以下是这个模块用到的详细表格组件解析

  • size="small":设置表格的大小为小号。

  • :dataSource="tableData":绑定数据源,tableData 是包含表格数据的数组。

  • :columns="columns":绑定列配置,columns 是一个描述表格列的数组。

  • rowKey="id":指定每一行的键值,这里使用 id 作为行的唯一标识。

  • bordered:显示表格边框。

tableLoading

  • :loading="tableLoading":控制表格的加载状态,tableLoading 是一个布尔值,表示表格是否处于加载中。

    • tableLoading是一个响应式引用(ref),用于控制表格的加载状态。

    • 当其值为true时,通常会显示一个加载指示器(如旋转的图标或“加载中...”的文本),以告知用户数据正在被请求。用户体验: 通过显示加载状态,用户可以清楚地知道系统正在处理请求,而不是认为应用程序无响应或出现了错误。

    • 初始值设置为false,查询数据时将其设置为true===有需要才进行加载

    • finally中将其改回false===确保用户在数据请求完成后能够看到最终的结果,而不是一直显示加载状态

  • :pagination="false":禁用分页功能。

  • :row-selection="{ selectedRowKeys: selectedRowKeyList, "{ text, record, column }">:配置行选择功能,selectedRowKeyList 是一个数组,存储选中的行键值。

v-if

  • <template v-if="column.dataIndex === 'enableFlag'">:这是一个条件渲染模板,当列的数据索引为 enableFlag 时为真->渲染此模板。

  • <a-tag>:Ant Design Vue 的标签组件,用于显示状态信息。

  • :color="record.enableFlag === 1 ? 'success' : 'error'":根据 enableFlag 的值动态设置标签颜色,如果值为 1 则颜色为绿色(成功),否则为红色(错误)。

  • style="cursor: pointer":设置标签样式为指针样式,表示可点击。

  • <template v-if="column.dataIndex === 'action'">:另一个条件渲染模板,当列的数据索引为 action 时渲染此模板。

  • <a-button @click="showForm(record)" type="link">编辑</a-button>:Ant Design Vue 的按钮组件,点击时调用 showForm 方法并传递当前记录,按钮类型为链接。

  • <a-button @click="onDelete(record)" danger type="link">删除</a-button>:另一个按钮组件,点击时调用 onDelete 方法并传递当前记录,按钮类型为链接且带有危险样式。

功能实现

表格列设置

//html
<div class="smart-table-setting-block">
        <TableOperator v-model="columns" :tableId="null" :refresh="queryData" />
      </div>
//js
const columns = ref([
    {
      title: '图库名称',
      dataIndex: 'name',
      ellipsis: true,
    },
    {
      title: '描述',
      dataIndex: 'description',
      ellipsis: true,
    }, 
//......
  ]);
//......
//查询数据
  async function queryData() {
    tableLoading.value = true;
    try {
      let queryResult = await picLibraryApi.queryPage(queryForm);//通过表单获取数据
      tableData.value = queryResult.data.list;
      total.value = queryResult.data.total;
    } catch (e) {
      smartSentry.captureError(e);
    } finally {
      tableLoading.value = false;
    }
  }
  • v-model="columns": 这是 Vue 的双向绑定语法,表示将父组件中的 columns 数据与 TableOperator 组件进行双向绑定。当 columns 数据发生变化时,TableOperator 组件会自动更新,反之亦然。

  • :tableId="null": 这里使用了 Vue 的单向绑定语法,将 null 作为 tableId 属性的值传递给 TableOperator 组件。这可能用于标识当前操作的表格 ID,但在这里传递的是 null,意味着没有特定的表格 ID。

  • :refresh="queryData": 同样使用单向绑定语法,将父组件中的 queryData 方法作为 refresh 属性的值传递给 TableOperator 组件。这通常用于触发表格数据的刷新操作。

form部分

搜索框

  • onSearch 函数会在用户点击搜索按钮时被调用。通过queryForm.pageNum = 1; 将 pageNum 设置为 1,确保每次搜索时都从第一页开始加载数据。户在进行新查询时不会继续查看之前的结果页。

  • 通过API连接接口,渲染该数据,value值

  • onMounted(queryData); 的作用是确保在组件挂载后自动调用 queryData 函数,以便在页面加载时初始化数据。

重置

Object.assign(queryForm, queryFormState); 这句代码的作用是将 queryFormState 对象的属性复制到 queryForm 对象中。实现重置查询表单的状态,以确保用户在进行新查询时能够从初始条件开始。去掉这句代码可能导致查询条件无法重置,从而影响用户体验和查询结果的准确性。

状态

async function toggleEnableFlag(record) {
  try {
    SmartLoading.show();
    const updateData = {
      id: record.id,
      name: record.name,          
      enableFlag: record.enableFlag ===  IS_ENABLEFLAG_ENUM.SHOW.value ?  IS_ENABLEFLAG_ENUM.UN_SHOW.value :  IS_ENABLEFLAG_ENUM.SHOW.value  // 切换状态
    };
    await picLibraryApi.update(updateData);
    message.success('状态更新成功');
    // 更新本地数据
    record.enableFlag = record.enableFlag ===  IS_ENABLEFLAG_ENUM.SHOW.value ?   IS_ENABLEFLAG_ENUM.UN_SHOW.value :  IS_ENABLEFLAG_ENUM.SHOW.value ;
  } catch (e) {
    console.error('错误详情:', e);
    message.error('状态更新失败');
    smartSentry.captureError(e);
  } finally {
    SmartLoading.hide();
  }
}

必须更新本地数据,不然就只是样式的改变

前端

数据要通过后台管理,直接渲染

带参跳转

先申请到接口,然后在链接上带上参数,通过?来实现->href="${data.link}?id=${data.id}"

// 获取单页数据
async function fetchSinglePageData() {
  const response = await axios.post(
    'http://150.109.23.156:8803/singlePage/queryPage',
    {
      pageNum: 1,
      pageSize: 10,
    },
    {
      headers: {
        'Content-Type': 'application/json',
      },
    }
  );
  
  return response.data.data.list.map((item) => ({
    id: item.id,
    title: item.title,
    link: item.link,
    contentHtml: item.contentHtml,
    isVisible: item.isVisible,
  }));
}

// 渲染页面
function renderPage(SinglePageData) {
  const navList = document.querySelector('.nav-list');

  if (SinglePageData.length > 0 ) {  
    SinglePageData.forEach((data) => {
      if(data.isVisible===1){
      const li = document.createElement('li');
      li.innerHTML = `
        <a  href="${data.link}?id=${data.id}"> ${data.title} </a>`;
      navList.appendChild(li);
      }
    });
  }
}

当后台的状态为不显示时,在前端的网页上不渲染

实现办法:渲染g前加个判断->if(data.isVisible===1)

带参跳转后数据渲染

产品详情页->(条件:产品管理页已经实现路由带参跳转)

  1. 定义所有需要请求的API端点(套用路由模版)

    1. product: `http://150.109.23.156:8803/product/query/product/${param}`,

2.进行js渲染

// 产品数据处理
    const productData = await fetchData(endpoints.product);
    if (productData) {
      const { title, imgUrl, description, contentHtml } = productData;
      const url = imgUrl[0].fileUrl;

      const updates = {
        '.bigbox': `
                  <div class="leftbox">
                      <img src="${url}" alt="">
                  </div>
                  <div class="rightbox">
                      <h3>${title}</h3>
                      <p>${description}</p>
                  </div>`,
        '.pc_box': `<img src="${url}" alt="">`,
      };

单页查询

直接contentHTML渲染

try {
    // 定义所有需要请求的API端点
    const endpoints = {
      singlePage: `http://150.109.23.156:8803/singlePage/pageInfo/${param}`,
      product: `http://150.109.23.156:8803/product/query/product/${param}`,
      news: `http://150.109.23.156:8803/article/queryArticleInfo/${param}`,
    };
 // 如果有contentHtml,添加到更新列表
      if (contentHtml) {
        updates['.tablebox'] = contentHtml;
      }
      // 批量更新DOM
      Object.entries(updates).forEach(([selector, content]) => {
        updateDOM(selector, content);
      });
    }解析
  • Object.entries(updates).forEach(([selector, content]) => {

    • 遍历 updates 对象的每一个键值对。Object.entries(updates) 返回一个数组,每个元素是一个 [key, value] 形式的数组。

    • 使用解构赋值将每个键值对分别赋值给 selectorcontent

  • 这段代码的主要作用是:

    • 定义一组 API 端点。

    • 如果存在 contentHtml,将其添加到 updates 对象中。

    • 遍历 updates 对象,并调用 updateDOM 函数来更新相应的 DOM 元素。

只申请后台的最新n条数据

门户网站的新闻中心只申请后台的最新3条数据

实现方法:申请时,定义的参数只写想要的数量

try {
          const newobjest = await axios.post(
            'http://150.109.23.156:8803/article/queryPage',
            {
              pageNum: 1,
              pageSize: 3,
            },
            {
              headers: {
                'Content-Type': 'application/json',
              },
            }
          );


考核3
http://localhost:8090//archives/kao-he-3
作者
文伊仪
发布于
2024年12月09日
许可协议