layui-vue + Flask 实现 Table 排序显示

layui-vue + Flask 实现 Table 排序显示

在编写使用 Vue + layui 的中后台系统时,table页面通常是必不可少的。要在 Vue 中实现基于某一列的排序,我们需要更新 columns 数组中相应列的定义,以便包含排序的逻辑。

举例:在代码中,我希望基于 "类型" 这一列进行排序。则可以通过添加一个 sortable: true 属性来实现这一点。

javascript 复制代码
const columns = [
  // ... 其他列的定义
  {
    title: '类型',
    width: '180px',
    customSlot: 'type',
    key: 'type',
    sortable: true // 添加此属性以启用排序
  },
  // ... 其他列的定义
]

此外,还需要在 lay-table 组件中处理排序事件。为此,可以修改 change 方法以包含对排序参数的响应。

javascript 复制代码
const change = ({ current, limit, sort }: any) => {
  if (sort) {
    // 如果存在排序信息,则按照排序信息获取数据
    // sort.field 是排序字段,sort.order 是排序顺序('asc' 或 'desc')
    queryDataWithSort(sort.field, sort.order);
  } else {
    // 正常的分页逻辑
    layer.msg('current:' + current + ' limit:' + limit)
  }
}

const queryDataWithSort = (field, order) => {
  // 实现您的排序逻辑,例如调用 API 获取排序后的数据
  // 模拟的 API 调用示例
  queryAllDataSortedBy(field, order).then(res => {
    dataSource.value = res.data;
  }).catch(err => console.log(err));
}

API 实现

要实现一个 queryAllDataSortedBy API,我们需要在后端设置一个能够接收排序参数并根据这些参数返回排序后数据的接口。以下是一个基本的实现步骤指南,分为前端和后端部分。

前端实现

Vue 前端,我们需要创建一个函数,它会向后端发送一个包含排序参数的请求。这个函数将接收排序字段(field )和排序顺序(order ),然后使用这些参数构造一个请求。假设使用 Axios 进行 HTTP 请求,如下所示:

javascript 复制代码
import axios from 'axios';

const queryAllDataSortedBy = async (field, order) => {
  try {
    const response = await axios.get('/api/data', {
      params: {
        sortField: field,
        sortOrder: order
      }
    });
    return response.data;
  } catch (error) {
    console.error('Error fetching sorted data:', error);
    throw error;
  }
};

后端实现

使用 FlaskSQLite,我们可以创建一个简单的后端服务来处理带有排序参数的请求,并根据这些参数返回排序后的数据。以下是一个实现的示例:

python 复制代码
from flask import Flask, request, jsonify
import sqlite3

app = Flask(__name__)

def get_sorted_data(sort_field, sort_order):
    # 连接到 SQLite 数据库
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()

    # 安全地构建查询,避免 SQL 注入风险
    # 由于 SQLite 的参数化查询不支持列名和排序方向,这里需要进行一些验证
    valid_sort_fields = ['column1', 'column2', 'column3']  # 替换为您的列名
    valid_sort_orders = ['ASC', 'DESC']

    if sort_field not in valid_sort_fields:
        sort_field = 'column1'  # 默认排序字段
    if sort_order.upper() not in valid_sort_orders:
        sort_order = 'ASC'  # 默认排序方向

    # 执行查询
    query = f"SELECT * FROM your_table ORDER BY {sort_field} {sort_order}"
    cursor.execute(query)
    results = cursor.fetchall()

    cursor.close()
    conn.close()
    return results

@app.route('/api/data', methods=['GET'])
def data():
    sort_field = request.args.get('sortField', default='column1', type=str)
    sort_order = request.args.get('sortOrder', default='ASC', type=str)
    
    sorted_data = get_sorted_data(sort_field, sort_order)
    return jsonify(sorted_data)

if __name__ == '__main__':
    app.run(debug=True)
相关推荐
莫尔道嘎老范2 小时前
vue+vite前端项目ci过程中遇到的问题
前端·vue.js·ci/cd
谈谈叭2 小时前
Vue3中实现插槽使用
前端·vue.js·前端框架·npm
GoFly开发者4 小时前
GoFly框架使用vue flow流程图组件说明
前端·vue.js·流程图·vue flow流程图
幸运小圣5 小时前
Vue3 -- 环境变量的配置【项目集成3】
前端·vue.js
计算机学姐8 小时前
基于Python爬虫大屏可视化的个性化小说书籍推荐系统
开发语言·vue.js·后端·爬虫·python·mysql·django
customer088 小时前
【开源免费】基于SpringBoot+Vue.JS卫生健康系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·kafka·开源
竹秋…8 小时前
vue3+element-plus==> el-form输入响应式失效踩坑!!!!!!!!!!
javascript·vue.js·elementui
风之舞_yjf9 小时前
Vue基础(1)_模板语法、数据绑定
前端·vue.js
Fly_hao.belief10 小时前
vue内置指令和自定义指令
前端·javascript·vue.js
OEC小胖胖12 小时前
Vue 3 插槽详解
前端·javascript·vue.js·web