使用 Vue 3 + Element Plus 从头开始写一个数据库网站-06-前端与后端的交互
由于 PrismJS 尚不支持 Vue 的语法高亮,因此 Vue 代码块均先使用 HTML 的高亮
2024-09-23
在上一步中,我们已经设计并实现了基础的 API 功能。
现在我们在前端使用 Vue 发送请求并展示数据,分为以下几个步骤:
- 安装 Axios 用于发送 HTTP 请求
- 发送请求获取数据
- 展示 Biomarker 列表
- 根据条件筛选 Biomarker
- 点击 Biomarker 显示详细信息
我们仍然通过 Vue 3 的组合式 API 写法来实现这些功能。
安装 Axios
`Axios` 是一个非常流行的 HTTP 客户端库,可以用来在 Vue 组件中发送 API 请求。
- **安装 Axios**:
在项目根目录下运行以下命令:
- **在组件中引入 Axios**:
之后你就可以在 Vue 组件中使用 Axios 发送请求。
封装与后端 API 的交互逻辑
在根目录的 `src` 文件夹下创建 `services/api.js`,并写入:
详细解释
- **`axios.create()`**:
- 使用 `axios.create()` 方法创建了一个自定义的 `axios` 实例,所有请求都会以 `http://localhost:3000/api` 作为基础 URL。
- 这样做的好处是,如果后端地址或端点路径改变,你只需要在一个地方更新 `baseURL`,不必逐个修改每个请求的完整 URL。
- **`getBiomarkers()`**:
- 发送 `GET` 请求到 `/biomarkers`,用于获取所有的 biomarker 数据。
- 请求的完整 URL 是 `http://localhost:3000/api/biomarkers`。
- **`getFilters()`**:
- 发送 `GET` 请求到 `/biomarkers/filters`,用于获取筛选选项。
- 请求的完整 URL 是 `http://localhost:3000/api/biomarkers/filters`。
- **`getBiomarkerDetails(id)`**:
- 发送 `GET` 请求到 `/biomarkers/:id`,用于获取特定 ID 的 biomarker 详细信息。
- 请求的完整 URL 是 `http://localhost:3000/api/biomarkers/{id}`,其中 `{id}` 是动态传递的。
- **`createBiomarker(biomarker)`**:
- 发送 `POST` 请求到 `/biomarkers`,用于在后端创建一个新的 biomarker。`biomarker` 是传递的请求体数据。
- 请求的完整 URL 是 `http://localhost:3000/api/biomarkers`。
作用
- 该文件简化了组件中 API 请求的调用。在 Vue 组件中,可以直接通过 `getBiomarkers()` 或 `getFilters()` 来获取数据,而不需要在每个组件中重复书写 `axios.get()` 请求逻辑。
- 通过将所有 API 调用放在一个 `api.js` 文件中,您可以更轻松地管理 API 的端点、逻辑和错误处理。
组件中的使用
在 Vue 组件中,我们引入这些封装好的 API 方法来调用后端
Biomarker 列表页面
`BiomarkerList.vue` 用于展示 Biomarker 列表,在挂载时通过 Axios 发送请求获取数据。
首先实现一个基本页面结构,后续逐步添加功能
我们计划构建一个包含以下部分的页面:
- **侧边栏**:用于筛选条件的展示。
- **主内容区**:用于显示 Biomarker 的数据表格。
我们使用 `Container 布局容器`来进行整体布局,`Table 表格`用于展示数据,`Form 表单`来实现筛选表单
先写一个基本结构:
我们使用了 **Element Plus** 的布局组件 `<el-container>` 来分割页面,左侧是固定宽度为 300px 的 `<el-aside>` 侧边栏,用于展示一个简单的筛选菜单,右侧是 `<el-main>` 主内容区域,包含一个通过 `<el-table>` 定义的数据表格,用于展示 Biomarker 的数据。样式上,侧边栏背景为浅灰色,整体布局有适当的内边距。
下一步,我们在这个页面上添加数据和功能:
- 动态加载 Biomarker 数据到表格中;
- 在侧边栏中添加筛选条件;
- 实现分页、筛选和表格排序功能。
加载 Biomarker 数据
由于我们的数据比较少,我们希望在页面初次加载时直接加载全部 Biomarker 数据,然后在前端进行分页
更新模板
添加筛选条件
实现筛选逻辑
在侧边栏中添加筛选表单:
完成后,此页面已经能够动态加载数据、筛选、分页,并显示 Biomarker 信息。
整体功能
这部分主要实现了一个带有侧边过滤功能和主表格显示功能的页面布局
- 总体布局,使用了 Element Plus 的布局容器 `el-container`:
- `el-aside`:左侧的过滤菜单区域,宽度为 300px。
- `el-main`:右侧的主内容区域,用于显示数据表格和分页。
- 侧边过滤区域,包含一个标题菜单和一个过滤表单。
- 过滤菜单:使用 `el-menu` 提供一个可点击的“Filter”标题。
- **过滤表单**:
- 使用 `el-form` 表单结构。
- 包括 3 个 `el-form-item` 表单项:
- **Category**(分类)
- **Source**(来源)
- **Application**(应用)
- 每个表单项内使用了 `el-select` 下拉框,选项由 `filterOptions` 数据动态生成。
- 提供了一个“Apply Filters”按钮,绑定了 `applyFilters` 方法。
- 主体内容区域
- 数据表格使用了 `el-table`:
- 数据源绑定到 `paginatedBiomarkers`,表格支持分页。
- 各列使用 `el-table-column` 定义,包括 ID、Biomarker(生物标记物)、Category、Application 和 PMID。
- 表格支持按列排序(通过 `sortable="true"`)。
- 表格显示时支持加载动画(通过 `v-loading="loading"`)。
- 分页功能使用了 `el-pagination` 实现分页控制,支持:
- 当前页数切换(绑定 `handlePageChange` 方法)。
- 每页条数修改(绑定 `handleSizeChange` 方法)。
- 可选择的分页大小 `[20, 50, 100, 150, 200]`。
- 动态显示总条目数,绑定到 `filteredBiomarkers.length`。
- 绑定的数据和方法
- `filters`:用于存储表单中用户选择的过滤条件(包括 Category、Source 和 Application)。
- `filterOptions`:包含表单下拉框的选项数据。
- `paginatedBiomarkers`:表格当前页显示的数据。
- `filteredBiomarkers`:经过过滤后的完整数据集,用于分页计算总条数。
- **方法**:
- `applyFilters`:点击“Apply Filters”按钮后,执行过滤逻辑。
- `handlePageChange`:处理分页页码切换。
- `handleSizeChange`:处理每页显示条数变化。
Biomarker 详情页面
`BiomarkerDetail.vue` 用于展示 Biomarker 详情,包括基本信息、来源文献、统计信息、外链等信息。
我们计划构建一个包含以下部分的页面:
- **侧边栏**:用于导航。
- **右侧标题栏**:用于显示 Biomarker 的名字
- **主内容区**:用于显示 Biomarker 的详细信息。
我们使用 element-plus 的 `Anchor 锚点`组件和 `Descriptions 描述列表`组件来完成这个页面,整体布局同样使用 `Container 布局容器`。
数据获取与展示逻辑
整体功能
这段代码实现了一个带锚点导航的生物标记物详情页面,通过左侧锚点导航快速跳转到不同信息段落,同时在右侧主内容区展示生物标记物的详细信息。
- **页面布局**:使用了 Element Plus 的布局容器 `el-container` :
- **左侧锚点导航**:
- 位于 `el-aside`,宽度 300px,包含 `el-anchor`。
- **右侧内容区域**:
- 使用 `el-container`,展示生物标记物的详细信息。
- **锚点导航**
- 使用 `el-anchor` 定义锚点导航,提供跳转到页面中各信息段落的锚点链接(如 Basic Information、Article Information、Experimental and Sample Statistics)
- **详细信息展示**:通过多个 `el-descriptions` 组件分段展示生物标记物详情:
- **基础信息(Basic Information)**:展示基本的生物标记物信息,如 ID、名称、分类、应用等。
- **文章信息(Article Information)**:展示与生物标记物相关的文章数据,如 PMID、期刊名、通讯作者等。
- **实验与样本统计信息(Experimental and Sample Statistics)**:展示实验细节,如实验方法、样本来源、种族、年龄、性别等。
- 每段表格:
- 使用 `:column="1"` 强制单列布局。
- 支持显示表头和数据,缺失字段自动显示为 `"N/A"`。
- **加载状态与错误提示**
- 页面加载时显示“Loading...”状态,通过 `isLoading` 控制。
- 如果数据获取失败,通过 `error` 显示错误信息。
- **数据动态加载**
- 页面加载时,根据路由参数 `id` 通过 API 获取生物标记物详细数据。
- 数据绑定到 `biomarker`,通过字段配置化动态渲染不同表格内容。
- 缺省值处理:当某字段值为 0 时显示 0,其他空值显示为 `"N/A"`。
- **数据绑定和方法**:
- `biomarker`:存储当前生物标记物的详细数据。
- `isLoading` 和 `error`:分别用于控制加载状态和错误信息显示。
- `basicInfoFields`、`articleInfoFields`、`experimentFields`:通过字段配置表定义各表格展示的字段和对应的键值。
- 页面加载时自动调用 `onMounted` 钩子,发送请求获取数据。
- 锚点跳转功能依赖 `el-anchor` 的内置功能。
路由设置
为了在点击 biomarker 时跳转到详细信息页面,我们需要在 Vue Router 中配置路由。确保在 `router/index.js` 中定义相应的路由:
预览
现在我们启动开发环境,预览页面:
在根目录 `ADDB/` 下启动前端项目
在 `ADDB/backend/` 下启动后端项目
Loading...



