【3】案例:Bootstrap + jQuery及DataTables + Python Flask框架开发 - 账号管理模块(增删改查)零基础入门版

目录

一、效果展示

二、目标

三、技术选型

四、前端关键代码

1、左侧菜单导航nav样式,详细说明参考我的文章

2、使用$("selector").load(url) 实现在父页面内加载子页面

3、添加用户

1)页面布局 - 使用 Bootstrap 的 grid

2)Ajax与服务器数据对接

3)模态框 modal 提示

4、账号列表使用 DataTables 实现

1)使用ajax从服务器获取数据

2)多语言设置 oLanguage

3)对数据进行渲染,自定义列 columnDefs

5、删除用户模块

1)ajax 跟服务器对接数据

6、编辑用户

1)编辑用户页面的数据初始化

2)ajax发起http请求,修改用户数据

五、后端Flask代码

1、flask 开启http服务

2、db数据库操作

六、启动命令

附录:参考资料


一、效果展示

二、目标

实现管理系统模块 - 账号管理的增删改查功能。

三、技术选型

样式:Bootstrap

前端:jQuery + DataTables

后端:Python Flask

四、前端关键代码

1、左侧菜单导航nav样式,详细说明参考我的文章

【2】案例:Bootstrap 开发 - navs 左侧菜单,使用iframe 嵌入*.html实现动态切换页面_YYDataV的博客-CSDN博客

2、使用$("selector").load(url) 实现在父页面内加载子页面

<body>
        <!-- nav 左侧菜单栏 -->

        <!-- 主布局div -->
        <div id="main" class="container"></div>
    </main>

    <script>
        $(document).ready(function () {
            $("#main").load('/static/userList.html');
        })
    </script>
</body>

3、添加用户

1)页面布局 - 使用 Bootstrap 的 grid

<!-- 添加账号 -->
    <div id="main" class="container">
        <div class="row">
            <div class="col-2">
                <label for="account">
                    账号
                </label>
            </div>
            <div class="col-5">
                <input id="account" class="form-control" />
            </div>
        </div>
        <br>
        <div class="row">
            <div class="col-2">
                <label for="password">
                    密码
                </label>
            </div>
            <div class="col-5">
                <input id="passwd" type="password" class="form-control" />
            </div>
        </div>
        <br>
        <div class="row">
            <div class="col-2">
                <label for="alias">
                    昵称
                </label>
            </div>
            <div class="col-5">
                <input id="alias" class="form-control" />
            </div>
        </div>
        <br>
        <div class="row">
            <div class="col-2">
                <label for="role">角色</label>
            </div>
            <div class="col-5">
                <label for="roleAdmin">管理员 </label>
                <input id="roleAdmin" type="radio" class="form-check-input">

                <label for="roleUser">用户 </label>
                <input id="roleUser" type="radio" class="form-check-input">
            </div>
        </div>
        <br>
        <div class="row">
            <div class="col-2">
            </div>
            <div class="col-5">
                <button id="userAdd" class="btn btn-primary">
                    添加
                </button>
                <button id="userEdit" class="btn btn-primary">
                    编辑
                </button>
                <a href="/static/userList.html">
                    <button id="cancel" class="btn btn-primary">
                        取消
                    </button>
                </a>
            </div>
        </div>

2)Ajax与服务器数据对接

// 3.新建用户
        $("#userAdd").click(function () {
            $("#userAdd").attr("disabled", true);
            role = 0;
            if ($("#roleAdmin").prop("checked")) {
                role = 1;
            }
            if ($("#roleUser").prop("checked")) {
                role = 2;
            }
            if (0 == role) {
                // 错误提示
            }

            $.post(
                "/userAdd",
                JSON.stringify({
                    'account': $("#account").val(),
                    'passwd': $("#passwd").val(),
                    'alias': $("#alias").val(),
                    'role': role,
                    'time': Date.parse(new Date()) / 1000,
                }),

                function (rsp) {
                    data = JSON.parse(rsp)
                    $("#userAdd").attr("disabled", false);
                    // 更新提示内容
                    txt = "添加账号成功!";
                    if (data.ret) {
                        txt = "添加账号失败!";
                    }
                    $("#modal-body").text(txt);
                    //加载模态框,不要使用 $('#myModal').modal(); -- Bootstrap jquey库的版本不一致导致的不报错,不显示,shit
                    $('#myModal').modal('show');
                }
            );
        });

3)模态框 modal 提示

modal 模态框HTML定义

<!-- 删除事件的 模态框 -->
    <div class="modal" id="myModal">
        <div class="modal-dialog">
            <div class="modal-content">
                <!-- 模态框头部 -->
                <div class="modal-header">
                    <h4 class="modal-title">信息</h4>
                    <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                </div>

                <!-- 模态框内容 -->
                <div class="modal-body" id="modal-body">
                    操作结果
                </div>

                <!-- 模态框底部 -->
                <div class="modal-footer">
                    <a href="/static/userList.html"><button type="button" class="btn btn-primary"
                            data-bs-dismiss="modal">确定</button></a>
                </div>
            </div>
        </div>
    </div>

modal 模态框 触发显示

有的版本使用 $('selector').modal('') 触发模态框;

有的版本使用 $('selector').modal('show') 触发模态框。

4、账号列表使用 DataTables 实现

 DataTables :DataTables | Table plug-in for jQuery

1)使用ajax从服务器获取数据

响应的数据为json类型数组,需要在dataSrc中指定json数据中的字段,如本例中为‘data’。

DataTables HTML定义:

 <!-- 用户列表 -->
        <table id="userList" class="table table-striped table-bordered" style="width:100%">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>账号</th>
                    <th>角色</th>
                    <th>昵称</th>
                    <th>日期</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tfoot>
                <tr>
                    <th>ID</th>
                    <th>账号</th>
                    <th>角色</th>
                    <th>昵称</th>
                    <th>日期</th>
                    <th>操作</th>
                </tr>
            </tfoot>
        </table>

DataTables JS 处理: 

 $(document).ready(function () {
            // 1. 用户列表初始化
            $('#userList').DataTable({
                "ajax": {
                    "url": '/userList',
                    "type": "POST",
                    "dataSrc": 'data',
                },

                // 多语言配置
                "oLanguage": {
                    "sProcessing": "正在加载中......",
                    "sLengthMenu": "", //"每页显示_MENU_条记录"
                    "sZeroRecords": "", //"对不起,查询不到相关数据!"
                    "sEmptyTable": "无数据!",
                    "sInfo": "当前显示_START_到_END_条,共_TOTAL_条记录",
                    "sInfoFiltered": "数据表中共为 _MAX_ 条记录",
                    "sSearch": "搜索 ",
                    "oPaginate": {
                        "sFirst": "首页",
                        "sPrevious": "上一页",
                        "sNext": "下一页",
                        "sLast": "末页"
                    },
                    // 数据加载中,显示的内容
                    "sLoadingRecords": "加载中... ",
                    "sInfoEmpty": "当前显示 0 到 0, 共 0 条记录",

                },
                // 自定义列
                "columnDefs": [
                    {
                        // 角色 targets 下标从0开始
                        "targets": 2,
                        "data": function (row, type, val, meta) {
                            if (1 == row[2]) {
                                return "管理员";
                            }
                            else if (2 == row[2]) {
                                return "用户";
                            }
                            return "未知";
                        }
                    },
                    {
                        // 时间
                        "targets": 4,
                        "data": function (row, type, val, meta) {
                            return formatTimeStamp(row[4]);
                        }
                    },
                    {
                        // 操作 id
                        "targets": 5,
                        orderable: false,
                        "data": function (row, type, val, meta) {
                            // 调用url
                            urlEdit = '/static/userOpt.html?id=' + row[0];
                            // 调用函数
                            urlDel = 'userDel(' + row[0] + ')';
                            buttonUserEdit = '<a href="' + urlEdit + '"><button type="button" class="btn btn-primary">编辑</button></a> '
                            buttonUserDel = '<a href="" onclick="' + urlDel + '"><button type="button" class="btn btn-primary">删除</button></a> '

                            return buttonUserEdit + buttonUserDel
                        },
                        // "defaultContent": "<button id='userEdit' class='btn btn-primary' type='button'>编辑</button> <button id='userDel' class='btn btn-primary' type='button' >删除</button>"
                    }
                ],

            });
        }
    });

2)多语言设置 oLanguage

默认为英文,使用oLanguage中的配置项将其定义为中文。

3)对数据进行渲染,自定义列 columnDefs

targets 表示对应列下标(从0开始),data 进行数据渲染函数。

本例中,需要配置【编辑】【删除】按钮,并将用户ID与其对应。

通过超链接<a> href 实现编辑,跳转到编辑页面;

通过超链接<a> onclick实现删除,删除结果直接以模态框方式弹出。

5、删除用户模块

1)ajax 跟服务器对接数据

// 2. 删除账号
    function userDel(id) {

        $.post(
            "/userDel",
            JSON.stringify({
                'id': id
            }),
            function (rsp) {
                result = JSON.parse(rsp)
                txt = "删除账号失败!";
                // 更新提示内容
                if (0 == result.ret) {
                    txt = "删除账号成功!";
                }
                $("#modal-body").text(txt);
                $('#myModal').modal('show');
            },
        )
    };

6、编辑用户

1)编辑用户页面的数据初始化

通过全局变量gUserId,从用户列表页面将账号ID传递到编辑页面。

通过href传递id:

 "data": function (row, type, val, meta) {
    // 调用url
    urlEdit = '/static/userOpt.html?id=' + row[0];
    urlDel = 'userDel(' + row[0] + ')';
    // 调用函数                  
    buttonUserEdit = '<a href="' + urlEdit + '"><button type="button" class="btn btn-primary">编辑</button></a> '
    buttonUserDel = '<a href="" onclick="' + urlDel + '"><button type="button" class="btn btn-primary">删除</button></a> '

     return buttonUserEdit + buttonUserDel
 },

通过getQueryString获取id,并赋值为gUserId :

   // 监听事件:on 
    $('#userList').on('draw.dt', function () {
        $("a").click(function (e) {
            // 编辑用户,通过全局变量传递 gUserId
            url = $(this).attr("href")
            gUserId = getQueryString(url, "id");
            e.preventDefault();
            $("#main").load(url);
        });
    });

 使用gUserId从服务器获取该账号的其他属性:

// 1.编辑用户 - 页面初始化赋值
        if (gUserId) {
            $.post(
                "/getUserById",
                JSON.stringify({
                    'id': gUserId
                }),
                function (rsp) {
                    result = JSON.parse(rsp)
                    // 更新提示内容
                    if (0 == result.ret) {
                        data = result.data;

                        $("#account").val(data[1]);
                        $("#passwd").val(data[2]);
                        if (data[3] == 1) {
                            $("#roleAdmin").prop("checked", true);
                        } else {
                            $("#roleUser").prop("checked", true);
                        }
                        $("#alias").val(data[4])
                    }
                }
            )
        }

2)ajax发起http请求,修改用户数据

// 2. 编辑用户
        $("#userEdit").click(function () {
            role = 0;
            if ($("#roleAdmin").prop("checked")) {
                role = 1;
            }
            if ($("#roleUser").prop("checked")) {
                role = 2;
            }
            if (0 == role) {
                // 错误提示
            }
            $.post(
                "/userEdit",
                JSON.stringify({
                    'id': gUserId,
                    'account': $("#account").val(),
                    'passwd': $("#passwd").val(),
                    'alias': $("#alias").val(),
                    'role': role
                }),

                function (rsp) {
                    data = JSON.parse(rsp)
                    // 更新提示内容
                    if (0 == data.ret) {
                        $("#modal-body").text("编辑账号成功!");
                    }
                    else {
                        $("#modal-body").text("编辑账号失败!");
                    }
                    //加载模态框,不要使用 $('#myModal').modal(); -- Bootstrap jquey库的版本不一致导致的不报错,不显示,shit
                    $('#myModal').modal('show');
                }
            );
        });

五、后端Flask代码

1、flask 开启http服务

# -*- coding: utf-8 -*-
from flask import Flask, request
import db
import json
from retCode import *

app = Flask(__name__)
app.debug = True


@app.route('/getUserById', methods=['POST'])
def getUserById():
    req = json.loads(request.get_data())
    rsp = db.getUserById(req["id"])
    result = {
        "ret": EOK,
        "data": rsp
    }
    return json.dumps(result)


@app.route('/userList', methods=['POST'])
def userList():
    rsp = db.userList()
    result = {
        "ret": EOK,
        "data": rsp
    }
    return json.dumps(result)


@app.route('/userAdd', methods=['POST'])
def userAdd():
    req = json.loads(request.get_data())
    db.userAdd(req)
    result = {
        "ret": EOK
    }
    return json.dumps(result)


@app.route('/userEdit', methods=['POST'])
def userEdit():
    req = json.loads(request.get_data())
    db.userEdit(req)
    result = {
        "ret": EOK
    }
    return json.dumps(result)


@app.route('/userDel', methods=['POST'])
def userDel():
    req = json.loads(request.get_data())
    db.userDel(req["id"])
    result = {
        "ret": EOK
    }
    return json.dumps(result)


@app.route('/login', methods=['POST'])
def login():
    data = json.loads(request.get_data())
    account = data.get("account")
    passwd = data.get("passwd")
    result = {"ret": EOK}
    return json.dumps(result)


if __name__ == '__main__':
    app.run(host='localhost', port=8080)

2、db数据库操作

# -*- coding: utf-8 -*-
# 官方文档
# https://pypi.org/project/records/

from os import name
import records

from retCode import *


# 连接数据库
db = records.Database(
    'mysql://root:[email protected]:3306/vpn')


def getUserById(id):
    data = []
    # 读取数据库
    sql = 'select * from user where  id = %s' % (id)
    try:
        rows = db.query(sql)
        r = rows.first(as_dict=True)
        data = [r["id"], r["account"], r["passwd"],
                r["role"], r["alias"]]
    except Exception as e:
        print(e)

    return data


def userList():
    data = []
    # 读取数据库
    sql = "select * from user order by id desc"
    try:
        rows = db.query(sql)
        for r in rows.all(as_dict=True):
            data.append(
                [r["id"], r["account"], r["role"], r["alias"], r["time"]])
    except Exception as e:
        print(e)

    return data


def userAdd(data):

    user = data
    sql = 'insert into user(account, passwd, role, alias, time)  values (:account, :passwd,:role,:alias,:time )'
    try:
        res = db.query(sql, **user)
        if res.pending:
            return EOK
    except Exception as e:
        print(e)

    return EUserAddError


def userEdit(data):

    user = data
    sql = 'update user set account=:account, passwd=:passwd, role=:role, alias=:alias where id=:id'
    try:
        res = db.query(sql, **user)
        if res.pending:
            return EOK
    except Exception as e:
        print(e)

    return EUserEditError


def userDel(id):

    sql = 'delete from user where id=%s' % (id)
    try:
        res = db.query(sql)
        if res.pending:
            return EOK
    except Exception as e:
        print(e)

    return EUserDelError


if __name__ == "__main__":

    data = getUserById(13)
    print(data)

六、启动命令

1、开启http服务
python main.py

2、浏览器操作
http://localhost:8080

附录:参考资料

1、Bootstrap :Bootstrap5 教程 | 菜鸟教程

2、jQuery :jQuery API Documentation   jQuery 教程 | 菜鸟教程

3、DataTables :DataTables | Table plug-in for jQuery

4、Python Flask:Welcome to Flask — Flask Documentation (2.0.x)

猜你喜欢

转载自blog.csdn.net/lildkdkdkjf/article/details/122257193
今日推荐