摘 要
商铺入驻管理系统是为了方便管理者对入驻的商铺和申请入驻的商铺进行处理,也为了方便租户进行申请。商铺入驻管理系统是通过将入驻信息以数据库的形式由窗口来完成各商铺租户所要申请入驻信息填写的需求,以及管理者对已入驻的商铺和申请入驻的商铺进行管理。以打破传统的人工通过提交入驻申请报告书进行申请的模式,极大地方便了租户和管理人员,节约了时间和空间,实现商铺入驻操作自动化,自由化,使每个租户自由地选到自己需要的店铺,避免了多个租户之间同时申请同一个店铺,还避免传统入驻申请模式的繁琐、低效率等缺点。该系统更加直观地向租户展示了这个市场有多少家店铺,提供了多种店铺类型的查询方式(例如:按商铺类型、面积、租金等查询方式)。
关键词:商铺入驻管理系统;申请入驻;查询
商铺入驻管理系统
商铺入驻管理系统是利用MySQL和python编程语言实现的一个系统,其设计思想是:利用数据库来存储租户发来的申请,再由管理者进行审批(同意或驳回),然后申请者再进入系统查看结果。此外,该系统还有查询功能,管理者可以对已入驻的商铺进行信息修改、添加入驻商铺信息、删除店铺信息等功能;租户有查看已入驻的店铺、查看空置的店铺等功能。
1.系统需求分析
1.1 系统功能简介
一个系统,应该给用户提供方便、友好而简洁的界面进行应用,以便于用户更方便地进行工作。对于商铺入驻管理来说,分为管理者和租户,要实现的功能有管理者对以入驻地店铺进行信息的增、删、查、改等,以及对申请入驻的商铺进行处理。租户具有对已入驻的商铺的查询功能。
已入驻的商铺表的数据类型有:店铺编号、店铺名称、联系方式、店铺类型、面积、租金、是否空置、入驻时间。
申请入驻的商铺表数据类型有:店铺编号、店铺名称、联系方式、店铺类型、入驻时间和是否同意入驻。
此外,一个成熟的管理系统不仅应该具有基本的处理、查询功能,还应该有一些分析的功能。应该限制用户对数据的访问范围,限制用户操作级别(普通用户、管理员),限制对数据表修改权限。在进行设计系统的同时还要注意性能要求,响应各种操作的时间尽可能少。
1.2 软件环境与开发工具
市场商铺入驻管理系统是利用python 3.9开发环境,和Pycharm、MySQL、Navicat开发工具来实现的。有关工具介绍如下:
Pycharm 2021.1.1:PyCharm是一种Python IDE(Integrated Development Environment),其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如:调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。
MySQL 8.0:MySQL 8.0是全球最受欢迎的开源数据库的一个非常令人兴奋的新版本,全面改进。一些关键的增强包括:
SQL窗口函数,公用表表达式,NOWAIT和SKIP LOCKED,降序索引,分组,正则表达式,字符集,成本模型和直方图。
JSON扩展语法,新功能,改进排序和部分更新。使用JSON表函数,您可以使用JSON数据的SQL机制。
GIS地理支持。空间参考系统(SRS),以及SRS感知空间数据类型,空间索引和空间功能。
可靠性 DDL语句已变得原子性和崩溃安全,元数据存储在单个事务数据字典中。由InnoDB提供支持!
可观察性性能架构,信息架构,配置变量和错误记录的显着增强。
可管理性远程管理,撤消表空间管理和新的即时DDL。
安全 OpenSSL改进,新的默认身份验证,SQL角色,分解超级特权,密码强度等等。
性能 InnoDB在读/写工作负载,IO绑定工作负载和高争用“热点”工作负载方面明显更好。增加了资源组功能,通过将用户线程映射到CPU,为用户提供一个选项,以针对特定硬件上的特定工作负载进行优化。
Navicat Premium 12:“Navicat”是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQLServer 和/或 MariaDB等不同类型的数据库,并支持管理某些云数据库,例如阿里云、 腾讯云。 Navicat 的功能足以符合专业开发人员的所有需求,但是对数据库服务器初学者来说又相当容易学习。Navicat 的用户界面 (GUI) 设计良好,让你以安全且简单的方法创建、组织、访问和共享信息。
2.数据库设计
2.1 概要结构设计
本程序设计了4张表,其说明如下:
administrator表:管理员表,包含了账号和密码;
zuhu表:租户表,包含了账号和密码;
gly_sp表:已入驻商铺信息表,包含了店铺编号(唯一)、店铺名称、店铺联系方式、店铺类型、店铺面积、店铺租金、店铺是否空置和店铺入驻时间。该表插入了100家店铺(编号1~100),管理员可以对该表进行增、删、查、改,租户只可以对该表进行查询。
sq_sp表:申请表,包含了店铺编号(不唯一,一家店铺可以有多个租户进行申请)、店铺名称、店铺联系方式、店铺类型和店铺入驻时间。管理员可以对该表进行修改(即对申请入驻的商铺进行同意或驳回),租户可以对该表进行插入和删除(即取消申请)。
2.1.1数据表结构分析
2.2 逻辑结构设计
管理者账号表 : administrator | ||||
字段名 | 类型 | NULL | 宽度 | 备注 |
zhanghao | varchar | 11 | 账号 | |
mima | varchar | 10 | 密码 |
租户账号表 : zuhu | ||||
字段名 | 类型 | NULL | 宽度 | 备注 |
zhanghao | varchar | 11 | 账号 | |
mima | varchar | 10 | 密码 |
已入驻商铺表 :gly_sp | ||||
字段名 | 类型 | NULL | 宽度 | 备注 |
id | int | 0 | 商铺编号 | |
name | varchar | Y | 45 | 商铺名称 |
phone | varchar | Y | 11 | 联系方式 |
class | varchar | Y | 45 | 商铺类型 |
area | varchar | 45 | 商铺面积 | |
rent | varchar | 45 | 商铺租金 | |
konzhi | varchar | Y | 10 | 商铺是否空置 |
time | datetime | Y | 0 | 商铺入驻时间 |
申请表 :sq_sp | ||||
字段名 | 类型 | NULL | 宽度 | 备注 |
id | int | 0 | 商铺编号 | |
name | varchar | 45 | 商铺名称 | |
phone | varchar | 11 | 联系方式 | |
class | varchar | 45 | 商铺类型 | |
time | datetime | 6 | 商铺入驻时间 | |
ty | varchar | 11 | 是否同意 |
3.系统设计与实现
4.代码如下:
import pymysql
from tkinter import *
from tkinter.messagebox import *
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from PIL import Image, ImageTk # PIL模块,PIL支持GIF、JPEG、PCD、PNG、PPM、PSD等30多种图像文件格式
import time
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
from matplotlib import pyplot as plt
import re
def delButton(tree):
x = tree.get_children()
for item in x:
tree.delete(item)
def back(root):
root.destroy() # 销毁窗口
StartPage()
image1 = None
img1 = None
# 主窗口
def StartPage():
global image1
global img1
root = tk.Tk()
root.title('市场商铺入驻管理系统')
root.geometry('600x400+320+110') # 设置窗口大小以及距离x轴与y轴的距离
# root['background'] = 'white' #设置背景颜色
image1 = Image.open('1.jpg')
img1 = ImageTk.PhotoImage(image1) # 设置背景图片
Label(root, image=img1).pack()
menubar = Menu(root) # 菜单menubar作为root窗口子菜单
root.config(menu=menubar) # 将menubar菜单作为root窗口的顶层菜单
gly = Menu(menubar) # gly将作为menubar菜单的子菜单
gly.add_command(label='登陆/注销', command=lambda: Login(root))
gly.add_command(label='注册', command=lambda: register_Page(root))
menubar.add_cascade(label='管理员', menu=gly)
zuhu = Menu(menubar) # zuhu将作为menubar菜单的子菜单
zuhu.add_command(label='登陆/注销', command=lambda: GuestPage(root))
zuhu.add_command(label='注册', command=lambda: zuhu_Page(root))
menubar.add_cascade(label='租户', menu=zuhu)
Button(root, text='退出系统', height=1, font=tkFont.Font(size=10), width=8,
command=root.destroy, fg='black', bg='#BFEFFF').place(relx=0.45, rely=0.01)
Label(root, text='进入系统的时间:', font=('黑体', 8), bg='#BFEFFF').place(relx=0.31, rely=0.96)
Label(root, text=time.strftime('%Y-%m-%d %H:%M:%S'), font=("黑体", 8),
bg='#BFEFFF').place(relx=0.46, rely=0.96) # 设置进入系统的时间
root.mainloop()
image2 = None
img2 = None
# 管理员登录页面
def Login(root):
global image2
global img2
root.destroy()
root = tk.Tk()
root.title('管理员登录页面')
root.geometry('600x400+320+110')
root['background'] = 'white'
image2 = Image.open('2.jpg')
img2 = ImageTk.PhotoImage(image2)
Label(root, image=img2).pack()
Label(root, text='账号:', font=("楷体", 12)).place(relx=0.35, rely=0.25)
Label(root, text='密码:', font=("楷体", 12)).place(relx=0.35, rely=0.35)
zhanghao = StringVar()
pwd = StringVar()
zhanghao = Entry(root, textvariable=zhanghao, show=None)
zhanghao.place(relx=0.45, rely=0.26, relwidth=0.2, relheight=0.04)
mima = Entry(root, textvariable=pwd, show='*')
mima.place(relx=0.45, rely=0.36, relwidth=0.2, relheight=0.04)
Button(root, text="登录", width=8, font=tkFont.Font(size=9),
command=lambda: sign_in(root, zhanghao, mima), fg='black',
activebackground='black', activeforeground='white').place(relx=0.45, rely=0.48)
Button(root,text="注销账号", width=11, font=tkFont.Font(size=9), command=lambda: gly_zx(root,
zhanghao, mima), fg='black').place(relx=0.44, rely=0.58)
root.protocol('WM_DELETE_WINDOW', lambda: back(root))
root.mainloop()
# 管理员登陆账号密码验证
def sign_in(root, zhanghao, mima):
db = pymysql.connect(host="localhost", user="root", \
password="111111", db="shang_pu", port=3306)
cur = db.cursor()
sql = "select * from administrator where zhanghao='%s'" % (zhanghao.get())
try:
cur.execute(sql)
result = cur.fetchone() # 得到账号
mima1 = result[1]
except:
showinfo(title='提示', message='账号/密码错误!')
cur.close()
db.close()
try:
if mima1 == mima.get():
gly_choose(root)
else:
showinfo(title='提示', message='账号/密码错误!')
except:
pass
image3 = None
img3 = None
# 管理员注册页面
def register_Page(root):
global image3
global img3
root.destroy()
root = Tk()
root.title('管理员注册页面')
root.geometry('600x400+320+110')
root['background'] = 'white'
image3 = Image.open('3.jpg')
img3 = ImageTk.PhotoImage(image3)
Label(root, image=img3).pack()
Label(root, text='输入账号:', font=("楷体", 12), bg='white').place(relx=0.35, rely=0.25)
Label(root, text='输入密码:', font=("楷体", 12), bg='white').place(relx=0.35, rely=0.35)
Label(root, text='确认密码:', font=("楷体", 12), bg='white').place(relx=0.35, rely=0.45)
zhanghao = StringVar()
pwd = StringVar()
mima = StringVar()
zhanghao = Entry(root, textvariable=zhanghao, show=None)
zhanghao.place(relx=0.51, rely=0.26, relwidth=0.2, relheight=0.04)
mima = Entry(root, textvariable=pwd, show='*')
mima.place(relx=0.51, rely=0.36, relwidth=0.2, relheight=0.04)
qr_mima = Entry(root, textvariable=mima, show='*')
qr_mima.place(relx=0.51, rely=0.46, relwidth=0.2, relheight=0.04)
Button(root, text="注册", width=8, font=tkFont.Font(size=9),command=lambda:
register(root, zhanghao, mima, qr_mima), fg='black').place(relx=0.45, rely=0.58)
Button(root, text="退出", width=8, font=tkFont.Font(size=9), command=lambda:
back(root), fg='black').place(relx=0.45, rely=0.68)
root.protocol('WM_DELETE_WINDOW', lambda: back(root))
root.mainloop()
# 管理员注册信息判断
def register(root, zhanghao, mima, qr_mima):
db = pymysql.connect(host="localhost", user="root", password="111111", db="shang_pu")
cur = db.cursor()
sql = "insert into administrator values(%s,%s)" % (zhanghao.get(), mima.get())
cur.execute("select * from administrator where zhanghao='%s'" % (zhanghao.get()))
result = cur.fetchall()
if result:
showinfo('提示', '该账号已存在,请重新输入!')
else:
if len(mima.get()) == 6:
if qr_mima.get() == mima.get():
cur.execute(sql)
db.commit()
showinfo('提示', '注册成功!')
gly_choose(root)
else:
showinfo('提示', '两次输入密码不相同,请重新输入!')
else:
showinfo("提示", "请输入六位数密码!")
cur.close()
db.close()
# 管理员账号注销
def gly_zx(root, zhanghao, mima):
db = pymysql.connect(host="localhost", user="root", \
password="111111", db="shang_pu", port=3306)
cur = db.cursor()
sql = "select * from administrator where zhanghao='%s'" % (zhanghao.get())
try:
cur.execute(sql)
result = cur.fetchone() # 得到账号
mima1 = result[1]
except:
showinfo(title='提示', message='账号/密码错误!')
cur.close()
db.close()
if mima1 == mima.get():
sql1 = "delete from administrator where zhanghao='%s'" % (zhanghao.get())
cur.execute(sql1)
db.commit() # 确认删除
cur.close()
db.close()
showinfo(title='提示', message='注销成功!')
# StartPage()
else:
showinfo(title='提示', message='账号/密码错误!')
image6 = None
img6 = None
# 管理员信息选择操作页面
def gly_choose(root):
global image6
global img6
root.destroy()
root = Tk()
root.title('管理员信息选择操作页面')
root.geometry('800x500+320+110')
root['background'] = 'white'
image6 = Image.open('6.jpg')
img6 = ImageTk.PhotoImage(image6)
Label(root, image=img6).pack()
Label(root, text='店铺编号:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.03, rely=0.1)
Label(root, text='店铺名称:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.35, rely=0.1)
Label(root, text='店铺号码:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.67, rely=0.1)
Label(root, text='店铺类型:', font=("楷体", 12), bg="#D1EEEE").place(relx=0.03, rely=0.2)
Label(root, text='店铺面积:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.35, rely=0.2)
Label(root, text='店铺租金:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.67, rely=0.2)
Label(root, text='是否空置:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.03, rely=0.3)
Label(root, text='入驻时间:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.35, rely=0.3)
bh = StringVar() # 编号
mc = StringVar() # 名称
hm = StringVar() # 号码
lx = StringVar() # 类型
mj = StringVar() # 面积
zj = StringVar() # 租金
sj = StringVar() # 时间
dp_bh = Entry(root, textvariable=bh, show=None)
dp_bh.place(relx=0.13, rely=0.1, relwidth=0.2, relheight=0.05) # 输入编号
dp_mc = Entry(root, textvariable=mc, show=None)
dp_mc.place(relx=0.45, rely=0.1, relwidth=0.2, relheight=0.05) # 输入名称
dp_hm = Entry(root, textvariable=hm, show=None)
dp_hm.place(relx=0.77, rely=0.1, relwidth=0.2, relheight=0.05) # 输入号码
dp_lx = Entry(root, textvariable=lx, show=None)
dp_lx.place(relx=0.13, rely=0.2, relwidth=0.2, relheight=0.05) # 输入类型
dp_mj = Entry(root, textvariable=mj, show=None)
dp_mj.place(relx=0.45, rely=0.2, relwidth=0.2, relheight=0.05) # 输入面积
dp_zj = Entry(root, textvariable=zj, show=None)
dp_zj.place(relx=0.77, rely=0.2, relwidth=0.2, relheight=0.05) # 输入租金
# 输入是否空置
xVariable0 = StringVar() # 创建变量,便于取值
dp_sfkz = ttk.Combobox(root, textvariable=xVariable0, width=8)
dp_sfkz.pack() # 将下拉菜单绑定到窗口
dp_sfkz['value'] = ('是', '否')
dp_sfkz.current(0) # 设定下拉菜单的默认值为第1个
dp_sfkz.place(relx=0.13, rely=0.3)
dp_sj = Entry(root, textvariable=sj, show=None)
dp_sj.place(relx=0.45, rely=0.3, relwidth=0.2, relheight=0.05) # 输入入驻时间
list1 = [dp_bh, dp_mc, dp_hm, dp_lx, dp_mj, dp_zj, dp_sfkz, dp_sj]
Tree1 = ttk.Treeview(root, show='headings', column=('bn', 'mc', 'hm', 'lx', 'mj', 'zj', 'sfkz', 'sj'))
Tree1.column('bn', width=40, anchor='center') # 店铺编号
Tree1.column('mc', width=60, anchor='center') # 店铺名称
Tree1.column('hm', width=70, anchor='center') # 店铺联系方式
Tree1.column('lx', width=50, anchor='center') # 店铺类型
Tree1.column('mj', width=60, anchor='center') # 店铺面积
Tree1.column('zj', width=50, anchor='center') # 店铺租金
Tree1.column('sfkz', width=40, anchor='center') # 店铺是否空置
Tree1.column('sj', width=60, anchor='center') # 店铺入驻时间
# 表格标题设置
Tree1.heading('bn', text='店铺编号')
Tree1.heading('mc', text='名称')
Tree1.heading('hm', text='联系方式')
Tree1.heading('lx', text='类型')
Tree1.heading('mj', text='面积')
Tree1.heading('zj', text='租金')
Tree1.heading('sfkz', text='是否空置')
Tree1.heading('sj', text='入驻时间')
Tree1.place(relx=0.00, rely=0.6, relwidth=1)
def treeviewClick(event):
item = Tree1.selection()[0] # 获取选中的索引,返回一个列表
item_text = Tree1.item(item, 'values')
# 删除数据
dp_bh.delete(0, 'end')
dp_mc.delete(0, 'end')
dp_hm.delete(0, 'end')
dp_lx.delete(0, 'end')
dp_mj.delete(0, 'end')
dp_zj.delete(0, 'end')
dp_sfkz.delete(0, 'end')
dp_sj.delete(0, 'end')
# 插入数据
dp_bh.insert(0, item_text[0])
dp_mc.insert(0, item_text[1])
dp_hm.insert(0, item_text[2])
dp_lx.insert(0, item_text[3])
dp_mj.insert(0, item_text[4])
dp_zj.insert(0, item_text[5])
dp_sfkz.insert(0, item_text[6])
dp_sj.insert(0, item_text[7])
Button(root, text='查询全部商铺信息', width=14, font=tkFont.Font(size=10), command=lambda:
select_qb(tree=Tree1), fg='black', bg='#BFEFFF').place(relx=0.02, rely=0.4)
Button(root, text='添加商铺信息', width=12, font=tkFont.Font(size=10), command=lambda:
insert_dp(tree=Tree1, list=list1), fg='black', bg='#BFEFFF').place(relx=0.22, rely=0.4)
Button(root, text='删除商铺信息', width=12, font=tkFont.Font(size=10), command=lambda:
delete_dp(tree=Tree1, list=list1), fg='black', bg='#BFEFFF').place(relx=0.42, rely=0.4)
Button(root, text='修改商铺信息', width=12, font=tkFont.Font(size=10), command=lambda:
update_dp(tree=Tree1, list=list1), fg='black', bg='#BFEFFF').place(relx=0.62, rely=0.4)
Button(root, text="查找空置的店铺", width=13, font=tkFont.Font(size=10), command=lambda:
select_kz(tree=Tree1), fg='black', bg="#BFEFFF").place(relx=0.82, rely=0.4)
Button(root, text="查找已有商家入驻的店铺", width=20, font=tkFont.Font(size=10), command=lambda:
select_bkz(tree=Tree1), fg='black', bg="#BFEFFF").place(relx=0.78, rely=0.31)
Button(root, text='查看申请入驻的店铺', width=17, font=tkFont.Font(size=10), command=lambda:
select_sq1(root), fg='black', bg='#BFEFFF').place(relx=0.02, rely=0.5)
Button(root, text='根据编号查询', width=12, font=tkFont.Font(size=10), command=lambda:
select_bh(tree=Tree1, list=dp_bh1), fg='black', bg='#BFEFFF').place(relx=0.22, rely=0.5)
bh1 = StringVar()
dp_bh1 = Entry(root, textvariable=bh1, show=None)
dp_bh1.place(relx=0.338, rely=0.5, relwidth=0.06, relheight=0.04) # 输入编号
Button(root, text="退出", width=8, font=tkFont.Font(size=9), command=lambda: back(root), fg='black',
bg='#BFEFFF', activebackground='black', activeforeground='white').place(relx=0.45, rely=0.01)
root.protocol('WM_DELETE_WINDOW', lambda: back(root))
root.mainloop()
# 查询全部商铺信息
def select_qb(tree):
delButton(tree)
db = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = db.cursor() # db操作游标
sql = 'select * from gly_sp'
cur.execute(sql)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
db.close() # 关闭连接
# 添加商铺信息
def insert_dp(tree, list):
delButton(tree)
list2 = []
for i in range(len(list)):
if list[i].get() == '':
showerror(title='提示', message='输入不能为空')
return
else:
list2.append(list[i].get())
x = tree.get_children() # 返回的是treeviewClick()中的记录号
for item in x:
tree.delete(item)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor()
try:
sql1 = "insert into gly_sp values('%s','%s', '%s', '%s', '%s', '%s', '%s','%s')" % (list2[0], list2[1],
list2[2], list2[3], list2[4], list2[5], list2[6], list2[7])
cur.execute(sql1)
cn.commit()
results = cur.fetchall()
for item in results:
tree.insert('', "end", values=item)
showinfo(title='提示', message='添加/更改成功!')
except:
showinfo(title='提示', message='改店铺已存在')
return
cur.close()
cn.close()
# 删除商铺信息
def delete_dp(tree, list):
if not tree.selection():
showerror(title='提示', message='请选择一条信息!')
return
res = askyesno('提示', '是否删除?')
if res == True:
for item in tree.selection():
selectedItem = tree.selection()[0]
no1 = tree.item(selectedItem, 'values')[0]
tree.delete(item)
sql2 = "delete from gly_sp where id = '%s' " % no1
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor()
cur.execute(sql2)
cn.commit()
cur.close()
cn.close()
showinfo(title='提示', message='删除成功!')
# 修改商铺信息
def update_dp(tree, list):
if not tree.selection():
showerror(title='提示', message='请选择一条信息!')
return
else:
res = askyesno('提示', '确认更新?')
if res == True:
for item in tree.selection():
selectItem = tree.selection()[0]
no2 = tree.item(selectItem, 'values')[0]
tree.delete(item)
sql3 = "delete from gly_sp where id = '%s' " % no2
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor()
cur.execute(sql3)
cn.commit()
cur.close()
cn.close()
insert_dp(tree, list)
return
# 查找空置的商铺
def select_kz(tree):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # db操作游标
sql4 = "select * from gly_sp where konzhi='是' "
cur.execute(sql4)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 查找已有商家入驻的商铺
def select_bkz(tree):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # cn操作游标
sql5 = "select * from gly_sp where konzhi='否' "
cur.execute(sql5)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 根据编号查询
def select_bh(tree, list):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # db操作游标
sql = "select * from gly_sp where id=('%s') " % list.get()
cur.execute(sql)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
image8 = None
img8 = None
# 查看申请入驻的店铺页面(1)
def select_sq1(root):
global image8
global img8
root.destroy()
root = Tk()
root.title('管理员处理申请入驻店铺页面')
root.geometry('600x400+320+110')
root['background'] = 'white'
image8 = Image.open('6.jpg')
img8 = ImageTk.PhotoImage(image8)
Label(root, image=img8).pack()
Tree2 = ttk.Treeview(root, show='headings', column=('bn', 'mc', 'hm', 'lx', 'sj', 'ty'), height=26)
Tree2.column('bn', width=3, anchor='center') # 店铺编号
Tree2.column('mc', width=15, anchor='center') # 店铺名称
Tree2.column('hm', width=18, anchor='center') # 店铺联系方式
Tree2.column('lx', width=6, anchor='center') # 店铺类型
Tree2.column('sj', width=13, anchor='center') # 店铺入驻时间
Tree2.column('ty', width=6, anchor='center') # 是否同意
# 表格标题设置
Tree2.heading('bn', text='编号')
Tree2.heading('mc', text='名称')
Tree2.heading('hm', text='联系方式')
Tree2.heading('lx', text='类型')
Tree2.heading('sj', text='入驻时间')
Tree2.heading('ty', text='是否同意?')
Tree2.place(relx=0.3, rely=0, relwidth=0.7)
Button(root, text="查看", width=6, font=tkFont.Font(size=10), command=lambda:
select_sq2(tree=Tree2), fg='black', bg="#BFEFFF").place(relx=0.1, rely=0.1)
Button(root, text='提交', width=6, font=tkFont.Font(size=10), command=lambda:
update_ty(tree=Tree2, list1=ty, list2=dp_bh1), fg='black', bg='#BFEFFF').place(relx=0.03, rely=0.23)
bh1 = StringVar()
dp_bh1 = Entry(root, textvariable=bh1, show=None)
dp_bh1.place(relx=0.12, rely=0.2, relwidth=0.13, relheight=0.055) # 输入编号
# 同意或驳回复选框
xVariable5 = StringVar() # #创建变量,便于取值
ty = ttk.Combobox(root, textvariable=xVariable5, width=8)
ty.pack() # 将下拉菜单绑定到窗口
ty['value'] = ('同意', '驳回')
ty.current(0) # #设定下拉菜单的默认值为第1个
ty.place(relx=0.12, rely=0.26)
Button(root, text='查看同意的申请', width=13, font=tkFont.Font(size=10), command=lambda:
select_ty(tree=Tree2), fg='black', bg='#BFEFFF').place(relx=0.06, rely=0.35)
Button(root, text='查看驳回的申请', width=13, font=tkFont.Font(size=10), command=lambda:
select_bohui(tree=Tree2), fg='black', bg='#BFEFFF').place(relx=0.06, rely=0.45)
root.protocol('WM_DELETE_WINDOW', lambda: gly_choose(root))
root.mainloop()
# 查看申请入驻的店铺(2)
def select_sq2(tree):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # db操作游标
sql8 = "select * from sq_sp where ty='' " # is null
cur.execute(sql8)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 同意申请(3)
def update_ty(tree, list1, list2):
delButton(tree)
if list1.get() == '':
showerror(title='提示', message='店铺编号输入不能为空!')
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor()
sql9 = "update sq_sp set ty='{}' where id='{}'".format(list1.get(), list2.get())
cur.execute(sql9)
cn.commit()
cur.close()
cn.close()
# 查看已同意申请的店铺(4)
def select_ty(tree):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # db操作游标
sql8 = "select * from sq_sp where ty='同意' "
cur.execute(sql8)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 查看已驳回申请的店铺(5)
def select_bohui(tree):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # db操作游标
sql8 = "select * from sq_sp where ty='驳回' "
cur.execute(sql8)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
image4 = None
img4 = None
# 租户登录页面
def GuestPage(root):
global image4
global img4
root.destroy()
root = tk.Tk()
root.title('商铺租户登录页面')
root.geometry('600x400+320+110')
root['background'] = 'white'
image4 = Image.open('4.jpg')
img4 = ImageTk.PhotoImage(image4)
Label(root, image=img4).pack()
Label(root, text='账号:', font=("楷体", 12)).place(relx=0.35, rely=0.25)
Label(root, text='密码:', font=("楷体", 12)).place(relx=0.35, rely=0.35)
zhanghao = StringVar()
pwd = StringVar()
zhanghao = Entry(root, textvariable=zhanghao, show=None)
zhanghao.place(relx=0.45, rely=0.26, relwidth=0.2, relheight=0.04)
mima = Entry(root, textvariable=pwd, show='*')
mima.place(relx=0.45, rely=0.36, relwidth=0.2, relheight=0.04)
Button(root, text="登录", width=8, font=tkFont.Font(size=9),
command=lambda: sign_zuhu(root, zhanghao, mima), fg='black',
activebackground='black',activeforeground='white').place(relx=0.45, rely=0.48)
Button(root, text="注销账号", width=10, font=tkFont.Font(size=9), command=lambda: zuhu_zx(root, zhanghao, mima),
fg='black').place(relx=0.44, rely=0.58)
root.protocol('WM_DELETE_WINDOW', lambda: back(root))
root.mainloop()
# 租户登陆账号密码验证
def sign_zuhu(root, zhanghao,mima):
db = pymysql.connect(host="localhost", user="root", \
password="111111", db="shang_pu", port=3306)
cur = db.cursor()
sql = "select * from zuhu where zhanghao='%s'" % (zhanghao.get())
try:
cur.execute(sql)
result = cur.fetchone() # 得到账号
mima1 = result[1]
except:
showinfo(title='提示', message='账号/密码错误!')
cur.close()
db.close()
try:
if mima1 == mima.get():
zuhu_choose(root)
else:
showinfo(title='提示', message='账号/密码错误!')
except:
pass
image5 = None
img5 = None
# 租户注册页面
def zuhu_Page(root):
global image5
global img5
root.destroy()
root = Tk()
root.title('商铺租户注册页面')
root.geometry('600x400+320+110')
root['background'] = 'white'
image5 = Image.open('5.jpg')
img5 = ImageTk.PhotoImage(image5)
Label(root, image=img5).pack()
Label(root, text='输入账号:', font=("楷体", 12), bg='white').place(relx=0.35, rely=0.25)
Label(root, text='输入密码:', font=("楷体", 12), bg='white').place(relx=0.35, rely=0.35)
Label(root, text='确认密码:', font=("楷体", 12), bg='white').place(relx=0.35, rely=0.45)
zhanghao = StringVar()
pwd = StringVar()
mima = StringVar()
zhanghao = Entry(root, textvariable=zhanghao, show=None)
zhanghao.place(relx=0.51, rely=0.26, relwidth=0.2, relheight=0.04)
mima = Entry(root, textvariable=pwd, show='*')
mima.place(relx=0.51, rely=0.36, relwidth=0.2, relheight=0.04)
qr_mima = Entry(root, textvariable=mima, show='*')
qr_mima.place(relx=0.51, rely=0.46, relwidth=0.2, relheight=0.04)
Button(root, text="注册", width=8, font=tkFont.Font(size=9),command=lambda:
register_zuhu(root, zhanghao, mima, qr_mima), fg='black').place(relx=0.45, rely=0.58)
Button(root, text="退出", width=8, font=tkFont.Font(size=9), command=lambda:
back(root), fg='black').place(relx=0.45, rely=0.68)
root.protocol('WM_DELETE_WINDOW', lambda: back(root))
root.mainloop()
# 租户账号注销
def zuhu_zx(root, zhanghao, mima):
db = pymysql.connect(host="localhost", user="root", \
password="111111", db="shang_pu", port=3306)
cur = db.cursor()
sql = "select * from zuhu where zhanghao='%s'" % (zhanghao.get())
try:
cur.execute(sql)
result = cur.fetchone() # 得到账号
mima1 = result[1]
except:
showinfo(title='提示', message='账号/密码错误!')
cur.close()
db.close()
if mima1 == mima.get():
sql1 = "delete from zuhu where zhanghao='%s'" % (zhanghao.get())
cur.execute(sql1)
db.commit() # 确认删除
cur.close()
db.close()
showinfo(title='提示', message='注销成功!')
# StartPage()
else:
showinfo(title='提示', message='账号/密码错误!')
# 商铺租户注册信息判断
def register_zuhu(root, zhanghao, mima, qr_mima):
db = pymysql.connect(host="localhost", user="root", password="111111", db="shang_pu")
cur = db.cursor()
sql = "insert into zuhu values(%s, %s)" % (zhanghao.get(), mima.get())
cur.execute("select * from zuhu where zhanghao=' %s '" % (zhanghao.get()))
result = cur.fetchall()
if result:
showinfo('提示', '该账号已存在,请重新输入!')
else:
if len(mima.get()) == 6:
if qr_mima.get() == mima.get():
cur.execute(sql)
db.commit()
showinfo('提示', '注册成功!')
zuhu_choose(root)
else:
showinfo('提示', '两次输入密码不相同,请重新输入!')
else:
showinfo("提示", "请输入六位数密码!")
cur.close()
db.close()
image7 = None
img7 = None
# 租户选择操作界面
def zuhu_choose(root):
global image7
global img7
root.destroy()
root = Tk()
root.title('租户信息选择操作页面')
root.geometry('800x500+320+110')
root['background'] = 'white'
image7 = Image.open('7.jpg')
img7 = ImageTk.PhotoImage(image7)
Label(root, image=img7).pack()
Tree1 = ttk.Treeview(root, show='headings', column=('bn', 'mc', 'hm', 'lx', 'mj',
'zj', 'sfkz', 'sj'), height=26)
# 用show = "tree", 标题行会被隐藏; 用show = "headings" 会把一行数据隐藏起来
Tree1.column('bn', width=5, anchor='center') # 店铺编号
Tree1.column('mc', width=45, anchor='center') # 店铺名称
Tree1.column('hm', width=35, anchor='center') # 店铺联系方式
Tree1.column('lx', width=15, anchor='center') # 店铺类型
Tree1.column('mj', width=15, anchor='center') # 店铺面积
Tree1.column('zj', width=20, anchor='center') # 店铺租金
Tree1.column('sfkz', width=5, anchor='center') # 店铺是否空置
Tree1.column('sj', width=20, anchor='center') # 店铺入驻时间
# 表格标题设置
Tree1.heading('bn', text='编号')
Tree1.heading('mc', text='店铺名称')
Tree1.heading('hm', text='联系方式')
Tree1.heading('lx', text='类型')
Tree1.heading('mj', text='面积')
Tree1.heading('zj', text='租金')
Tree1.heading('sfkz', text='空置?')
Tree1.heading('sj', text='入驻时间')
Tree1.place(relx=0.16, rely=0.0, relwidth=0.8)
Button(root, text='查询全部商铺信息', width=14, font=tkFont.Font(size=10), command=lambda:
select_qb(tree=Tree1), fg='black', bg='#BFEFFF').place(relx=0, rely=0.09)
Button(root, text="查找空置的店铺", width=13, font=tkFont.Font(size=10), command=lambda:
select_kz(tree=Tree1), fg='black', bg="#BFEFFF").place(relx=0, rely=0.18)
Button(root, text="查找非空置的店铺", width=14, font=tkFont.Font(size=10), command=lambda:
select_bkz(tree=Tree1), fg='black', bg="#BFEFFF").place(relx=0, rely=0.27)
# 根据店铺类型查询按钮
xVariable1 = StringVar() # #创建变量,便于取值
lx = ttk.Combobox(root, textvariable=xVariable1, width=8)
lx.pack() # 将下拉菜单绑定到窗口
lx['value'] = ('超市', '书店', '饭店', '文具店', '理发店', '五金店', '家具店', '电器店', '早餐店',
'药店', '菜鸟驿站', '酒店', '数码', '服装店', '奶茶店', '水果店')
lx.current(0) # #设定下拉菜单的默认值为第1个
lx.place(relx=0, rely=0.36)
Button(root, text='查询', width=4, font=tkFont.Font(size=10), command=lambda:
select_lx(tree=Tree1, list=lx), fg='black', bg='#BFEFFF').place(relx=0.1, rely=0.36)
# 根据店铺面积查询按钮
xVariable2 = StringVar() # #创建变量,便于取值
mj = ttk.Combobox(root, textvariable=xVariable2, width=8)
mj.pack() # 将下拉菜单绑定到窗口
mj['value'] = ('60平方米', '80平方米', '90平方米', '100平方米', '110平方米', '120平方米', '150平方米', '180平方米',
'200平方米', '250平方米', '280平方米')
mj.current(0) # #设定下拉菜单的默认值为第1个
mj.place(relx=0, rely=0.45)
Button(root, text='查询', width=4, font=tkFont.Font(size=10), command=lambda:
select_mj(tree=Tree1, list=mj), fg='black', bg='#BFEFFF').place(relx=0.1, rely=0.45)
# 根据店铺租金查询按钮
xVariable3 = StringVar() # #创建变量,便于取值
zj = ttk.Combobox(root, textvariable=xVariable3, width=8)
zj.pack() # 将下拉菜单绑定到窗口
zj['value'] = ('0.4万元/月', '0.6万元/月', '0.7万元/月', '0.8万元/月', '0.9万元/月', '1.1万元/月', '1.3万元/月',
'1.6万元/月', '1.8万元/月', '2.2万元/月', '2.6万元/月')
zj.current(0) # #设定下拉菜单的默认值为第1个
zj.place(relx=0, rely=0.54)
Button(root, text='查询', width=4, font=tkFont.Font(size=10), command=lambda:
select_zj(tree=Tree1, list=zj), fg='black', bg='#BFEFFF').place(relx=0.1, rely=0.54)
Button(root, text='去申请入驻', width=11, font=tkFont.Font(size=10), command=lambda:
sq_root(root), fg='black', bg='#BFEFFF').place(relx=0, rely=0.63)
Button(root, text='入驻商铺类型分析', width=15, font=tkFont.Font(size=10), command=lambda:
fenxi(root), fg='black', bg='#BFEFFF').place(relx=0, rely=0.72)
Button(root, text='查看是否同意申请', width=15, font=tkFont.Font(size=10), command=lambda:
select_ty1(root), fg='black', bg='#BFEFFF').place(relx=0, rely=0.81)
Button(root, text="退出", width=8, font=tkFont.Font(size=9), command=lambda: back(root), fg='black',
bg='#BFEFFF', activebackground='black', activeforeground='white').place(relx=0.03, rely=0.01)
root.protocol('WM_DELETE_WINDOW', lambda: back(root))
root.mainloop()
# 根据店铺类型查询
def select_lx(tree , list):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # cn操作游标
sql6 = "select * from gly_sp where class=('%s') " % list.get()
cur.execute(sql6)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 根据店铺面积查询
def select_mj(tree, list):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # cn操作游标
sql7 = "select * from gly_sp where area=('%s') " % list.get()
cur.execute(sql7)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 根据店铺租金查询
def select_zj(tree, list):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # cn操作游标
sql8 = "select * from gly_sp where rent=('%s') " % list.get()
cur.execute(sql8)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 申请信息填写页面
def sq_root(root):
root = tk.Tk()
root.title('申请信息填写页面')
root.geometry('300x300+450+110')
root['background'] = '#BFEFFF' # 设置背景颜色
# 申请入驻信息填写
tk.Label(root, text='店铺编号:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.03, rely=0.11)
tk.Label(root, text='店铺名称:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.03, rely=0.21)
tk.Label(root, text='店铺号码:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.03, rely=0.31)
tk.Label(root, text='店铺类型:', font=("楷体", 12), bg="#D1EEEE").place(relx=0.03, rely=0.41)
tk.Label(root, text='入驻时间:', font=("楷体", 12), bg='#D1EEEE').place(relx=0.03, rely=0.51)
bh = StringVar() # 编号
mc = StringVar() # 名称
hm = StringVar() # 号码
lx = StringVar() # 类型
sj = StringVar() # 时间
ty = StringVar() # 是否同意,默认为None
dp_bh = tk.Entry(root, textvariable=bh, show=None)
dp_bh.place(relx=0.33, rely=0.12, relwidth=0.4, relheight=0.06) # 输入编号
dp_mc = tk.Entry(root, textvariable=mc, show=None)
dp_mc.place(relx=0.33, rely=0.22, relwidth=0.4, relheight=0.06) # 输入名称
dp_hm = tk.Entry(root, textvariable=hm, show=None)
dp_hm.place(relx=0.33, rely=0.32, relwidth=0.4, relheight=0.06) # 输入号码
dp_lx = tk.Entry(root, textvariable=lx, show=None)
dp_lx.place(relx=0.33, rely=0.42, relwidth=0.4, relheight=0.06) # 输入类型
dp_sj = tk.Entry(root, textvariable=sj, show=None)
dp_sj.place(relx=0.33, rely=0.52, relwidth=0.4, relheight=0.06) # 输入入驻时间
dp_ty = tk.Entry(root, textvariable=ty, show=None)
dp_ty.place(relx=0.33, rely=0.52, relwidth=0, relheight=0) # 是否同意入驻,默认为None
list2 = [dp_bh, dp_mc, dp_hm, dp_lx, dp_sj, dp_ty]
tk.Button(root, text='确定', width=4, font=tkFont.Font(size=5), command=lambda:
qd_xx(root, list=list2), fg='black', bg='#BFEFFF').place(relx=0.4, rely=0.65)
tk.Button(root, text='取消申请', width=8, font=tkFont.Font(size=5), command=lambda:
delete_sq(list=dp_bh), fg='black', bg='#BFEFFF').place(relx=0.36, rely=0.75)
root.mainloop()
# 申请入驻信息插入
def qd_xx(root, list):
list3 = []
for i in range(len(list)):
list3.append(list[i].get())
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor()
try:
sql1 = "insert into sq_sp values('%s','%s', '%s','%s','%s','%s')" % (list3[0], list3[1],
list3[2], list3[3], list3[4], list3[5])
cur.execute(sql1)
cn.commit()
showinfo(title='提示', message='申请信息填写成功!')
except:
showinfo(title='提示', message='改申请已存在!')
return
cur.close()
cn.close()
# 取消申请
def delete_sq(list):
if list==None:
showerror(title='提示', message='请输入编号!')
return
res = askyesno('提示', '是否取消?')
if res == True:
sql11 = "delete from sq_sp where id = '%s' " % list.get()
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor()
cur.execute(sql11)
cn.commit()
cur.close()
cn.close()
showinfo(title='提示', message='取消成功!')
image9 = None
img9 = None
# 查看申请入驻是否同意页面(1)
def select_ty1(root):
global image9
global img9
root.destroy()
root = Tk()
root.title('租户查看申请是否同意界面')
root.geometry('600x400+320+110')
root['background'] = 'white'
image9 = Image.open('6.jpg')
img9 = ImageTk.PhotoImage(image9)
Label(root, image=img9).pack()
Tree2 = ttk.Treeview(root, show='headings', column=('bn', 'mc', 'hm', 'lx', 'sj', 'ty'), height=26)
Tree2.column('bn', width=3, anchor='center') # 店铺编号
Tree2.column('mc', width=15, anchor='center') # 店铺名称
Tree2.column('hm', width=18, anchor='center') # 店铺联系方式
Tree2.column('lx', width=6, anchor='center') # 店铺类型
Tree2.column('sj', width=13, anchor='center') # 店铺入驻时间
Tree2.column('ty', width=6, anchor='center') # 是否同意
# 表格标题设置
Tree2.heading('bn', text='编号')
Tree2.heading('mc', text='名称')
Tree2.heading('hm', text='联系方式')
Tree2.heading('lx', text='类型')
Tree2.heading('sj', text='入驻时间')
Tree2.heading('ty', text='是否同意?')
Tree2.place(relx=0.3, rely=0, relwidth=0.7)
Button(root, text="查看", width=6, font=tkFont.Font(size=10), command=lambda:
select_ty2(tree=Tree2, list=bh1), fg='black', bg="#BFEFFF").place(relx=0.09, rely=0.23)
bh1 = StringVar()
dp_bh1 = Entry(root, textvariable=bh1, show=None)
dp_bh1.place(relx=0.09, rely=0.29, relwidth=0.09, relheight=0.055) # 输入编号
root.protocol('WM_DELETE_WINDOW', lambda: zuhu_choose(root))
root.mainloop()
# 查看申请入驻是否同意(2)
def select_ty2(tree, list):
delButton(tree)
cn = pymysql.connect(host='localhost', user='root', password='111111', db='shang_pu', port=3306)
cur = cn.cursor() # db操作游标
sql8 = "select * from sq_sp where id=('%s') " % list.get()
cur.execute(sql8)
results = cur.fetchall() # 返回所有元组,构成一个二维数组
for item in results:
tree.insert('', 'end', values=item)
cur.close()
cn.close() # 关闭连接
# 入驻商铺类型分析
def fenxi(root):
root = tk.Tk() # 创建tkinter的主窗口
root.title("商铺类型分析")
root.geometry('1300x650+0+0') # 设置窗口大小以及距离x轴与y轴的距离
root['background'] = '#E6E6FA' # 设置背景颜色
# 连接数据库
db = pymysql.connect(host='localhost', user='root', password='111111',
port=3306, db='shang_pu', charset='utf8')
cur = db.cursor() # 获取操作游标
sql1 = " SELECT class FROM gly_sp "
g = [] # 创建空列表,用于存储从数据库中查询出来的岗位
y = [] # 创建空列表,用于存放职位的数量
x = [] # 创建空列表,用于存放职位名称
counts1 = {} # 创建空字典,用于统计岗位的数量
try:
# 执行SQL语句
cur.execute(sql1)
# 获取所有记录列表
results1 = cur.fetchall()
for row in results1:
a = str(row) # 将数据转换成字符串类型
# 将字符串a中的符号去除
b = re.sub("([\\()\\''\\,])", '', a)
g.append(b)
for i in g:
counts1[i] = counts1.get(i, 0) + 1
# 将被职业数量按降序的方式排序
counts1 = dict(sorted(counts1.items(), key=lambda z: z[0]))
del counts1['None']
for language in counts1.values():
y.append(language)
for key, language in counts1.items():
x.append(key)
except SyntaxError:
print("SyntaxError")
print(y)
print(x)
# 中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 8
f = Figure(figsize=(5, 4), dpi=100)
# 画第1个图:扇形图
a = f.add_subplot(211) # 添加子图:1行1列第1个
cols = ["blue", "green", "yellow", "red", "orange", "purple",
"blue", "green", "yellow", "red", "orange", "purple",
"blue", "green", "yellow", "red", "orange"]
a.pie(y, labels=x, colors=cols,
shadow=True, explode=(0, 0.1, 0, 0.3, 0, 0.1,
0, 0.2, 0, 0.1, 0, 0.3, 0, 0.1, 0, 0.2, 0),
autopct='%1.1f%%')
# a.title("9市10岗位招聘经验要求", fontdict={'size': 10})
# 画第2个图:条形图
b = f.add_subplot(212) # 添加子图:1行1列第2个
b.bar(x, y, width=0.2, color='g')
for x1, yy in zip(x, y):
b.text(x1, yy + 1, str(yy), ha='center', va='bottom', fontsize=10, rotation=0)
# 将绘制的图形显示到tkinter:创建属于root的canvas画布,并将图f置于画布上
canvas = FigureCanvasTkAgg(f, master=root)
canvas.draw() # show方法已经过时了,这里改用draw
canvas.get_tk_widget().pack(side=tk.TOP, # 上对齐
fill=tk.BOTH, # 填充方式
expand=tk.YES) # 随窗口大小调整而调整
# matplotlib的导航工具栏显示上来(默认是不会显示它的)
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas._tkcanvas.pack(side=tk.TOP, # get_tk_widget()得到的就是_tkcanvas
fill=tk.BOTH,
expand=tk.YES)
def on_key_event(event):
"""键盘事件处理"""
print("你按了%s" % event.key)
key_press_handler(event, canvas, toolbar)
# 绑定上面定义的键盘事件处理函数
canvas.mpl_connect('key_press_event', on_key_event)
def _quit():
"""点击退出按钮时调用这个函数"""
root.quit() # 结束主循环
root.destroy() # 销毁窗口
# 创建一个按钮,并把上面那个函数绑定过来
button = tk.Button(master=root, text="退出", command=_quit)
# 按钮放在下边
button.pack(side=tk.BOTTOM)
# 关闭数据库连接
db.close()
# 主循环
root.mainloop()
if __name__ == '__main__':
StartPage()
背景图片:
6.运行效果如下
市场商铺入驻管理系统一共设计有11个界面,分别是:主界面、管理员登陆界面、管理员注册界面、管理员操作界面、管理员对申请入驻店铺信息处理界面、租户登陆界面、租户注册界面、租户操作界面、租户申请入驻信息填写界面、租户查看已入驻商铺类型分析界面、租户查看申请是否同意界面。各个界面所具有的功能如下:
主界面:具有管理员菜单和租户菜单,分别是管理员和租户登陆和注册账号的入口,此外,该窗口底部还记录了用户进入系统的具体时间。如图3-2所示:
图3-2 主界面
管理员登陆界面:进入管理员操作界面的入口,还有个注销账号的功能。如图3-3所示:
图3-3 管理员登陆界面
管理员注册界面:注册一个管理员账号和进入管理员操作界面的入口。如图3-4所示:
图3-4 注册成功界面
管理员操作界面:有查询店铺信息、修改店铺信息、删除店铺信息、添加店铺信息的功能,还是进入管理员对申请入驻店铺信息处理界面的入口。如图3-5所示:
图3-5 管理员操作界面
管理员对申请入驻店铺信息处理界面:对申请信息进行同意或驳回处理。在管理员操作界面中点击“查看申请入驻的店铺”按钮,会跳转到处理界面,如图3-6所示:
图3-6 管理员对申请入驻店铺信息处理界面
租户登陆界面:进入租户操作界面的入口,还有个注销账号的功能。如图3-7所示:
图3-7 租户登陆界面
租户注册界面:注册一个租户账号和进入租户操作界面的入口。如图3-8所示:
图3-8 租户注册成功界面
租户操作界面:有对已入驻商铺按多种方法进行查询的功能,是进入申请入驻信息填写界面、查看已入驻商铺类型分析界面、查看申请是否同意界面的入口。租户登陆或注册成功之后就会跳转到租户操作界面,如图3-9所示:
图3-9 租户操作界面
租户申请入驻信息填写界面:填写申请入驻信息。在租户操作界面中点击“去申请入驻”按钮,会跳转到申请界面,如图3-10所示:
图3-10 租户申请界面
租户查看已入驻商铺类型分析界面:分析已入驻的商铺类型,以可视化的方式展示出来。在租户操作界面中点击“入驻商铺类型分析”按钮,会跳转到分析界面,如图3-11所示:
图3-11 已入驻商铺类型分析
租户查看申请是否同意界面:查看提交的申请是被同意还是驳回界面。如图3-12所示:
图3-12 租户查看申请是否同意界面