文章目录
- 前言
- 一、问题描述
- 1.1权限管理
- 1.2业务管理
- 1.3模型管理
- 1.4案例管理
- 二、实现步骤
- 1.构建数据库和xlsx的读入
- 2.登陆界面
- 2.1 初始化窗体
- 2.2 创建窗体背景以及布局
- 2.3 创建登录函数
- 界面
- 总结
前言
想试着用python做个端到端的开发,从后台数据库构建到前端系统界面的实现,并且后期加入模型预测和数据分析的模块,同样在tkinter里面进行实现。虽然treeview我还在继续摸索和学习中,确实对我这种前端小白很不友好,不过想到能打通这个障碍做一个完完整整的系统就很开心。
一、问题描述
信贷系统是银行的核心业务支持系统,根据不同的岗位角色,设定的权限级别不一样。主要的用户角色有:
1.1权限管理
此为系统管理岗对应的模块,主要的功能需求是:
(1)重置密码;
(2)重置流程:将在途流程往回调节点;
(3)客户归属重置:分配用户由哪个客户经理来负责。
1.2业务管理
此为客户经理岗对应的模块,主要的功能需求是:
(1)客户管理
(2)授信管理
(3)放款申请
1.3模型管理
此为模型管理岗对应的模块,主要的功能需求是:
(1)数据统计
(2)模型调整
(3)模型测试
1.4案例管理
此为案例分析岗对应的模块,主要功能需求是:
(1)待判定案例
(2)已判定案例
(3)行内案例集
二、实现步骤
1.构建数据库和xlsx的读入
代码如下(示例):
import sqlite3
import xlrd
conn = sqlite3.connect("./bin/CRM.db") # 打开或创建数据库
c = conn.cursor() # 获取游标
sql_create = ''' CREATE TABLE loginuser (
username varchar(6) NOT NULL PRIMARY KEY ,
password varchar(16) NOT NULL ,
loginrole int,
loginerror int);
'''
filename = "CRM.xlsx"
#filename = filename.decode("utf-8").encode("gbk")
ex = xlrd.open_workbook(filename)
sh = ex.sheet_by_name('loginuser')
row_num = sh.nrows
list = [] # 定义列表用来存放数据
for i in range(1, row_num): # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
row_data = sh.row_values(i) # 按行获取excel的值
value = (row_data[0], row_data[1], row_data[2], row_data[3])
list.append(value) # 将数据暂存在列表
# print(i)
sql = "INSERT INTO loginuser(clientid,password,loginrole,loginerror)\
VALUES(%s,%s,%s,%s)"
cursor.executemany(sql, list) # 执行sql语句
db.commit() # 提交
list.clear() # 清空list
print("worksheets: " + sheet + " has been inserted " + str(row_num) + " datas!")
conn.close()
2.登陆界面
2.1 初始化窗体
初始化窗体时,主要是设置窗体的标题(title),窗口大小(geometry),窗体的其他属性的申明。这里定义的属性在整个窗体类中有效。
代码如下(示例):
def __init__(self):
super().__init__() #Tk类的初始化
self.title("xx银行信贷系统")
self.geometry('560x320')
self.resizable(0,0)
tku.center_window(self)
self.setup_UI()
self.user = "" #当前用户
self.pw = "" #当前用户密码
2.2 创建窗体背景以及布局
窗体有几大常用的控件:
- Label:标签控件,可以动态展示或者静态展示,动态时用textvariable获取变量。
- Entry:输入框控件,获取输入的值传给对应的变量。
- Button:按钮控件,主要设置事件响应。
而窗体的布局主要有三种方法:
- grid(row=x,column=y):grid方法的布局是将界面自动划分成表格的样式,有row和column来设置处于“表格”的第几行第几列。但是这个方式不利于展示图片,特别是想将图片作为背景显示的时候。
- pack(side=‘top’/‘left’/‘right’/‘bottom’):pack方法相较于grid方法显得更加的灵活,还可以使用padx和pady来进行对于布局的设定。padx和pady是指相对于窗体/容器的边缘有多少个字符。
注意:pack()和grid()方法不能同时使用,不然会让服务器纠结很久用什么方式来布局. - place(x=digit,y=digit):place方法显得更灵活一点,直接指定控件的位置。
代码如下(示例):
def setup_UI(self):
#创建背景画布
self.canvas = tk.Canvas(self, height=400, width=600)
self.image_file = ImageTk.PhotoImage(file="./welcome.png")
self.image = self.canvas.create_image(280, 0, anchor='n', image=self.image_file)
self.canvas.pack(side='top')
#创建用户名和登录参数
self.user_label = tk.Label(self, text='用户名:')
self.pwd_label = tk.Label(self, text='密码:')
self.username = tk.Entry(self, width=20)
self.password = tk.Entry(self, width=20, show='*')
self.login_btn = tk.Button(self, command=self.login,text='登录', width=6)
self.exit_btn = tk.Button(self, command=self.quit,text='退出', width=6)
self.user_label.place(x=130, y=210)
self.pwd_label.place(x=130, y=235)
self.username.place(x=205, y=210)
self.password.place(x=205, y=235)
self.login_btn.place(x=130, y=275)
self.exit_btn.place(x=310, y=275)
2.3 创建登录函数
登录时需要判断用户的角色是什么,登录进入后会到不同的界面,这样更加便于权限管理的需求。
代码如下(示例):
def login(self):
connection = tku.con()
curs = tku.cur(connection)
self.user = self.username.get()
self.pw = self.password.get()
query = "select username,password,loginrole,loginerror from loginuser where username='%s'" % self.user
curs.execute(query)
c = curs.fetchall() # 接收全部信息
if len(c) == 0:
tk.messagebox.showerror('登录失败', '您没有权限访问哦~如果需要权限,请确保您在CRM系统注册')
else:
us, pw, lr, lerror = c[0]
if lerror >= 3:
tk.messagebox.showwarning('登录失败', '您的账号已被锁定,请联系CRM系统解除')
elif us == self.user and pw == self.pw:
self.destroy()
if lr == 1:
A = AdminPage(self.user,self.get_now_time())
elif lr == 2:
C = ClientPage()
tku.gui_arrange(C)
tk.mainloop()
elif lr == 3:
CS = CaseStudyPage()
tku.gui_arrange(CS)
tk.mainloop()
elif lr == 4:
M = ModelPage()
tku.gui_arrange(M)
tk.mainloop()
elif lr == 5:
A = ApprovePage()
tku.gui_arrange(A)
tk.mainloop()
else:
tk.messagebox.showwarning('登录失败', '密码错误')
界面
总结
在构建用户登录的中最后将功能尽量模块化,继续关注我后面的博文哦,还会介绍登录成功之后的窗体如何做。以及涉及到参数传递在不同的窗体之间的问题。