[day27] PostBack资料data处理 显示菜单

对PostBack Event中的字串进行处理,由於这个参数仅能放入字串,所以可以套用网页Query的方式进行参数传递

实作PostBack Action参数传递

先替之前的Rich Menu加上功能,将上方选单的三个按钮,改成PostBackAction,data="action=ShowProductList?pcid={餐点类别ID}}"

def init_default_rich_menu(line_bot_api:LineBotApi, yes=False):
    if(not yes):yes = askyes()
    if(not yes):return False
    areas = [RichMenuArea(
                bounds=RichMenuBounds(x=0, y=0, width=512, height=512),
                action=PostbackAction(
                    label="显示购物车内容",
                    data="action=ShowProductList?pcid=16",
                    display_text="查询早餐"
                )
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=512, y=0, width=512, height=512),
                action=PostbackAction(
                    label="显示购物车内容",
                    data="action=ShowProductList?pcid=17",
                    display_text="查询午餐"
                )
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=1024, y=0, width=512, height=512),
                action=PostbackAction(
                    label="显示购物车内容",
                    data="action=ShowProductList?pcid=10",
                    display_text="查询饮料"
                )
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=0, y=512, width=512, height=512),
                action=MessageAction(label="按下问号按钮", text="显示操作说明")
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=512, y=512, width=512, height=512),
                action=PostbackAction(
                    label="显示购物车内容",
                    data="action=ShowShoppingCartContents",
                    display_text="我的购物车内有什麽"
                )
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=1024, y=512, width=512, height=512),
                action=PostbackAction(
                    label="查询订单",
                    data="action=ShowOrderStatus",
                    display_text="查询订单"
                )            
            )
        ]
    richmenuid = linecc.Create_Rich_Menu(line_bot_api, 1536, 1024, "default_Rich_Menu", "主选单", areas)
    print(f"rich_menu_id :{richmenuid}")
    if(richmenuid):return True
    else:return False

修改Server.py,以urllib.parse将data拆解为path与Value,如:

data:action=ShowProductList?pcid=16
data.path = action=ShowProductList, datavalue = {'pcid': ['16']}

记得加上找不到产品类别的意外处理

@handler.add(PostbackEvent)
def handler_postback(event):
    prof = line_bot_api.get_profile(event.source.user_id)
    data = event.postback.data
    # app.logger.debug(f"data:{data}")
    if(data == 'action=ShowShoppingCartContents'):
        cart_info, cart_amount = dbpm.QUY_Shopping_Cart_info_by_uid(event.source.user_id)
        app.logger.debug(f"{prof.display_name} 查询购物车, uid:{event.source.user_id}, {cart_info}")
        replay_text = '\n'.join(str(v) for v in cart_info) + f"\n总共:{cart_amount}元"
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=replay_text)
        )
    else:
        from urllib.parse import urlparse, parse_qs
        datapath = urlparse(data).path
        datavalue = parse_qs(urlparse(data).query)
        if(datapath == "action=ShowProductList"):
            pcid = datavalue.get('pcid')[0] or None
            if(not pcid):
                app.logger.error(f"错误:找不到pcid:{pcid}")
                line_bot_api.reply_message(
                    event.reply_token,
                    TextSendMessage(text=f"发生错误,请联络客服取得协助, 错误讯息:找不到pcid:{pcid}")
                )
            else:
                replay_text = Handler.ShowProductListHandler(pcid) or "错误:action=ShowProductList Return None"
                line_bot_api.reply_message(
                    event.reply_token,
                    TextSendMessage(text=replay_text)
                )

从资料库中拉出product_name, product_decp, quantity, price, pid等栏位,并转成List

    def QUY_Products_info_by_pcid(self, pcid):
        cur = self.conn.cursor()
        query = sql.SQL("SELECT product_name, product_decp, quantity, price, pid FROM {} WHERE categoryid = %s").format(sql.Identifier('products'))
        cur.execute(query, (pcid,))
        prods = cur.fetchall()
        cur.close()

        if(prods):
            return list(map(list, prods))
        return None

Sample:

prod_list:[['原味蛋饼', '手工饼皮,原味蛋饼', 9999, 30, 27], ['起司蛋饼', '手工饼皮,起司蛋饼', 9999, 40, 28], ['培根蛋饼', '手工饼皮,培根蛋饼', 9999, 40, 29], [' 培根蛋三明治', '台式培根蛋三明治', 9999, 40, 30], ['鲔鱼蛋三明治\n', '台式鲔鱼蛋三明治', 9999, 40, 31], ['卡拉鸡腿堡', '卡拉鸡腿堡,含荷包蛋', 9999, 60, 32]]

加上可读性

OrderHandlier.py


def ShowProductListHandler(pcid):
    prod_list = dbpm.QUY_Products_info_by_pcid(pcid=pcid)
    if(not prod_list):return None

    info_list = []
    for prod in prod_list:
        info_list.append(f"【{prod[0]}】 餐点说明↓\n\n{prod[1]}\n\n库存:{prod[2]}\t售价:{prod[3]}\t订购代号:{prod[4]}\n")

    return '\n'.join(str(v) for v in info_list)

Sample:

https://ithelp.ithome.com.tw/upload/images/20211010/20140853XHp5Q0Xlkf.png
https://ithelp.ithome.com.tw/upload/images/20211010/20140853Hi5jR5Df3R.png

d27总结

应该还要加个产品有效期限检查的,但今天有点急,明天做从Line进行放入购物车,购物车品项调整的功能,再看看还有没有要加上去


<<:  [Python] 来自己建立一个Neural Network吧

>>:  DAY 24 - 四足战车 (5) 完

Day 6【React】阿嬷你怎麽没感觉?

【前言】 终於来到第一个大魔王了,突然感觉自己很像在打怪。等到开始打 Boss 才发现:「Reac...

[Q1][STM32G4系列] TIMER观察 - 使用TIMER触发ADC,透过DMA方式结合

前言 以TIMER为主要观察源,使用TIMER触发ADC,透过DMA结合,同时观察ADC中断副程序,...

day18 : kafka服务应用 on K8S (下)

昨天介绍了kafka的机制,今天将会透过strimzi的方式配置kafka cluster,同样的会...

最短路径问题 (5)

10.6 Dijkstra’s SSSP 演算法 如果我们只在乎从某个点 s 出发到所有点的距离,而...

[DAY 17]Discord server串接webhook

最近有打算写一个功能 FF14官网有新消息发布,bot就会把消息发送到discord主频上 但後来发...