资讯专栏INFORMATION COLUMN

基于 oracle 的 flask 项目(四)——搜索查询

MyFaith / 2615人阅读

摘要:项目描述管理员用户可以搜索本部门下所有用户的各个月份的相关信息。不同的权限搜索页面是不同的。结果展示第一个页面第二个页面这两个动图展示的是管理员权限的用户的搜索查询界面。

搜索功能是一个项目个性化需求最强烈的部分,用户想要不同的报表,可以通过搜索不同的字段来实现。
项目描述

管理员用户可以搜索本部门下所有用户的各个月份的相关信息。

一般用户只能搜索各个月份自己的相关信息。

实现搜索页面

创建forms 类,使用 flask-wtf 。

创建搜索页面的 html 模板。

不同的权限搜索页面是不同的。

此处使用flask的基本功能,不再赘述,详情请参见代码。

在试图函数中实现相关搜索功能

views.py 中的内容如下:

@show.route("/01", methods = ["GET", "POST"])
@login_required
def _01():
    search_form = SearchForm(prefix="search")
    ...
    if current_user.role == "admin":
    ...
    ...
        if search_form.validate_on_submit():
            database = db.session.query(OusiStaff.department, OusiStaff.name.label("staff_name"), OusiStaff.phone,
                                        OusiStaff.role,
                                        g1.name.label("guest_name"), g1.month, g1.balance,
                                        func.nvl(db.session.query(g2.balance).filter(
                                            g1.name==g2.name,
                                            func.to_date(g2.month, "yyyy-mm")==func.add_months(
                                                func.to_date(g1.month, "yyyy-mm"), -1)
                                        ), 0).label("last_balance")
                                        ).filter(
                OusiStaff.phone == g1.staff_phone, current_user.department==OusiStaff.department,
                and_(g1.month.between(search_form.start_time.data.strip(), search_form.end_time.data.strip()),
                     OusiStaff.name.like("%{}%".format(search_form.name.data.strip())), OusiStaff.phone.like("%{}%".format(search_form.phone.data.strip())))
            ).order_by(g1.name).group_by(OusiStaff.department, OusiStaff.name.label("staff_name"), OusiStaff.phone,
                                         OusiStaff.role,
                                         g1.name.label("guest_name"), g1.month, g1.balance)
    
    ...
    else:
        ...
        ...
        if search_form.validate_on_submit():
            database = db.session.query(OusiStaff.department, OusiStaff.name.label("staff_name"), OusiStaff.phone,
                                        OusiStaff.role,
                                        g1.name.label("guest_name"), g1.month, g1.balance,
                                        func.nvl(db.session.query(g2.balance).filter(
                                            g1.name == g2.name,
                                            func.to_date(g2.month, "yyyy-mm") == func.add_months(
                                                func.to_date(g1.month, "yyyy-mm"), -1)
                                        ), 0).label("last_balance")
                                        ).filter(
                OusiStaff.phone == g1.staff_phone, current_user.phone == OusiStaff.phone,
                g1.month.between(search_form.start_time.data.strip(), search_form.end_time.data.strip())
            ).order_by(g1.name).group_by(OusiStaff.department, OusiStaff.name.label("staff_name"), OusiStaff.phone,
                                         OusiStaff.role,
                                         g1.name.label("guest_name"), g1.month, g1.balance)
    ...
    ...
                                         
    return render_template("show/01.html", data=data, searchForm=search_form)

这是第一个页面的的搜索功能实现方法,使用了 if current_user.role == "admin" else ... 来区分权限。

@show.route("/02", methods = ["GET", "POST"])
@login_required
def _02():
    search_form = SearchForm(prefix="search")
    ...
    ...
    if current_user.role == "admin":
    ...
    ...
    if search_form.validate_on_submit():
            database = db.session.query(sbq.c.department, sbq.c.role, sbq.c.staff_name, sbq.c.staff_phone,
                                        sbq.c.month, func.count(sbq.c.guest_name).label("members"),
                                        func.sum(sbq.c.balance).label("balance"),
                                        func.sum(sbq.c.last_balance).label("last_balance")). 
                filter(and_(sbq.c.month.between(search_form.start_time.data.strip(), search_form.end_time.data.strip()),
                            sbq.c.staff_name.like("%{}%".format(search_form.name.data.strip())),
                            sbq.c.staff_phone.like("%{}%".format(search_form.phone.data.strip())))
                       ).group_by(sbq.c.department, sbq.c.role,
                                                                               sbq.c.staff_name, sbq.c.staff_phone,
                                                                               sbq.c.month)
    else:
    ...
    ...
        if search_form.validate_on_submit():
            database = db.session.query(sbq.c.department, sbq.c.role, sbq.c.staff_name, sbq.c.staff_phone,
                                        sbq.c.month, func.count(sbq.c.guest_name).label("members"),
                                        func.sum(sbq.c.balance).label("balance"),
                                        func.sum(sbq.c.last_balance).label("last_balance")). 
                filter(sbq.c.month.between(search_form.start_time.data.strip(), search_form.end_time.data.strip())).group_by(sbq.c.department, sbq.c.role,
                                                                               sbq.c.staff_name, sbq.c.staff_phone,
                                                                               sbq.c.month)
    ...
    ...
                                                                               
   return render_template("show/02.html", data=data, searchForm=search_form)

这是第二页面的实现方法。

结果展示

第一个页面

第二个页面

这两个动图展示的是管理员权限的用户的搜索查询界面。

总结: 本实现方法还是很繁琐的,大家如果对 sql 语句很熟悉的话,在区分权限的时候,应该知道 case ... when ... else ... end 这个语句,如何把这样的 sql 语句 sqlalchemy 化,还得精进自己的技能,如果你恰好会这样的技能,请通知我一声。

源码下载

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41313.html

相关文章

  • 基于 oracle flask 项目(三)——生成报表

    摘要:本文主要讲解如何生成不同需求的报表。项目描述第一个页面,以和为关联,查询出本月职工的关联客户及客户的资产余额。建立上个月的虚字段。,二是利用函数来对初始化数据进行赋值的操作。提示注意的语法。权限为的用户只显示本人的相关信息。 曾经,因为对 sqlalchemy 不熟悉,固执的抛弃之,直接引入原生的 cx_Oracle 来生成报表,但是经过一堆的上下文等错误后,我幡然悔悟,还是回到了 s...

    sixgo 评论0 收藏0
  • 基于 oracle flask 项目(一)——配置项目

    摘要:一般印象,项目适合做一些短小精悍的项目,特别是与等数据库结合很是般配。生成报表,不同的查询结果生成不同的报表。配置从下载客户端,然后解压后放入自己指定的目录。指定数据库连接池的超时时间。 一般印象,flask 项目适合做一些短小精悍的项目,特别是与 sqlite、mysql 等数据库结合很是般配。但是在一些大公司,特别是一些金融行业等国企公司,还是以 oracle 居多,那么,这个小辣...

    xialong 评论0 收藏0

发表评论

0条评论

MyFaith

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<