信贷系统搭建——实现登录界面与验证


前言

想试着用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 创建窗体背景以及布局

窗体有几大常用的控件:

  1. Label:标签控件,可以动态展示或者静态展示,动态时用textvariable获取变量。
  2. Entry:输入框控件,获取输入的值传给对应的变量。
  3. Button:按钮控件,主要设置事件响应。

而窗体的布局主要有三种方法:

  1. grid(row=x,column=y):grid方法的布局是将界面自动划分成表格的样式,有row和column来设置处于“表格”的第几行第几列。但是这个方式不利于展示图片,特别是想将图片作为背景显示的时候。
  2. pack(side=‘top’/‘left’/‘right’/‘bottom’):pack方法相较于grid方法显得更加的灵活,还可以使用padx和pady来进行对于布局的设定。padx和pady是指相对于窗体/容器的边缘有多少个字符。
    注意:pack()和grid()方法不能同时使用,不然会让服务器纠结很久用什么方式来布局.
  3. 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('登录失败', '密码错误')

界面

在这里插入图片描述

总结

在构建用户登录的中最后将功能尽量模块化,继续关注我后面的博文哦,还会介绍登录成功之后的窗体如何做。以及涉及到参数传递在不同的窗体之间的问题。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值