前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Flask与Vue分页功能实现

Flask与Vue分页功能实现

原创
作者头像
晓松
发布2024-12-26 16:22:19
发布2024-12-26 16:22:19
8300
代码可运行
举报
运行总次数:0
代码可运行

在本篇文章中,我们将实现一个简单的分页功能,后端使用 Flask 提供数据,前端使用 Vue.js 显示数据,并且通过 Element UI 进行分页组件的交互。具体实现包括 Flask 视图函数的分页逻辑、Vue 前端分页组件的实现和前后端数据交互。

1. 后端:Flask分页实现

首先,确保你的 Flask 环境已经设置好,并安装了相关依赖:

代码语言:bash
复制
pip install flask flask-sqlalchemy
视图函数 operation_log_view

Flask 中使用 paginate 方法来实现分页查询。我们将在视图函数中处理分页的逻辑,接受来自前端的分页参数,然后返回分页数据。

代码语言:python
代码运行次数:0
复制
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///logs.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class OperationLog(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, nullable=False)
    operation_time = db.Column(db.DateTime, nullable=False)
    operation_type = db.Column(db.String(50), nullable=False)

@app.route('/operation_log_view', methods=['POST'])
def operation_log_view():
    """操作日志分页接口"""
    page_number = request.json.get('page_number')
    page_count = request.json.get('page_count')

    if not all([page_number, page_count]):
        return jsonify({'status': 'error', 'data': '参数不能为空'})

    page_number = int(page_number)
    page_size = int(page_count)

    # 查询操作日志并进行分页
    operation_logs_pagination = (
        OperationLog.query.order_by(OperationLog.operation_time.desc())
        .paginate(page_number, page_size, False)
    )
    # 获取分页数据
    operation_logs = operation_logs_pagination.items
    # 获取分页信息
    total_pages = operation_logs_pagination.pages
    # 获取当前页码
    current_page = operation_logs_pagination.page

    # 返回操作日志列表
    message = [
        {
            'operation_time': log.operation_time,
            'operation_type': log.operation_type,
        } for log in operation_logs
    ]

    return jsonify({'status': 'ok', 'data': message, 'total_pages': total_pages, 'current_page': current_page})

if __name__ == '__main__':
    app.run(debug=True)

2. 前端:Vue + Element UI分页实现

在前端,我们使用 Vue.js 和 Element UI 来创建分页组件,并与后端进行交互,获取分页数据。

首先,确保你的项目中已经安装了 Vue 和 Element UI。如果没有安装,可以通过以下命令安装:

代码语言:bash
复制
npm install element-ui axios
Vue 组件代码

Vue 组件中,handleCurrentChange 方法会在用户切换页码时触发,发送请求给后端,获取对应的分页数据。

代码语言:html
复制
<template>
  <div>
    <!-- 操作日志表格 -->
    <el-table :data="operationRecord">
      <el-table-column prop="operation_time" label="操作时间" width="180">
      </el-table-column>
      <el-table-column prop="operation_type" label="操作类型" width="120">
      </el-table-column>
      <!-- 你可以根据需要继续添加其他列 -->
    </el-table>

    <!-- 分页组件 -->
    <div class="pagination">
      <el-pagination
        layout="prev, pager, next"
        :current-page="currentPage"
        :page-count="totalPages"
        :page-size="pageCount"
        @current-change="handleCurrentChange"
      >
      </el-pagination>
    </div>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {    
    return {
      operationRecord: [],  // 存储操作日志数据
      currentPage: 1,  // 当前页码
      pageCount: 15,   // 每页显示的记录数
      totalPages: 1,   // 总页数
    };
  },
  methods: {
    // 页码变化时触发,重新请求数据
    handleCurrentChange(currentPage) {
      this.currentPage = currentPage;
      this.getOperationRecord();
    },

    // 获取操作日志数据
    getOperationRecord() {
      const params = {
        page_number: this.currentPage,
        page_count: this.pageCount,
      };

      axios.post('/operation_log_view', params)
        .then((response) => {
          const { data } = response;
          if (data.status === 'ok') {
            this.operationRecord = data.data;  // 更新操作记录数据
            this.totalPages = data.total_pages;  // 更新总页数
          }
        })
        .catch((error) => {
          console.error('获取数据失败', error);
        });
    },
  },
  created() {
    // 组件创建时自动请求第一页数据
    this.getOperationRecord();
  },
};
</script>

<style scoped>
.pagination {
  margin-top: 20px;
  text-align: center;
}
</style>

3. 路由配置

在 Flask 中,我们通过路由将视图函数与 URL 绑定。operation_log_view 视图函数已经通过 @app.route('/operation_log_view', methods=['POST']) 绑定到了 /operation_log_view 路径。前端通过 axios.post 向该路径发送请求。

4. 运行项目

  1. 运行 Flask 后端服务:
代码语言:bash
复制
python app.py
  1. 启动 Vue 项目:
代码语言:bash
复制
npm run serve
  1. 访问 Vue 项目并进行分页操作,你应该能够看到分页组件,并能够正确显示操作日志数据。

5. 总结

  • 后端使用 Flask 和 SQLAlchemy 实现分页,通过 paginate 方法查询数据并返回。
  • 前端使用 Vue.js 和 Element UI 实现分页组件,配合 axios 发送请求和接收分页数据。
  • 当用户切换页码时,Vue 会自动触发请求,更新数据并显示分页。

通过这种方式,我们实现了一个简单的分页功能,能够高效地从后端获取数据并在前端进行分页显示。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 后端:Flask分页实现
    • 视图函数 operation_log_view
  • 2. 前端:Vue + Element UI分页实现
    • Vue 组件代码
  • 3. 路由配置
  • 4. 运行项目
  • 5. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档