Python简单数据库系统-优惠券系统(含UI)

Python简单数据库系统-优惠券系统(含UI)

目录

  • Python简单数据库系统-优惠券系统(含UI)
  • 简介
    • 需要的东西
  • 函数主体
    • 券号和密码
    • 初始化状态
  • UI
    • 出票系统
    • 验证系统
  • 总结

简介

疫情结束后各大企业尤其是饮食业都在想着法子用优惠券的方式吸引大众消费,于是对优惠券这个小型数据库系统产生了兴趣,简单介绍下优惠券系统需要具备什么基础功能。本设计基于n折优惠券。

需要的东西

设计一个系统的时候,需要明确自己需要什么,每一部分怎么实现。
在这里插入图片描述

函数主体

券号和密码

这里使用random库中的sample产生随机序列,券号使用纯数字而密码采用全小写字母。调用方法:random.sample(range,bit)

id = ''.join(str(o) for o in random.sample(range(1,9),id_width))
code = ''.join(chr((o)) for o in random.sample(range(97,122),code_width)) # 97-122对应小写字母

初始化状态

正如思维导图所示,系统只有券号和密码是远远不够的。
1.在创建数据库时要准备好思维导图呈现的状态变量
2.同时需要考虑券的生成模式,是随机折扣(如5~9折随机)还是指定折扣券。
3.将数据保存成字典

def create_code_dictionary(discount_sta):
    # 券号密码位宽
    id_width = 8
    code_width = 6
    control_dic = {}
    # 生成优惠券的数量
    numbers = 1000
    for i in range(numbers):
        # 使用状态,获取状态,消费单号,消费金额,折扣后金额
        use_sta = 0
        get_sta = 0
        series_num = ""
        cost = ""
        discount_num = ""
        # sample(seq, n) 从序列seq中选择n个随机且独立的元素;
        id = ''.join(str(o) for o in random.sample(range(1,9),id_width))
        code = ''.join(chr((o)) for o in random.sample(range(97,122),code_width)) # 97-122对应小写字母
        if int(discount_sta) == 0:
            # 5~9折优惠券
            discount = random.randint(5,9)
        else:
            discount = int(discount_sta)
        control_dic[id] = [code,use_sta,series_num,cost,get_sta,discount,discount_num]
    dic_into_csv(control_dic)

这里结尾利用了panda库先将字典转换成dataframe,再利用dataframe2csv保存成表格,具体操作如下:

def dic_into_csv(dic):
    csv_name = ["id", "code", "use_sta", "series_num", "cost","get_sta","discount","discount_num"]
    csv_data = zip(list(dic.keys()), [list(dic.values())[k][0] for k in range(len(dic))]
                   , [list(dic.values())[k][1] for k in range(len(dic))],
                   [list(dic.values())[k][2] for k in range(len(dic))],
                   [list(dic.values())[k][3] for k in range(len(dic))],
                   [list(dic.values())[k][4] for k in range(len(dic))],
                   [list(dic.values())[k][5] for k in range(len(dic))],
                   [list(dic.values())[k][6] for k in range(len(dic))])
    tickets_access = pd.DataFrame(columns=csv_name, data=csv_data)
    tickets_access.to_csv(path)

由此就得到了这样的数据表格
在这里插入图片描述

UI

针对这个题设,应该有一个出票系统用于出票派券,一个验证系统用于检验券码是否匹配,并记录消费详情。使用的是tkinter库做ui。

出票系统

在这里插入图片描述
ui部分代码不作过多展示,详情可以在页面最后前往开源界面获取资源。
其内核部分先判断是否需要指定折扣,若否则检查数据库并抽取第一个获取状态为0的折扣券;若是则还须检查票券的折扣是否对应。返回值是券号,密码以及折扣力度。

def get_tic(dic,discount_sta):
    if int(discount_sta) == 0: # 随机折扣出票
        for key in dic.keys():
       		 # 获取状态为0
            if dic[key][4] == 0:
                dic[key][4] = 1
                out = [key,dic[key][0],dic[key][5]]
                dic_into_csv(dic)
                return out
    else:
        for key in dic.keys():  # 指定折扣出票
            if dic[key][4] == 0 and dic[key][5] == int(discount_sta):
                dic[key][4] = 1
                out = [key,dic[key][0],dic[key][5]]
                dic_into_csv(dic)
                return out

验证系统

在这里插入图片描述
在验证系统中,面向的对象是管理员,在此界面中应含有前面提及的四项基本输入项,考虑到实际需求,还需一个刷新数据库的选项。在输入管理员密码后,可以按照设定来重置票券系统:
在这里插入图片描述
查验函数要求输入基本四项以及密码本字典以及一个str_var,该var用于在ui界面展示对应验证成功/失败的文字。
核心思想是先检查该券号的获取状态,然后验证券与密码是否匹配,然后检查券兑换状态,然后检查消费单号是否已被登记,前者都通过验证则进行记录,并在完成后将字典写入更新csv表格。

def check(quanhao,mima,danhao,jine,tickets_dic,var1):
    danhao_list = [tickets_dic[key][2] for key in tickets_dic.keys()]
    # 检查优惠券是否被获取
    if tickets_dic[quanhao][4] == 1:
        if mima == tickets_dic[quanhao][0]:
            # 检查优惠券是否已被使用
            if tickets_dic[quanhao][1] != 0:
                print("该优惠券已被使用!")
                var1.set("该优惠券已被使用!")
            # 消费单号是否已记录
            elif danhao in danhao_list:
                print("该消费单已被记录!")
                var1.set("该消费单已被记录!")
            else:
                tickets_dic[quanhao][1] = 1
                tickets_dic[quanhao][2] = danhao
                tickets_dic[quanhao][3] = jine
                temp_dis = float(0.1*float(jine)*tickets_dic[quanhao][5])
                tickets_dic[quanhao][6] = round(temp_dis,1)
                dic_into_csv(tickets_dic)
                print("验证成功!")
                var1.set("验证成功!优惠后金额为:"+str(tickets_dic[quanhao][6]))
        else:
            print("券号或密码不正确!")
            var1.set("券号或密码不正确!")
    else:
        var1.set("该优惠券尚未发出!")

在这里插入图片描述

总结

该系统可以根据需求创建n折优惠券,能够验证券码是否匹配并将消费数据记录下来。构建一个系统需要考虑到各方面的状态量,方便调用验证。本系统的ui设计细节没有过多展示,已经在github上开源,需要的朋友可以前去查看。

热门文章

暂无图片
编程学习 ·

Qt 文件路径操作

//mSaveName = "C:/aaaa/fff.txt"; auto info = QFileInfo(mSaveName); QString pathName = info.absolutePath();// "C:/aaaa" QString baseName = info.baseName(); //"fff" QString fileName = info.fileName(); //"fff.txt"
暂无图片
编程学习 ·

Unity2D教程:菜单界面、文字设置、常用界面功能

菜单界面创建一个UI-Image,会自动生成Canvas。 设置Canvas的设置模式为随屏幕改变 设置Image的伸展模式,在这个界面按下Alt键会变成这样,选择右下角那个就是填充整个Canvas了在当前Image下创建Button,将Button下面的Text和Button自身都弄成预置物Text可以加一个Outline组件…
暂无图片
编程学习 ·

解决VBE6EXT.OLB不能被加载问题

一般出现这个问题的话,就是配置有问题了,或者是你的VBE6EXT.OLB文件出了问题,看了网上一堆方法,试了很多都不管用,然后综合了一下,总结出了不能用的原因和解决方法:第一种方法: 将自己电脑内的VBA文件转移一下: 路径是由 C:\Program Files (x86)\Common Files\microso…
暂无图片
编程学习 ·

ClassName(类名)命名

ClassName命名 ClassName的命名应该尽量精短、明确,必须以字母开头命名,且全部字母为小写,单词之间统一使用下划线 “_” 连接。 eg:.nav_top 注意事项 ad、banner、gg、guanggao 等有机会和广告挂勾的字眠不建议直接用来做ClassName,因为有些浏览器插件(Chrome的广告拦截…
暂无图片
编程学习 ·

异步FIFO学习

这里写自定义目录标题一、概述二、异步FIFO的设计基础2.1 FIFO指针2.2 格雷码的使用2.2.1 二进制码存在的问题2.2.2 格雷码计数器2.3 空满条件的判断三、异步FIFO设计实现3.1 fifo13.2 fifomem3.3 sync_r2w3.4 sync_w2r3.5 rptr_empty3.6 wptr_full 一、概述 在大规模ASIC或FPG…
暂无图片
编程学习 ·

Fiddler(二)数据信息分析

抓包是Fiddler的最基本的应用,以本博客为例,启动Fiddler之后,在浏览器中输入http://blog.csdn.net/ohmygirl 键入回车之后,在Fiddler的web session界面捕获到的HTTP请求如下图所示:#号列中的图标,每种图标代表不同的相应类型,具体的类型包括:另外,注意请求的host字段。…
暂无图片
编程学习 ·

对简单文本的下载

import requests ser=requests.get() #一般为md格式 novel=ser.text k=open(要保存文件的位置和文件名,a+) #例:F:/desktop file/文件名.txt k.write(novel) k.close()什么是md文件, md全称markdown,markdown是一种标记语言。
暂无图片
编程学习 ·

荣耀X10 Max发布在即 屏幕优势显著

前一阵就听说了荣耀X10 Max将在7月2日发布的消息,不知不觉中已经只剩不到一周的时间了,作为今年唯一的5G大屏手机,人们关注的无非是它的屏幕,以及各项配置。刚刚荣耀X10 Max又有了更多的爆料信息,下面就跟大家来聊一聊这款即将发布的5G大屏手机。荣耀X10 Max采用了一块7.0…
暂无图片
编程学习 ·

iOS开发之多线程(3)—— GCD

目录版本简介几个概念1. 任务(Task) 和 队列(Queue)2. 同步(sync) 和 异步(async)3. 串行(Serial) 和 并发(Concurrent)4. 主队列(Main Queue) 和 全局队列(Global Queue)GCD的基本使用1. 同步执行 + 串行队列2. 同步执行 + 并发队列3. 异步执行 + 串行队列4. 异步执行 + 并发队…
暂无图片
编程学习 ·

Vue父组件调用子组件的方法

1.子组件使用ref,父组件直接调用(推荐)<child ref="mychild"></child>this.$refs.mychild.childMethod("嘿嘿嘿");2.子组件注册监听事件,父组件调用$emit触发this.$refs.mychild.$emit(childMethod,嘿嘿嘿) // 方法1:触发监听事件//子组件注册…
暂无图片
编程学习 ·

Java的变量与常量

变量与常量变量的定义变量的初始化常量static final(类常量) 变量的定义大多数程序设 计语言相比,Java 中“ 字母” 和“ 数字” 的范围更大。字母包括’A’ ~ ’Z’、 ‘a’ ~ ‘z’、’_’、’$’,或在某种语言中表示字母的任何 Unicode 字符。希腊人可以用π 。同样, 数…
暂无图片
编程学习 ·

从 Android 源码分析自定义 View 相关知识点

以下源码来自于 Android P。onMeasure()MeasureSpecMeasureSpec 是 View 里的一个内部类,其用来表示 View 的测量模式和测量大小,代码如下:public static class MeasureSpec {/*** Creates a measure specification based on the supplied size and mode.** The mode must a…
暂无图片
编程学习 ·

git用法备份

git远程仓库创建本地仓库ssh加密创建远程仓库 创建本地仓库 在命令行输入以下内容: $ mkdir gitstore $ cd gitstore $ git init Initialized empty Git repository in C:/Users/15665/gitstore/.git/我们可以看到gitstore目录下多了一个.git目录,证明创建成功。接下来在gits…
暂无图片
编程学习 ·

react-native 的 Text 多余的显示省略号

当字数太多的时候我们需要省略号来显示多余的字,使用Text的属性1:显示几行(numberOfLines)<Text numberOfLines={1}/>2:省略号显示的位置(ellipsizeMode) 可以是以下几个值tail、head、 middle、clip默认的是tail (尾部) 头部 head中间 middle从尾部截掉 clip<Te…
暂无图片
编程学习 ·

输入字符串“abc“,输出组合a,b,c,ab,ac,bc,abc

输入字符串"abc",输出组合a,b,c,ab,ac,bc,abcclass Main {public static void main(String[] args){String s = new Scanner(System.in).next();combine(s);}public static void combine(String str){char[] in=str.toCharArray();StringBuilder out = new StringBu…
暂无图片
编程学习 ·

精通java开发-wait,notify和notifyAll的总结(含案例)

目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pageswait,notify和notifyAll 总结在调用wait方法时,线程必须要持有被调用对象的锁,当调用wait方法后,线程就会释放掉该对象的锁(monitor)在调用Thread类的sleep方法时,线程是不会释放掉对象的锁的当调用wait时,首先…
暂无图片
编程学习 ·

秋招offer收割机——后台服务器开发方向(专业学习路线图总结)

IT行业,从业技术方向千千万,为什么我称后台服务器开发领域为offer收割机。 首先我们看一下,如果要从事后台服务器开发要掌握哪些技术! 有点多,做好心理准备。可能技术的全面度是你之前没有见过。 看到这里是不是先关注,收藏一波。便于日后再学~~~1.算法与设计 排序与查找…