-
2020-05-20 21:19:31
前言: 本系统为大型数据库的大作业,这里用到了三张表的信息,实现了三张表的增删改查,链接的是sql server数据库(代码存在不少冗余,商品改改相关字段就是学生信息系统啦/狗头)
环境: win10 64位专业版、sql server2014企业版、python3.6、pymssql 2.1.4
ps:
- 可以通过改代码将系统链接到mysql或者别的数据库,有什么问题可以在评论区写出来,我看到就会回复的。
- 43行和51行的建立数据库路径需要改为自己盘的路径。
- 35行光改服务器名、密码两个参数(sa代表超级用户,建立一个新的数据库(EMIS)使用)。其他行的
pymssql.connect
连接四个参数可以都改改。
CODE:
import pymssql from tkinter import ttk import tkinter as tk import tkinter.font as tkFont from tkinter import * import tkinter.messagebox as messagebox # 弹窗 # 打包的时候会用到(十进制的一个库) import decimal decimal.__version__ class StartPage: def __init__(self, parent_window): parent_window.destroy() # 销毁上一个窗口 self.window = tk.Tk() # 初始框的声明 self.window.title('商品信息管理系统') self.window.geometry('300x410+500+100') # 这里的乘是小x,第一个参数表示窗口的长,第二个表示宽,第三个表示的距离屏幕左边界的距离,第三个为距离上边界的距离 label = Label(self.window, text="商品信息管理系统", font=("Verdana", 20)) label.pack(pady=100) # pady=100 这个label距离窗口上边界的距离,这里设置为100刚好居中 # command=lambda: 可以带参数,注意带参数的类不要写括号,否者,这里调用会直接执行(class test:) Button(self.window, text="管理员登陆", font=tkFont.Font(size=16), command=lambda: AdminPage(self.window), width=30, height=2, fg='white', bg='gray', activebackground='black', activeforeground='white').pack() # pack() 方法会使得组件在窗口中自动布局 Button(self.window, text="数据库初始化", font=tkFont.Font(size=16), command=self.Initialization, width=30, height=2, fg='white', bg='gray', activebackground='black', activeforeground='white').pack() Button(self.window, text="退出系统", height=2, font=tkFont.Font(size=16), width=30, command=self.window.destroy, fg='white', bg='gray', activebackground='black', activeforeground='white').pack() self.window.mainloop() # 主消息循环 # 创建数据库 def Initialization(self): db = pymssql.connect('TAF_MT', 'sa', '123456789', 'master') # 服务器名,账户,密码,数据库名 cursor = db.cursor() print('建立数据库中......') sql = """ -- 创建EMIS数据库 CREATE DATABASE EMIS ON PRIMARY ( NAME='EMIS_data',--主文件逻辑文件名 FILENAME='G:\\SQL Server\\EMIS_data.mdf', --主文件文件名 SIZE=5mb,--系统默认创建的时候会给主文件分配初始大小 MAXSIZE=500MB,--主文件的最大值 filegrowth=15%-- 主文件的增长幅度 ) LOG ON ( name='EMIS_log',--日志文件逻辑文件名 filename='G:\\SQL Server\\EMIS_log.ldf',--日志文件屋里文件名 SIZE=5MB,--日志文件初始大小 filegrowth=0 --启动自动增长 ) """ try: db.autocommit(True) # 这个句话可以防止python创建数据库的时候报错(python连接数据库机制的问题) cursor.execute(sql) db.commit() except: messagebox.showinfo('警告!', '数据库连接失败!') cursor.close() # 关闭游标 db.close() # 关闭数据库连接 self.jianbiao() # 进行建表操作 # 创建数据表 def jianbiao(self): db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服务器名,账户,密码,数据库名 cursor = db.cursor() print('建立数据表中......') sql = """ ---创建管理员数据表 CREATE TABLE t_admin ( admin_id varchar(255) NOT NULL, admin_pass varchar(255) DEFAULT NULL, PRIMARY KEY (admin_id) ); ---插入管理账户和密码 INSERT INTO t_admin VALUES ('admin', 'admin'); ---创建商品表 CREATE TABLE t_goods ( id varchar(20) NOT NULL, name varchar(20) DEFAULT NULL, gender varchar(7) DEFAULT NULL, age varchar(7) DEFAULT NULL, PRIMARY KEY (id) ); ---向商品表中插入数据 INSERT INTO t_goods VALUES ('1000000', '小米1', '1999', '1000'); INSERT INTO t_goods VALUES ('1000001', '小米2', '1999', '1500'); INSERT INTO t_goods VALUES ('1000002', '小米3', '1999', '1000'); INSERT INTO t_goods VALUES ('1000003', '小米4', '1999', '900'); INSERT INTO t_goods VALUES ('1000004', '小米5', '1999', '2000'); INSERT INTO t_goods VALUES ('1000005', '小米6', '2499', '10000'); INSERT INTO t_goods VALUES ('1000006', '小米8', '2599', '20000'); ---创建买家信息数据表 CREATE TABLE t_buyer ( SNO varchar(20) NOT NULL, NAME varchar(255) DEFAULT NULL, NUMBER varchar(255) DEFAULT NULL, dizhi varchar(255) DEFAULT NULL ); ---向卖家信息数据表中插入数据 INSERT INTO t_buyer VALUES ('08300205', '小红', '1', '天津市'); INSERT INTO t_buyer VALUES ('08300206', '小明', '3', '北京市'); INSERT INTO t_buyer VALUES ('08300207', '小芬', '1', '安阳市'); INSERT INTO t_buyer VALUES ('08080929', '小爱', '10', '武汉市'); ---创建订单信息表 CREATE TABLE t_order( id varchar(20) NOT NULL, SNO varchar(20) DEFAULT NULL, buy_time varchar(255) DEFAULT NULL, vic varchar(255) DEFAULT NULL, buy_money varchar(255) DEFAULT NULL, PRIMARY KEY (SNO) ); ---向订单信息表中插入数据 INSERT INTO t_order VALUES ('1000000', '08300205', '2013-7', '是', '1899'); INSERT INTO t_order VALUES ('1000002', '08300206', '2014-5', '是', '1999'); INSERT INTO t_order VALUES ('1000003', '08300207', '2018-9', '是', '2499'); INSERT INTO t_order VALUES ('1000004', '08080929', '2019-12', '是', '2999'); """ try: cursor.execute(sql) db.commit() except: messagebox.showinfo('警告!', '数据库连接失败!') cursor.close() # 关闭游标 db.close() # 关闭数据库连接 self.create_chufaqi() # 创建触发器 def create_chufaqi(self): db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服务器名,账户,密码,数据库名 cursor = db.cursor() print('建立触发器中......') sql = """ --- 为商品表和订单表创建update触发器 create Trigger tru_goods On t_goods --在Student表中创建触发器 for Update --为什么事件触发 As --事件触发后所要做的事情 IF update(id) BEGIN declare @stuidnew varchar(20) --从临时表Inserted记录新的的学号ID declare @stuidold varchar(20) --从临时表Deleted记录跟新以前旧的的学号ID select @stuidold=id from Deleted select @stuidnew=id from Inserted update t_order set id=@stuidnew where id=@stuidold print @stuidnew print @stuidold end """ try: cursor.execute(sql) db.commit() except: messagebox.showinfo('警告!', '数据库连接失败!') cursor.close() # 关闭游标 db.close() # 关闭数据库连接 self.create_cunchu1() # 创建触发器1 # 创建存储过程1 def create_cunchu1(self): db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服务器名,账户,密码,数据库名 cursor = db.cursor() print('建立存储过程1中......') sql = """ -- 创建删除指定行的存储过程 create procedure proc_delete @商品id varchar(20) as DELETE FROM t_goods WHERE id = @商品id --use EMIS --exec proc_delete 00001 """ try: cursor.execute(sql) db.commit() except: messagebox.showinfo('警告!', '数据库连接失败!') cursor.close() # 关闭游标 db.close() # 关闭数据库连接 self.create_cunchu2() # 创建存储过程2 def create_cunchu2(self): db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服务器名,账户,密码,数据库名 cursor = db.cursor() print('建立存储过程2中......') sql = """ -- 创建查询的存储过程 create procedure proc_cha @name varchar(20) as select * from t_goods where name=@name --use EMIS --exec proc_cha 小米 """ try: cursor.execute(sql) db.commit() messagebox.showinfo('提示', '数据库已成功初始化') except: messagebox.showinfo('警告!', '数据库连接失败!') cursor.close() # 关闭游标 db.close() # 关闭数据库连接 #管理员登陆页面 class AdminPage: def __init__(self, parent_window): parent_window.destroy() # 销毁上一个界面 self.window = tk.Tk() # 初始框的声明 self.window.title('管理员登陆页面') self.window.geometry('450x300+500+100') # 创建画布,这里可以存放照片等组件 canvas = tk.Canvas(self.window, height=200, width=500) image_file = tk.PhotoImage(file='welcome.gif') image = canvas.create_image(0,0, anchor='nw', image=image_file) # 前两个参数为画布得坐标,anchor=nw则是把图片的左上角作为锚定点 canvas.pack(side='top') # 使用pack将画布进行简单得布局,放到了上半部分 # 创建提示信息 tk.Label(self.window, text='登录名: ').place(x=80, y= 150) tk.Label(self.window, text='登陆密码: ').place(x=80, y= 190) self.admin_username = tk.Entry(self.window) self.admin_username.place(x=160, y=150) self.admin_pass = tk.Entry(self.window, show='*') self.admin_pass.place(x=160, y=190) # 登陆和返回首页得按钮 btn_login = tk.Button(self.window, text='登陆', width=10, command=self.login) btn_login.place(x=120, y=230) btn_back = Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back) btn_back.place(x=270, y=230) self.window.mainloop() # 登陆的函数 def login(self): # 数据库操作 查询管理员表 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服务器名,账户,密码,数据库名 cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "SELECT * FROM t_admin where admin_id = '%s'" % (self.admin_username.get()) # 这里得user_name即为admin_id,这里是输入的用户名 try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表,这里是返回的二元元组,如(('id','title'),('id','title')) results = cursor.fetchall() for row in results: admin_id = row[0] admin_pass = row[1] # 打印结果 print("管理员账号为:%s, \n\n管理员密码为:%s" % (admin_id, admin_pass)) except: print("Error: unable to fecth data") messagebox.showinfo('警告!', '用户名或密码不正确!') db.close() # 关闭数据库连接 print("正在登陆管理员管理界面.......") # 判断输入的账号密码与数据库中的信息是否一致a if self.admin_pass.get() == admin_pass: All_admin(self.window) # 进入管理员子菜单操作界面 else: messagebox.showinfo('警告!', '用户名或密码不正确!') # 使得系统点击关闭的x号上返回指定页面,而不是关闭 def back(self): StartPage(self.window) # 显示主窗口 销毁本窗口 # 管理员子菜单操作界面 class All_admin: def __init__(self, parent_window): parent_window.destroy() # 自定销毁上一个界面 self.window = tk.Tk() # 初始框的声明 self.window.title('信息管理界面') self.window.geometry('300x410+500+100') label = Label(self.window, text="请选择需要进行的操作", font=("Verdana", 20)) label.pack(pady=100) # pady=100 界面的长度 Button(self.window, text="商品信息管理", font=tkFont.Font(size=16), width=30, height=2, command=lambda: AdminManage(self.window), fg='white', bg='gray', activebackground='black', activeforeground='white').pack() Button(self.window, text="买家信息管理", font=tkFont.Font(size=16), width=30,height=2, command=lambda:User_AdminManage(self.window), fg='white', bg='gray', activebackground='black', activeforeground='white').pack() Button(self.window, text="订单信息管理", font=tkFont.Font(size=16), width=30, height=2, command=lambda:Buy_AdminManage(self.window), fg='white', bg='gray', activebackground='black', activeforeground='white').pack() self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 self.window.mainloop() # 进入消息循环 def back(self): StartPage(self.window) # 显示主窗口 销毁本窗口 # 商品信息操作界面 class AdminManage: def __init__(self, parent_window): parent_window.destroy() # 自动销毁上一个界面 self.window = Tk() # 初始框的声明 self.window.title('管理员操作界面') self.window.geometry("650x685+300+30") # 初始窗口在屏幕中的位置 self.frame_left_top = tk.Frame(width=300, height=200) # 指定框架,在窗口上可以显示,这里指定四个框架 self.frame_right_top = tk.Frame(width=200, height=200) self.frame_center = tk.Frame(width=500, height=350) self.frame_bottom = tk.Frame(width=650, height=70) # 定义下方中心列表区域 self.columns = ("商品id", "商品名称", "商品价格", "销售数量") self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns) # 添加竖直滚动条 self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview) # 定义树形结构与滚动条 self.tree.configure(yscrollcommand=self.vbar.set) # 定义id1为修改id时的暂存变量,这个是为了更新信息而设计的 self.id1 = 0 # 表格的标题 self.tree.column("商品id", width=150, anchor='center') self.tree.column("商品名称", width=150, anchor='center') self.tree.column("商品价格", width=100, anchor='center') self.tree.column("销售数量", width=100, anchor='center') # grid方法将tree和vbar进行布局 self.tree.grid(row=0, column=0, sticky=NSEW) self.vbar.grid(row=0, column=1, sticky=NS) # 定义几个数组,为中间的那个大表格做一些准备 self.id = [] self.name = [] self.gender = [] self.age = [] # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "SELECT * FROM t_goods" try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: self.id.append(row[0]) self.name.append(row[1]) self.gender.append(row[2]) self.age.append(row[3]) except: messagebox.showinfo('警告!', '数据库连接失败!') db.close()# 关闭数据库连接 print("test***********************") for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))): # 写入数据 self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i])) for col in self.columns: # 绑定函数,使表头可排序(这里的command=lambda _col=col还不是太懂) self.tree.heading(col, text=col, command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) # 定义顶部区域 # 定义左上方区域 self.top_title = Label(self.frame_left_top, text="商品信息:", font=('Verdana', 20)) self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10) # NSEW表示允许组件向4个方向都可以拉伸 # 定义下方区域 self.chaxun = StringVar() self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15)) self.right_bottom_button = ttk.Button(self.frame_bottom, text='商品名称查询', width=20, command=self.put_data) self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20) # 位置设置 self.right_bottom_gender_entry.grid(row=0, column=1) self.left_top_frame = tk.Frame(self.frame_left_top) self.var_id = StringVar() # 声明学号 self.var_name = StringVar() # 声明姓名 self.var_gender = StringVar() # 声明性别 self.var_age = StringVar() # 声明年龄 # 商品id self.right_top_id_label = Label(self.frame_left_top, text="商品id: ", font=('Verdana', 15)) self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15)) self.right_top_id_label.grid(row=1, column=0) self.right_top_id_entry.grid(row=1, column=1) # 商品名称 self.right_top_name_label = Label(self.frame_left_top, text="商品名称:", font=('Verdana', 15)) self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15)) self.right_top_name_label.grid(row=2, column=0) # 位置设置 self.right_top_name_entry.grid(row=2, column=1) # 商品价格 self.right_top_gender_label = Label(self.frame_left_top, text="商品价格:", font=('Verdana', 15)) self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender,font=('Verdana', 15)) self.right_top_gender_label.grid(row=3, column=0) # 位置设置 self.right_top_gender_entry.grid(row=3, column=1) # 销售数量 self.right_top_gender_label = Label(self.frame_left_top, text="销售数量:", font=('Verdana', 15)) self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age, font=('Verdana', 15)) self.right_top_gender_label.grid(row=4, column=0) # 位置设置 self.right_top_gender_entry.grid(row=4, column=1) # 定义右上方区域 self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20)) self.tree.bind('<Button-1>', self.click) # 左键获取位置(tree.bind可以绑定一系列的事件,可以搜索ttk相关参数查看) self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建商品信息', width=20, command=self.new_row) self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新选中商品信息', width=20,command=self.updata_row) self.right_top_button3 = ttk.Button(self.frame_right_top, text='删除选中商品信息', width=20,command=self.del_row) # 定义下方区域,查询功能块 self.chaxun = StringVar() self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15)) self.right_bottom_button = ttk.Button(self.frame_bottom, text='商品名称查询', width=20, command=self.put_data) self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20) # 位置设置 self.right_bottom_gender_entry.grid(row=0, column=1) # 右上角按钮的位置设置 self.right_top_title.grid(row=1, column=0, pady=10) self.right_top_button1.grid(row=2, column=0, padx=20, pady=10) self.right_top_button2.grid(row=3, column=0, padx=20, pady=10) self.right_top_button3.grid(row=4, column=0, padx=20, pady=10) # 整体区域定位,利用了Frame和grid进行布局 self.frame_left_top.grid(row=0, column=0, padx=2, pady=5) self.frame_right_top.grid(row=0, column=1, padx=30, pady=30) self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5) self.frame_bottom.grid(row=2, column=0, columnspan=2) # 设置固定组件,(0)就是将组件进行了固定 self.frame_left_top.grid_propagate(0) self.frame_right_top.grid_propagate(0) self.frame_center.grid_propagate(0) self.frame_bottom.grid_propagate(0) self.frame_left_top.tkraise() # 开始显示主菜单,tkraise()提高z轴的顺序(不太懂) self.frame_right_top.tkraise() # 开始显示主菜单 self.frame_center.tkraise() # 开始显示主菜单 self.frame_bottom.tkraise() # 开始显示主菜单 self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击,执行back方法 self.window.mainloop() # 进入消息循环 # 将查到的信息放到中间的表格中 def put_data(self): self.delButton() # 先将表格内的内容全部清空 # print(self.chaxun.get()) # 输入框内的内容 # 打开数据库连接,准备查找指定的信息 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "use EMIS exec proc_cha '%s'" % (self.chaxun.get()) try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() # 再次进行初始化,进行首行数据的插入 self.id = [] self.name = [] self.gender = [] self.age = [] # 向表格中插入数据 for row in results: self.id.append(row[0]) self.name.append(row[1]) self.gender.append(row[2]) self.age.append(row[3]) except: print("Error: unable to fetch data") messagebox.showinfo('警告!', '数据库连接失败!') db.close()# 关闭数据库连接 print("进行数据的插入") for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))): # 写入数据 self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i])) for col in self.columns: # 绑定函数,使表头可排序 self.tree.heading(col, text=col, command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) # 清空表格中的所有信息 def delButton(self): x=self.tree.get_children() for item in x: self.tree.delete(item) # 在表格上的点击事件,这里是作用就是一点击表格就可以将信息直接写到左上角的框框中 def click(self, event): self.col = self.tree.identify_column(event.x) # 通过tree.identify_column()函数可以直接获取到列 self.row = self.tree.identify_row(event.y) # 行 print(self.col) print(self.row) self.row_info = self.tree.item(self.row, "values") self.var_id.set(self.row_info[0]) self.id1 = self.var_id.get() self.var_name.set(self.row_info[1]) self.var_gender.set(self.row_info[2]) self.var_age.set(self.row_info[3]) self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id, font=('Verdana', 15)) # 点击中间的表格的表头,可以将那一列进行排序 def tree_sort_column(self, tv, col, reverse): # Treeview、列名、排列方式 l = [(tv.set(k, col), k) for k in tv.get_children('')] l.sort(reverse=reverse) # 排序方式 for index, (val, k) in enumerate(l): # 根据排序后索引移动 tv.move(k, '', index) tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题 def new_row(self): print('123') print(self.var_id.get()) print(self.id) if str(self.var_id.get()) in self.id: messagebox.showinfo('警告!', '该商品已存在!') else: if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '': # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "INSERT INTO t_goods(id, name, gender, age) \ VALUES ('%s', '%s', '%s', '%s')" % \ (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get()) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '数据库连接失败!') db.close() # 关闭数据库连接 self.id.append(self.var_id.get()) self.name.append(self.var_name.get()) self.gender.append(self.var_gender.get()) self.age.append(self.var_age.get()) self.tree.insert('', len(self.id) - 1, values=( self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1], self.age[len(self.id) - 1])) self.tree.update() messagebox.showinfo('提示!', '插入成功!') else: messagebox.showinfo('警告!', '请填写商品信息') def updata_row(self): res = messagebox.askyesnocancel('警告!', '是否更新所填数据?') if res == True: # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "UPDATE t_goods SET id = '%s', name = '%s', gender = '%s', age = '%s' where id = '%s'" % (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.id1) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 messagebox.showinfo('提示!', '更新成功!') except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '更新失败,数据库连接失败!') db.close() # 关闭数据库连接 id_index = self.id.index(self.row_info[0]) self.name[id_index] = self.var_name.get() self.gender[id_index] = self.var_gender.get() self.age[id_index] = self.var_age.get() self.tree.item(self.tree.selection()[0], values=( self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get())) # 修改对于行信息 # 删除行 def del_row(self): res = messagebox.askyesnocancel('警告!', '是否删除所选数据?') if res == True: print(self.row_info[0]) # 鼠标选中的学号 print(self.tree.selection()[0]) # 行号 print(self.tree.get_children()) # 所有行 # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "use EMIS exec proc_delete '%s'" % (self.row_info[0]) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 messagebox.showinfo('提示!', '删除成功!') except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '删除失败,数据库连接失败!') db.close() # 关闭数据库连接 id_index = self.id.index(self.row_info[0]) print(id_index) del self.id[id_index] del self.name[id_index] del self.gender[id_index] del self.age[id_index] print(self.id) self.tree.delete(self.tree.selection()[0]) # 删除所选行 print(self.tree.get_children()) def back(self): All_admin(self.window) # 进入管理员子菜单操作界面 # 买家信息操作界面 class User_AdminManage: def __init__(self, parent_window): parent_window.destroy() # 销毁主界面 self.window = Tk() # 初始框的声明 self.window.title('管理员操作界面') self.window.geometry("650x685+300+30") # 初始窗口在屏幕中的位置 self.frame_left_top = tk.Frame(width=300, height=200) self.frame_right_top = tk.Frame(width=200, height=200) self.frame_center = tk.Frame(width=500, height=350) self.frame_bottom = tk.Frame(width=650, height=70) self.id1 = 0 # 定义下方中心列表区域 self.columns = ("订单id", "购买者姓名", "购买数量", "收货地址") self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns) self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview) # 定义树形结构与滚动条 self.tree.configure(yscrollcommand=self.vbar.set) # 表格的标题 self.tree.column("订单id", width=150, anchor='center') # 表示列,不显示 self.tree.column("购买者姓名", width=150, anchor='center') self.tree.column("购买数量", width=100, anchor='center') self.tree.column("收货地址", width=100, anchor='center') # 调用方法获取表格内容插入 self.tree.grid(row=0, column=0, sticky=NSEW) self.vbar.grid(row=0, column=1, sticky=NS) self.id = [] self.name = [] self.gender = [] self.age = [] # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "SELECT * FROM t_buyer" # SQL 查询语句 try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: self.id.append(row[0]) self.name.append(row[1]) self.gender.append(row[2]) self.age.append(row[3]) except: print("Error: unable to fetch data") messagebox.showinfo('警告!', '数据库连接失败!') db.close()# 关闭数据库连接 print("test***********************") for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))): # 写入数据 self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i])) for col in self.columns: # 绑定函数,使表头可排序 self.tree.heading(col, text=col, command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) # 定义顶部区域 # 定义左上方区域 self.top_title = Label(self.frame_left_top, text="商品信息:", font=('Verdana', 20)) self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10) self.left_top_frame = tk.Frame(self.frame_left_top) self.var_id = StringVar() # 声明学号 self.var_name = StringVar() # 声明姓名 self.var_gender = StringVar() # 声明性别 self.var_age = StringVar() # 声明年龄 # 学号 self.right_top_id_label = Label(self.frame_left_top, text="订单id: ", font=('Verdana', 15)) self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15)) self.right_top_id_label.grid(row=1, column=0) # 位置设置 self.right_top_id_entry.grid(row=1, column=1) # 姓名 self.right_top_name_label = Label(self.frame_left_top, text="购买者姓名:", font=('Verdana', 15)) self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15)) self.right_top_name_label.grid(row=2, column=0) # 位置设置 self.right_top_name_entry.grid(row=2, column=1) # 性别 self.right_top_gender_label = Label(self.frame_left_top, text="购买数量:", font=('Verdana', 15)) self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender, font=('Verdana', 15)) self.right_top_gender_label.grid(row=3, column=0) # 位置设置 self.right_top_gender_entry.grid(row=3, column=1) # 年龄 self.right_top_gender_label = Label(self.frame_left_top, text="收货地址:", font=('Verdana', 15)) self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age, font=('Verdana', 15)) self.right_top_gender_label.grid(row=4, column=0) # 位置设置 self.right_top_gender_entry.grid(row=4, column=1) # 定义右上方区域 self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20)) self.tree.bind('<Button-1>', self.click) # 左键获取位置 self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建商品信息', width=20, command=self.new_row) self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新选中商品信息', width=20,command=self.updata_row) self.right_top_button3 = ttk.Button(self.frame_right_top, text='删除选中商品信息', width=20,command=self.del_row) # 定义下方区域 self.chaxun = StringVar() self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15)) self.right_bottom_button = ttk.Button(self.frame_bottom, text='买家姓名查询', width=20, command=self.put_data) self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20) # 位置设置 self.right_bottom_gender_entry.grid(row=0, column=1) # 位置设置 self.right_top_title.grid(row=1, column=0, pady=10) self.right_top_button1.grid(row=2, column=0, padx=20, pady=10) self.right_top_button2.grid(row=3, column=0, padx=20, pady=10) self.right_top_button3.grid(row=4, column=0, padx=20, pady=10) # 整体区域定位 self.frame_left_top.grid(row=0, column=0, padx=2, pady=5) self.frame_right_top.grid(row=0, column=1, padx=30, pady=30) self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5) self.frame_bottom.grid(row=2, column=0, columnspan=2) self.frame_left_top.grid_propagate(0) self.frame_right_top.grid_propagate(0) self.frame_center.grid_propagate(0) self.frame_bottom.grid_propagate(0) self.frame_left_top.tkraise() # 开始显示主菜单 self.frame_right_top.tkraise() # 开始显示主菜单 self.frame_center.tkraise() # 开始显示主菜单 self.frame_bottom.tkraise() # 开始显示主菜单 self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 self.window.mainloop() # 进入消息循环 # 将查到的信息放到中间的表格中 def put_data(self): self.delButton() # 先将表格内的内容全部清空 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "SELECT * FROM t_buyer where NAME = '%s'" % (self.chaxun.get()) try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() # 再次进行初始化,进行首行数据的插入 self.id = [] self.name = [] self.gender = [] self.age = [] # 向表格中插入数据 for row in results: self.id.append(row[0]) self.name.append(row[1]) self.gender.append(row[2]) self.age.append(row[3]) except: print("Error: unable to fetch data") messagebox.showinfo('警告!', '数据库连接失败!') db.close()# 关闭数据库连接 print("进行数据的插入") for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))): # 写入数据 self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i])) for col in self.columns: # 绑定函数,使表头可排序 self.tree.heading(col, text=col, command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) # 清空表格中的所有信息 def delButton(self): x=self.tree.get_children() for item in x: self.tree.delete(item) def back(self): All_admin(self.window) # 进入管理员子菜单操作界面 def click(self, event): self.col = self.tree.identify_column(event.x) # 列 self.row = self.tree.identify_row(event.y) # 行 print(self.col) print(self.row) self.row_info = self.tree.item(self.row, "values") self.var_id.set(self.row_info[0]) self.id1 = self.var_id.get() print(self.id1) self.var_name.set(self.row_info[1]) self.var_gender.set(self.row_info[2]) self.var_age.set(self.row_info[3]) self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id, font=('Verdana', 15)) # 排序的方法 def tree_sort_column(self, tv, col, reverse): # Treeview、列名、排列方式 l = [(tv.set(k, col), k) for k in tv.get_children('')] l.sort(reverse=reverse) # 排序方式 # rearrange items in sorted positions for index, (val, k) in enumerate(l): # 根据排序后索引移动 tv.move(k, '', index) tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题 # 插入方法 def new_row(self): if str(self.var_id.get()) in self.id: messagebox.showinfo('警告!', '该商品已存在!') else: if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '': # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "INSERT INTO t_buyer(SNO, NAME, NUMBER, dizhi) \ VALUES ('%s', '%s', '%s', '%s')" % \ (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get()) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '数据库连接失败!') db.close() # 关闭数据库连接 # 将信息写入到表格中 self.id.append(self.var_id.get()) self.name.append(self.var_name.get()) self.gender.append(self.var_gender.get()) self.age.append(self.var_age.get()) self.tree.insert('', len(self.id) - 1, values=(self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1], self.age[len(self.id) - 1])) self.tree.update() messagebox.showinfo('提示!', '插入成功!') else: messagebox.showinfo('警告!', '请填写商品信息') # 更新数据及表格 def updata_row(self): res = messagebox.askyesnocancel('警告!', '是否更新所填数据?') if res == True: # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "UPDATE t_buyer SET SNO = '%s', NAME = '%s', NUMBER = '%s', dizhi = '%s' \ where SNO = '%s'" % (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.id1) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 messagebox.showinfo('提示!', '更新成功!') except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '更新失败,数据库连接失败!') db.close() # 关闭数据库连接 id_index = self.id.index(self.row_info[0]) self.name[id_index] = self.var_name.get() self.gender[id_index] = self.var_gender.get() self.age[id_index] = self.var_age.get() self.tree.item(self.tree.selection()[0], values=( self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get())) # 修改对于行信息 # 删除行 def del_row(self): res = messagebox.askyesnocancel('警告!', '是否删除所选数据?') if res == True: print(self.row_info[0]) # 鼠标选中的学号 print(self.tree.selection()[0]) # 行号 print(self.tree.get_children()) # 所有行 # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "DELETE FROM t_buyer WHERE SNO = '%s'" % (self.row_info[0]) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 messagebox.showinfo('提示!', '删除成功!') except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '删除失败,数据库连接失败!') db.close() # 关闭数据库连接 id_index = self.id.index(self.row_info[0]) print(id_index) del self.id[id_index] del self.name[id_index] del self.gender[id_index] del self.age[id_index] print(self.id) self.tree.delete(self.tree.selection()[0]) # 删除所选行 print(self.tree.get_children()) # 订单信息操作界面 class Buy_AdminManage: def __init__(self, parent_window): parent_window.destroy() # 销毁主界面 self.window = Tk() # 初始框的声明 self.window.geometry("650x720+300+30") # 初始窗口在屏幕中的位置 self.window.title('管理员操作界面') self.frame_left_top = tk.Frame(width=300, height=230) self.frame_right_top = tk.Frame(width=200, height=230) self.frame_center = tk.Frame(width=500, height=360) self.frame_bottom = tk.Frame(width=650, height=60) self.id1 = 0 # 定义下方中心列表区域 self.columns = ("商品id", "订单id", "订单创建时间", "是否成功交易", "交易金额") self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns) self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview) # 定义树形结构与滚动条 self.tree.configure(yscrollcommand=self.vbar.set) # 表格的标题 self.tree.column("商品id", width=100, anchor='center') # 表示列,不显示 self.tree.column("订单id", width=100, anchor='center') self.tree.column("订单创建时间", width=100, anchor='center') self.tree.column("是否成功交易", width=100, anchor='center') self.tree.column("交易金额", width=100, anchor='center') # 调用方法获取表格内容插入 self.tree.grid(row=0, column=0, sticky=NSEW) self.vbar.grid(row=0, column=1, sticky=NS) self.SNO = [] self.SNAME = [] self.SSEX = [] self.AGE = [] self.DEP = [] # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "SELECT * FROM t_order" # SQL 查询语句 try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: self.SNO.append(row[0]) self.SNAME.append(row[1]) self.SSEX.append(row[2]) self.AGE.append(row[3]) self.DEP.append(row[4]) except: print("Error: unable to fetch data") messagebox.showinfo('警告!', '数据库连接失败!') db.close()# 关闭数据库连接 print("test***********************") for i in range(min(len(self.SNO), len(self.SNAME), len(self.SSEX), len(self.AGE), len(self.DEP))): # 写入数据 self.tree.insert('', i, values=(self.SNO[i], self.SNAME[i], self.SSEX[i], self.AGE[i], self.DEP[i])) for col in self.columns: # 绑定函数,使表头可排序 self.tree.heading(col, text=col, command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) # 定义顶部区域 # 定义左上方区域 self.top_title = Label(self.frame_left_top, text="订单信息:", font=('Verdana', 20)) self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10) self.left_top_frame = tk.Frame(self.frame_left_top) self.var_id = StringVar() # 声明商品id self.var_name = StringVar() # 声明订单id self.var_gender = StringVar() # 声明订单创建时间 self.var_age = StringVar() # 声明订单是否成功交易 self.var_dep = StringVar() # 声明交易金额 self.right_top_id_label = Label(self.frame_left_top, text="商品id: ", font=('Verdana', 15)) self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15)) self.right_top_id_label.grid(row=1, column=0) # 位置设置 self.right_top_id_entry.grid(row=1, column=1) self.right_top_name_label = Label(self.frame_left_top, text="订单id:", font=('Verdana', 15)) self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15)) self.right_top_name_label.grid(row=2, column=0) # 位置设置 self.right_top_name_entry.grid(row=2, column=1) self.right_top_gender_label = Label(self.frame_left_top, text="创建时间:", font=('Verdana', 15)) self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender,font=('Verdana', 15)) self.right_top_gender_label.grid(row=3, column=0) # 位置设置 self.right_top_gender_entry.grid(row=3, column=1) self.right_top_gender_label = Label(self.frame_left_top, text="是否成功交易:", font=('Verdana', 15)) self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age,font=('Verdana', 15)) self.right_top_gender_label.grid(row=4, column=0) # 位置设置 self.right_top_gender_entry.grid(row=4, column=1) self.right_top_gender_label = Label(self.frame_left_top, text="交易金额:", font=('Verdana', 15)) self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_dep, font=('Verdana', 15)) self.right_top_gender_label.grid(row=5, column=0) # 位置设置 self.right_top_gender_entry.grid(row=5, column=1) # 定义右上方区域 self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20)) self.tree.bind('<Button-1>', self.click) # 左键获取位置 self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建订单信息', width=20, command=self.new_row) self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新选中订单信息', width=20,command=self.updata_row) self.right_top_button3 = ttk.Button(self.frame_right_top, text='删除选中订单信息', width=20,command=self.del_row) # 定义下方区域 self.chaxun = StringVar() self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15)) self.right_bottom_button = ttk.Button(self.frame_bottom, text='订单id查询', width=20, command=self.put_data) self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20) # 位置设置 self.right_bottom_gender_entry.grid(row=0, column=1) # 位置设置 self.right_top_title.grid(row=1, column=0, pady=10) self.right_top_button1.grid(row=2, column=0, padx=20, pady=10) self.right_top_button2.grid(row=3, column=0, padx=20, pady=10) self.right_top_button3.grid(row=4, column=0, padx=20, pady=10) # 整体区域定位 self.frame_left_top.grid(row=0, column=0, padx=2, pady=5) self.frame_right_top.grid(row=0, column=1, padx=30, pady=30) self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5) self.frame_bottom.grid(row=2, column=0, columnspan=2) self.frame_left_top.grid_propagate(0) self.frame_right_top.grid_propagate(0) self.frame_center.grid_propagate(0) self.frame_bottom.grid_propagate(0) self.frame_left_top.tkraise() # 开始显示主菜单 self.frame_right_top.tkraise() # 开始显示主菜单 self.frame_center.tkraise() # 开始显示主菜单 self.frame_bottom.tkraise() # 开始显示主菜单 self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 self.window.mainloop() # 进入消息循环 def back(self): All_admin(self.window) # 进入管理员子菜单操作界面 # 将查到的信息放到中间的表格中 def put_data(self): self.delButton() # 先将表格内的内容全部清空 # print(self.chaxun.get()) # 输入框内的内容 # 打开数据库连接,准备查找指定的信息 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "SELECT * FROM t_order where SNO = '%s'" % (self.chaxun.get()) try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() # 再次进行初始化,进行首行数据的插入 self.SNO = [] self.SNAME = [] self.SSEX = [] self.AGE = [] self.DEP = [] # 向表格中插入数据 for row in results: self.SNO.append(row[0]) self.SNAME.append(row[1]) self.SSEX.append(row[2]) self.AGE.append(row[3]) self.DEP.append(row[4]) except: print("Error: unable to fetch data") messagebox.showinfo('警告!', '数据库连接失败!') db.close()# 关闭数据库连接 for i in range(min(len(self.SNO), len(self.SNAME), len(self.SSEX), len(self.AGE), len(self.DEP))): # 写入数据 self.tree.insert('', i, values=(self.SNO[i], self.SNAME[i], self.SSEX[i], self.AGE[i], self.DEP[i])) for col in self.columns: # 绑定函数,使表头可排序 self.tree.heading(col, text=col, command=lambda _col=col: self.tree_sort_column(self.tree, _col, False)) # 清空表格中的所有信息 def delButton(self): x=self.tree.get_children() for item in x: self.tree.delete(item) def click(self, event): self.col = self.tree.identify_column(event.x) # 列 self.row = self.tree.identify_row(event.y) # 行 print(self.col) print(self.row) self.row_info = self.tree.item(self.row, "values") self.var_id.set(self.row_info[0]) self.id1 = self.var_id.get() print(self.id1) self.var_name.set(self.row_info[1]) self.var_gender.set(self.row_info[2]) self.var_age.set(self.row_info[3]) self.var_dep.set(self.row_info[4]) self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id, font=('Verdana', 15)) print('') def tree_sort_column(self, tv, col, reverse): # Treeview、列名、排列方式 l = [(tv.set(k, col), k) for k in tv.get_children('')] l.sort(reverse=reverse) # 排序方式 # rearrange items in sorted positions for index, (val, k) in enumerate(l): # 根据排序后索引移动 tv.move(k, '', index) tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题 def new_row(self): print(self.var_id.get()) print(self.SNO) if str(self.var_id.get()) in self.SNO: messagebox.showinfo('警告!', '该商品已存在!') else: if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '' and self.var_dep.get() != '': # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "INSERT INTO t_order(id, SNO, buy_time, vic, buy_money) \ VALUES ('%s', '%s', '%s', '%s', '%s')" % \ (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_dep.get()) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '数据库连接失败!') db.close() # 关闭数据库连接 self.SNO.append(self.var_id.get()) self.SNAME.append(self.var_name.get()) self.SSEX.append(self.var_gender.get()) self.AGE.append(self.var_age.get()) self.DEP.append(self.var_dep.get()) self.tree.insert('', len(self.SNO) - 1, values=( self.SNO[len(self.SNO) - 1], self.SNAME[len(self.SNO) - 1], self.SSEX[len(self.SNO) - 1], self.AGE[len(self.SNO) - 1], self.DEP[len(self.SNO) - 1])) self.tree.update() messagebox.showinfo('提示!', '插入成功!') else: messagebox.showinfo('警告!', '请填写订单信息') def updata_row(self): res = messagebox.askyesnocancel('警告!', '是否更新所填数据?') if res == True: # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "UPDATE t_order SET id = '%s', SNO = '%s', buy_time = '%s', vic = '%s', buy_money = '%s' \ where id = '%s'" % (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_dep.get(), self.id1) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 messagebox.showinfo('提示!', '更新成功!') except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '更新失败,数据库连接失败!') db.close() # 关闭数据库连接 id_index = self.SNO.index(self.row_info[0]) self.SNO[id_index] = self.var_name.get() self.SSEX[id_index] = self.var_gender.get() self.AGE[id_index] = self.var_age.get() self.DEP[id_index] = self.var_age.get() self.tree.item(self.tree.selection()[0], values=( self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_dep.get())) # 修改对于行信息 # 删除行 def del_row(self): res = messagebox.askyesnocancel('警告!', '是否删除所选数据?') if res == True: print(self.row_info[0]) # 鼠标选中的学号 print(self.tree.selection()[0]) # 行号 print(self.tree.get_children()) # 所有行 # 打开数据库连接 db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') cursor = db.cursor() # 使用cursor()方法获取操作游标 sql = "DELETE FROM t_order WHERE id = '%s'" % (self.row_info[0]) # SQL 插入语句 try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 messagebox.showinfo('提示!', '删除成功!') except: db.rollback() # 发生错误时回滚 messagebox.showinfo('警告!', '删除失败,数据库连接失败!') db.close() # 关闭数据库连接 id_index = self.SNO.index(self.row_info[0]) print(id_index) del self.SNO[id_index] del self.SNAME[id_index] del self.SSEX[id_index] del self.AGE[id_index] del self.DEP[id_index] print(self.SNO) self.tree.delete(self.tree.selection()[0]) # 删除所选行 print(self.tree.get_children()) # About页面 class AboutPage: def __init__(self, parent_window): parent_window.destroy() # 销毁主界面 self.window = tk.Tk() # 初始框的声明 self.window.title('关于') self.window.geometry('300x450') # 这里的乘是小x label = tk.Label(self.window, text='商品信息管理系统', bg='green', font=('Verdana', 20), width=30, height=2) label.pack() Label(self.window, text='作者:TAF_MT', font=('Verdana', 18)).pack(pady=30) Label(self.window, text='联系:**********', font=('Verdana', 18)).pack(pady=5) Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack(pady=100) self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角关闭点击 self.window.mainloop() # 进入消息循环 def back(self): StartPage(self.window) # 显示主窗口 销毁本窗口 if __name__ == '__main__': # 实例化Application window = tk.Tk() StartPage(window)
演示:
github地址: 点我参考链接: 大佬的博文
更多相关内容 -
商品信息管理系统(Java实现+MySQL 数据库)
2019-12-20 00:42:04这是本人在做课程设计的时候写的用Java实现商品信息管理系统的代码,具体信息请看本人博客,博客地址https://blog.csdn.net/vegetable_haker/article/details/102556311,其中MySQL数据库需要根据本地配置做些修改 ... -
JAVA实现商品信息管理系统
2019-10-14 20:43:56超市商品管理系统 题目要求 超市中商品分为四类,分别是食品、化妆品、日用品和饮料。每种商品都包含商品名称、价格、库存量和生产厂家、品牌等信息。 主要完成对商品的销售、统计和简单管理。 这个题目相对简单...超市商品管理系统
点此下载源码
题目要求
超市中商品分为四类,分别是食品、化妆品、日用品和饮料。每种商品都包含商品名称、价格、库存量和生产厂家、品牌等信息。主要完成对商品的销售、统计和简单管理。这个题目相对简单,可以用一张表实现信息的保存和处理,因此不再给出数据库设计参考。
功能要求
(1)销售功能。
购买商品时,先输入类别,然后输入商品名称,并在库存中查找该商品的相关信息。如果有库存量,输入购买的数量,进行相应计算。如果库存量不够,给出提示信息,结束购买。
(2)商品简单管理功能。
添加功能:主要完成商品信息的添加。
查询功能:可按商品类别、商品名称、生产厂家进行查询。若存在相应信息,输出所查询的信息,若不存在该记录,则提示“该记录不存在!”。
修改功能:可根据查询结果对相应的记录进行修改。
删除功能:主要完成商品信息的删除。先输入商品类别,再输入要删除的商品名称,根据查询结果删除该物品的记录,如果该商品不在物品库中,则提示“该商品不存在”。
(3)统计功能。
输出当前库存中所有商品的总数及详细信息;可按商品的价格、库存量、生产厂家进行统计,输出统计信息时,要按从大到小进行排序。
(7)商品信息存盘:将当前程序中的商品信息存入文件中。
(8)读出信息:从文件中将商品信息读入程序。问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;设计思路
可以对超市商品进行管理的人员主要有超市的商家和顾客,商家可以对超市的商品进行增﹑删﹑改﹑查操作,而顾客只能查询和购买商品。增加商品时,要添加商品的全部信息(编号﹑类别﹑名称﹑价格﹑库存量﹑品牌﹑生产厂家),删除时只需要输入商品编号便可删除该商品的全部信息,修改时要先输入商品编号,然后再确定要修改该商品的哪一个值,以及要将该值修改为什么,查询时只要输入想要查询商品的任意一个信息并选择商品类别便可查出该商品的全部信息。
实现:
建立并连接数据库与基本表
连接数据库时需要用到JDBC,它由Java编程语言编写的类和接口组成,是实现Java与各种数据库连接的关键,提供了将Java与数据库连接起来的程序接口,使用户可以以SQL的形式编写访问请求,然后传给数据库,其结果再由这一接口返回,从而实现对数据库中数据操作的目的。超市商品管理系统采用了MySQL作为数据库,所建的系统数据库名为“goods”。通过需求分析、概念设计与逻辑设计,可知该系统数据库只需建立一个商品表即可
结构设计
该系统用于对商品的基本信息进行管理,主要包括添加、修改、查询和删除商品基本信息,为了方便,全部操作均在界面中完成。由此,将该系统结构设计为登录模块、顾客模块、商家模块。由于涉及界面设计,因此调用了java.awt.、java.awt.event.、javax.swing.、java.util.、javax.swing.event.*、java.sql.*等包。
实现登录模块
要生成一个界面,可应用AWT知识。设置其名字为商品信息管理系统;设置布局管理器为(null)布局管理器,方便往其中放组件;设置窗口大小和位置,还要设置窗口可见性。
生成界面后,接下来就需要实现每个功能,第一个功能就是要对操作对象的身份进行选择,这里要用下拉列表的形式进行选择,也可以用单选按钮来完成这个功能。在这项功能中,首先要选择身份,所以要定义一个JLabel来说明,定义完JLabel后,就需要定义一个JComoBox,下拉列表框。
输入用户名和密码。需要用两个JLabel来指明需要输入用户名和密码。输入用户名需要定义一个JTextField,单文本框。同时输入文本,但输入密码和输入用户名是不一样的,它需要定义成JPasswordField,它的输出结果为“*****”这样的形式。
创建两个按钮,一个是登录按钮,另一个是取消登录按钮,用来输入的用户名和密码及选择的身份进行提交,然后根据选择的身份来选择需要进入那个界面,其代码如下:public class info_Manage extends JFrame implements ActionListener{ private JLabel username = new JLabel("用户名"); private JTextField userName = new JTextField(); private JLabel psw = new JLabel("密码"); private JPasswordField Psw = new JPasswordField(); JLabel jlp=new JLabel("身份"); String str[]={"顾客","商家"}; JComboBox jcb=new JComboBox(str); private JButton jb1 = new JButton("登录"); private JButton jb2 = new JButton("取消"); public info_Manage(){ this.setTitle("商品信息管理系统"); this.setLayout(null); username.setBounds(100,50,100,20); this.add(username); userName.setBounds(150,50,100,20); this.add(userName); psw.setBounds(100,100,100,20); this.add(psw); Psw.setBounds(150,100,100,20); this.add(Psw); jlp.setBounds(100,150,100,20); this.add(jlp); jcb.setBounds(150,150,100,20); this.add(jcb); jcb.addActionListener(this); jb1.setBounds(100,210,60,20); this.add(jb1); jb1.addActionListener(this); jb2.setBounds(200,210,60,20); this.add(jb2); jb2.addActionListener(this); this.setVisible(true); this.setBounds(10,10,390,330); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new info_Manage(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == jb1) { String name=userName.getText(); String password = new String(Psw.getPassword()); if(name.length()==0&&password.length()!=0) JOptionPane.showMessageDialog( null, "请输入用户名"); else if(name.length()!=0&&password.length()==0) JOptionPane.showMessageDialog( null, "请输入密码"); else if(name.length()==0&&name.length()==0) JOptionPane.showMessageDialog( null, "请输入用户名和密码"); else if(jcb.getSelectedIndex()==0&&name.length()!=0&&name.length()!=0) new custom_Manage(); else if(jcb.getSelectedIndex()==1&&name.length()!=0&&password.length()!=0) new seller_Manage(); } else if(e.getSource()==jb2) System.exit(0); } }
运行结果
实现顾客操作界面
当选择“顾客”时,单击“登录”按钮就可以进入顾客操作系统了,然后就可以对摸个学生的信息进行输入、修改和删除,也能对同学的信息进行查询和对程序进行查询。当打算离开时,还要有一个选项用来退出学生信息管理系统。根据设计构想,首先要搭建一个界面,然后把顾客的操作分为2大块,分别是商品信息查询和退出登录,其部分代码如下:
class custom_Manage extends JFrame implements ActionListener{ JMenu cm=new JMenu("请选择您需要的操作:"); JButton cm1=new JButton("商品信息查询"); JButton cm2=new JButton("退出登录"); public void actionPerformed(ActionEvent e){ if(e.getSource()==cm1)new SetGoods(); else if(e.getSource()==cm2) this.setVisible(false); } }
运行结果
商家操作界面相比顾客操作界面多了商品信息的增加﹑删除和修改功能,其实现方法与顾客操作界面类似,在此不再赘述。添加商品信息
每个按钮都对应着一个操作界面,当点击商家操作下的“增加商品信息”按钮时,将弹出如图所示的界面,它调用了AddGoods.java类实现该功能。通过对“增加信息”这一子菜单设置监听,弹出界面。AddGoods.java的部分代码如下:
class AddGoods extends JFrame implements ActionListener { JLabel JL = new JLabel("添加基本信息:"); JLabel number = new JLabel("商品编号"); JTextField Number = new JTextField(); JLabel JClass=new JLabel("类别"); String str[]={"食品","化妆品","日用品","饮料"}; JComboBox jcb=new JComboBox(str); JLabel name = new JLabel("商品名称"); JTextField Name = new JTextField(); JLabel price=new JLabel("商品价格"); JTextField Price = new JTextField(); JLabel storage= new JLabel("库存量"); JTextField Storage = new JTextField(); JLabel brand= new JLabel("品牌"); JTextField Brand = new JTextField(); JLabel vender = new JLabel("生产厂家"); JTextField Vender = new JTextField(); JTextField jt=new JTextField(10); JButton Add = new JButton("添加"); JButton Reset = new JButton("重置"); JButton Exit = new JButton("退出"); String sql = ""; public void actionPerformed(ActionEvent e) { if(e.getSource()==Add) { String snumber=Number.getText(); String svender=Vender.getText(); String sname=Name.getText(); String sprice=Price.getText(); String sstorage=Storage.getText(); String sbrand=Brand.getText(); try { Connection cot=ConnectionFactory.getConnection(); Statement stm=cot.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE ,ResultSet.CONCUR_UPDATABLE ); int s=jcb.getSelectedIndex(); String jc=null; if(s==0)jc="食品"; else if(s==1)jc="化妆品"; else if(s==2)jc="日用品"; else if(s==3)jc="饮料"; sql="insert into goods values('"+snumber+"','"+jc+"','"+sname+"',"+sprice+","+sstorage+",'"+sbrand+"','"+svender+"')"; int n=stm.executeUpdate(sql); if(n!=0)JOptionPane.showMessageDialog(null,"添加成功!"); else JOptionPane.showMessageDialog(null,"该商品已存在!"); }catch(Exception ee) { ee.printStackTrace(); } } if(e.getSource()==Reset) { Number.setText(null); Name.setText(null); Vender.setText(null); Price.setText(null); Storage.setText(null); Brand.setText(null); } if(e.getSource()==Exit) { this.setVisible(false); } } }
运行结果
删除商品信息
当选择商家操作系统下的删除商品信息的按钮时,将弹出图4-4所示的界面,它调用了DeleteGoodst.java类实现该功能,其部分代码如下:
class DeleteGoods extends JFrame implements ActionListener { JMenu JL = new JMenu("删除基本信息"); JLabel number = new JLabel("商品编号"); JTextField Number = new JTextField(); JButton Del = new JButton("删除"); JButton Reset = new JButton("重置"); JButton Exit = new JButton("退出"); String sql = ""; public void actionPerformed(ActionEvent e) { if (e.getSource() == Del) { Statement stm=null; Connection cot; try { cot=ConnectionFactory.getConnection(); stm= cot.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE ,ResultSet.CONCUR_UPDATABLE ); sql ="delete from goods where number='"+Number.getText()+"'"; int n = stm.executeUpdate(sql); if (n!=0) JOptionPane.showMessageDialog(null, "删除成功!"); else JOptionPane.showMessageDialog(null, "删除失败!"); } catch (SQLException e1) { JOptionPane.showMessageDialog(null, "此商品不存在!"); e1.printStackTrace(); } } if (e.getSource() == Reset) { Number.setText(null); } if (e.getSource() == Exit) this.setVisible(false); } }
如图,只需输入商品编号便可删除该商品的全部信息。
修改商品信息
当选择商家操作系统下的“修改信息”按钮时,将弹出界面,只要输入商品的编号,然后选择所要修改的该编号商品的列名,最后输入想要将其修改成为的值,即可修改该商品的某一项信息。用了GetGoods.java类实现该功能。其部分代码如下:
class GetGoods extends JFrame implements ActionListener{ JLabel JL = new JLabel("修改商品信息", JLabel.CENTER); JLabel number = new JLabel("请输入您要修改的商品编号"); JTextField Number = new JTextField(); JLabel massage = new JLabel("请输入您要修改的商品信息"); JTextField Massage = new JTextField(); JLabel afterget=new JLabel("您想要将该列信息修改为:"); JTextField Afterget = new JTextField(); JTextField jt=new JTextField(10); JButton Get = new JButton("修改"); JButton Reset = new JButton("重置"); JButton Exit = new JButton("退出"); String sql = ""; public void actionPerformed(ActionEvent e){ if(e.getSource()==Get){ Statement stm=null; Connection cot; try{ cot=ConnectionFactory.getConnection(); stm=cot.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE ,ResultSet.CONCUR_UPDATABLE ); sql="update goods set "+Massage.getText()+"='"+Afterget.getText()+"' where number='"+Number.getText()+"'"; int n=stm.executeUpdate(sql); if(n!=0)JOptionPane.showMessageDialog(null,"修改成功!"); else JOptionPane.showMessageDialog(null,"修改失败!"); }catch(Exception er){ er.printStackTrace(); } } if(e.getSource()==Reset){ Number.setText(null); Massage.setText(null); Afterget.setText(null); } if(e.getSource()==Exit) { this.setVisible(false); } } }
运行结果
查询商品信息
当选择顾客或者商家操作系统下的“查询商品信息”按钮时,将弹出如图所示的界面,它调用了SetGoods.java类实现该功能,部分代码如下:
class SetGoods extends JFrame implements ActionListener { JLabel JL = new JLabel("请用以下任意一种方式查询您想要的东西", JLabel.CENTER); JLabel number = new JLabel("商品编号"); JTextField Number = new JTextField(); JLabel JClass=new JLabel("类别"); String str[]={"无","食品","化妆品","日用品","饮料"}; JComboBox jcb=new JComboBox(str); JLabel name = new JLabel("商品名称"); JTextField Name = new JTextField(); JLabel price=new JLabel("商品价格"); JTextField Price = new JTextField(); JLabel brand= new JLabel("品牌"); JTextField Brand = new JTextField(); JLabel vender = new JLabel("生产厂家"); JTextField Vender = new JTextField(); JTextField jt=new JTextField(10); JButton Set = new JButton("查询"); JButton purchase = new JButton("购买"); JButton Reset = new JButton("重置"); JButton Exit = new JButton("退出"); String sql = ""; public void actionPerformed(ActionEvent e) { if (e.getSource() == Set) { Statement stm=null; Connection cot; try{ cot=ConnectionFactory.getConnection(); stm=cot.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE ,ResultSet.CONCUR_UPDATABLE ); if(Number.getText()!=null) sql="select * from goods where number='"+Number.getText()+"'"; else if(Name.getText()!=null) sql="select * from goods where name='"+Name.getText()+"'"; else if(Price.getText()!=null) sql="select * from goods where price='"+Price.getText()+"'"; else if(Brand.getText()!=null) sql="select * from goods where brand='"+Brand.getText()+"'"; else if(Vender.getText()!=null) sql="select * from goods where vender='"+Vender.getText()+"'"; ResultSet rs=stm.executeQuery(sql); while(rs.next()) { System.out.println("商品编号: "+Number.getText()); int s=jcb.getSelectedIndex(); if(s==0) JOptionPane.showMessageDialog( null, "请选择商品类别!" ); else if(s==1)System.out.println("商品类别: 食品"); else if(s==2)System.out.println("商品类别: 化妆品"); else if(s==3)System.out.println("商品类别: 日用品"); else if(s==4)System.out.println("商品类别: 饮料"); System.out.println("商品名称: "+rs.getString("name")); System.out.println("价格: "+rs.getString("price")); System.out.println("库存量: "+rs.getString("storage")); System.out.println("品牌: "+rs.getString("brand")); System.out.println("生产厂家: "+rs.getString("vender")); } }catch(Exception ee){ JOptionPane.showMessageDialog( null, "该商品不存在!" ); ee.printStackTrace(); } } else if(e.getSource()==purchase){new Purchase();} else if(e.getSource()==Reset){ Number.setText(null); Name.setText(null); Vender.setText(null); Price.setText(null); Brand.setText(null); } else if(e.getSource()==Exit) { this.setVisible(false); }}}
运行结果
退出系统
当在对商品进行增加﹑删除﹑修改和查询的界面时,点击“退出”按钮,即可弹出如图4-7所示界面,它调用了UsingExit.java类实现该功能,部分代码如下:
class UsingExit extends JFrame implements ActionListener{ JLabel Info=new JLabel("确认退出?"); JButton JExit=new JButton("确认"); JButton Cancel=new JButton("取消"); public void actionPerformed(ActionEvent e){ if(e.getSource()==JExit) System.exit(0); else if(e.getSource()==Cancel) setVisible(false); } }
运行结果如图:
点此下载源码
-
C语言 --- 商品信息管理系统
2020-07-28 16:33:26C语言 --- 商品信息管理系统要求结构体设计树形结构体代码功能设计部分源代码实现效果报告 要求 问题描述 设计一个简单商品分类管理系统,对商品进行分类管理. 基本要求 1、浏览当前商品分类目录的所有内容(子分类和...要求
问题描述
设计一个简单商品分类管理系统,对商品进行分类管理.
基本要求
1、浏览当前商品分类目录的所有内容(子分类和当前目录下的商品)
2、切换当前分类目录到上一级分类目录或下一级子分类目录(扩展,切换到任何一个目录)或直接切换到根目录
3、在当前分类目录下添加新商品目录,或者添加新商品信息。
4、在当前目录下删除某个子商品分类或某个商品信息
5、在当前目录下修改某个商品或分类目录的信息
6、根据某个商品编号(或名称)在整个系统中查找某个商品并显示全部信息
7、设计合适的交互界面
8、管理系统数据的永久性保存。(选作)
基本要求
a) 数据描述:设计合适的数据信息,比如商品,分类目录等等
b) 设计合适的数据结构组织数据,以及设计算法实现需求结构体设计
树形结构体
代码
struct list {//商品类别目录 int num;//类别编号 char name[20];//名称 int sum;//类别种数 int log;//读入标记 struct List* next; struct Node* child; }; struct node {//子目录 int num;//类别编号 char id[20];//商品编号 char name[20];//商品或分类的名称 double price;//商品价格 struct node* next;//用单链表记录当前结点的所有不为空的子结点 };
功能设计
部分源代码
创建树代码
struct list* input() {//获取商品类别目录 struct list* head = NULL, * p1, * p2 = NULL; FILE* fp; //文件指针变量fp logo = 0;//页数重置 if ((fp = fopen(filename_list, "a+")) == NULL) { printf("1不能打开该文件!\n"); exit(0); } if ((p1 = (struct list*)malloc(sizeof(struct list))) == NULL) { printf("分类1不能成功分配内存储块!"); exit(0); } p1->next = NULL; p1->child = NULL; while ((fscanf(fp, "%d %s", &p1->num, p1->name)) != EOF) {//读取文件内容 p1->sum = 0; p1->log = ++logo;//页数标记 if (head == NULL)head = p1; else p2->next = p1; p2 = p1; if ((p1 = (struct list*)malloc(sizeof(struct list))) == NULL) { printf("分类2不能成功分配内存储块!"); exit(0); } p1->next = NULL; p1->child = NULL;//类别下面的商品的链表头 } input_Goods(head);//将商品信息添加到商品类别目录中 fclose(fp); return head; } void input_Goods(struct list* h) {//从文件获取商品 struct list* i = NULL; struct node* head = NULL, * p1, * p2 = NULL; FILE* fp; if ((fp = fopen(filename_goods, "a+")) == NULL) { printf("2不能打开该文件!\n"); exit(0); } if ((p1 = (struct node*)malloc(sizeof(struct node))) == NULL) { printf("商品不能成功分配内存储块!"); exit(0); } p1->next = NULL; for (i = h; i != NULL; i = i->next) { while ((fscanf(fp, "%d %s %s %lf", &p1->num, &p1->id, p1->name, &p1->price)) != EOF) { if (i->num == p1->num) { i->sum++; if (i->child == NULL)i->child = p1; else p2->next = p1; p2 = p1; if ((p1 = (struct node*)malloc(sizeof(struct node))) == NULL) { printf("商品不能成功分配内存储块!"); exit(0); } p1->next = NULL; } } rewind(fp); } fclose(fp); }
循环遍历代码
//基本所有功能的遍历方法,第一个循环则可以改变类别信息,需要修改商品信息则可以增加第二个循环 for (i = h; i != NULL; i = i->next) { if (i->num == num) {//先循环找到商品类别 for (j = i->child; j != NULL; j = j->next) { //输出类别下所有商品 printf("%-7d%-8s%-16s%-8.2lf\n", j->num, j->id, j->name, j->price); break; } } for (j = i->child; j != NULL; j = j->next) {//根据需求改变商品 if () { } else printf(""); k = j; }
商品名称查重代码
//当调用完查重并修改相同的信息后将会递归重新调用这两个函数再次查重 void check_ALL(struct list* h, struct list* t,int *num,char *name) { //检查修改的类别号或名称有无重复 struct list* i = NULL; //h为商品类别的头指针,t为当前修改的类别的指针 int choice; if (num != NULL && name == NULL) {//修改的内容是类别号 for (i = h; i != NULL; i = i->next) { if (i->num == *num && i != t ) {//寻找是否有相同类别号的商品类别 while (*num == i->num) {//找到则提醒是否修改 } } }//修改内容为名称 if (num == NULL && name != NULL) {//寻找是否有相同名称的商品类别 for (i = h; i != NULL; i = i->next) { if (strcmp(i->name,name) == 0 && i != t) { } } } } //类别下的商品的名称查重 void check_ONE(struct list* t, struct node* m, char* s) { //t为当前修改的商品的类别指针,m为当前修改商品的指针 struct node* i = NULL; int choice = 1; for (i = t->child; i != NULL; i = i->next) { if ((strcmp(i->id, s) == 0 || strcmp(i->name, s) == 0) && i != m) { if (strcmp(i->id, s) == 0) {//商品编号存在 ...... } if (strcmp(i->name, s) == 0) {//商品名称存在 ...... } } } }
实现效果
报告
详细设计void get_filename(char *name);//获取文件所在路径 struct list* input();//读取商品类别目录 void input_Goods(struct list* h);//读取商品信息函数 void add(struct list* h);//添加商品函数 void add_ALL(struct list* h);//添加一个商品类别信息函数 void add_ONE(struct list* h);//添加一个商品信息函数 struct list* delete(struct list* h);//删除商品函数 struct list* delete_ALL(struct list* h);//删除一个商品类别 void delete_ONE(struct list* h);//删除目录里的单个商品 void search (struct list* h);//查找商品函数 void change(struct list* h);//修改功能函数 void change_ALL(struct list* h);//修改目录 void change_ONE(struct list* h);//修改商品 struct list* display(struct list* h);//查阅商品函数 struct list* display_ALL(struct list* h);//查阅全部 struct list* display_ONE(struct list* h);//翻页查阅 struct list* display_BOOK(struct list* h);//目录式查阅 void display_Goods(struct list* h, int num);//展示一个商品函数 void check_ALL(struct list* h, struct list* t,int *m,char *s);//检查修改时数据有没有重复函数 void check_ONE(struct list* t, struct node* m, char* s);//检查修改商品时商品数据有误冲突 void close(struct list* h);//关掉系统
-
简单的商品信息管理系统,(Java 和sql server数据库间接)
2019-05-28 22:41:18简单的商品信息管理系统,增删改查源码(Java 和sql server数据库间接)简单的商品信息管理系统,(Java 和sql server数据库)
根据老师要求上交的数据库作业,做个简单的增删改查功能,注意数据库是微软的sql server
MySQL版本的请移步到: https://blog.csdn.net/weixin_45114101/article/details/123612838
参考的学生管理系统
链接: link.
https://blog.csdn.net/XHS_12302/article/details/51910637
在此之前我也没学过java的图形界面,本人现在大一,通过揣摩参考资料 自己一句一句在api帮助文档里查找 然后简单加了点注释,api文档真的对自学帮助很大,不懂就自己查一下看一下效果图
用户名admin
密码123登录后 主界面
部分代码注释
数据库建立wtf
数据库名为wtf,表为info## info表的sql代码 use wtf; drop table info; create table info( sno varchar(20) primary key, sname varchar(40) not NULL, sprice varchar(10) ); insert into info values('001','伊利多','2.5'); insert into info values('002','巧克力','4'); insert into info values('003','奥利奥','11'); insert into info values('2411','棒棒糖','7'); insert into info values('201','酸奶','30'); insert into info values('201402','薯片','30');
登录数据库有两种方式
一种Windows登录 一种用户名密码登录,通过查阅许多帮助,本人使用不了windows登录数据库所以用后者,数据库登录名:sa 密码:1
java连接数据库代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.swing.JOptionPane; public class Dbcon { public final static Connection getconnectin() { Connection con = null;// 连接数据库 String url ="jdbc:sqlserver://localhost:1433;integratedSecurity=true;DatabaseName=wtf"; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 注册驱动 String user = "sa";// 登录数据库的用户密码 String password = "1"; //con = DriverManager.getConnection(url, user, password); con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;integratedSecurity=true;DatabaseName=wtf"); con.setCatalog("wtf");// 选择要在其中进行工作的此 Connection对象数据库的子空间(wtf数据库)。 } catch (SQLException sqle) { System.out.println(sqle + "连接错误"); } catch (Exception e) { System.out.println(e + "第二个错误"); } return con;//返回Connection对象 } }
最终打包源码+数据库+jar文件
514.jar是可以直接运行的 如果有将java的话,还有数据库wtf,bbb是工程名,即所有源码都在里面
oh,还有连接数据库用的sqljdbc.rar bbb工程里面好像有,顺便打包吧
打包链接链接:https://pan.baidu.com/s/1MXY8349D9D_ZZZY8AfrVQw
提取码:bs6f
复制这段内容后打开百度网盘手机App,操作更方便哦对了 里面有个bug 就是修改信息,我用的是先删除后增加,而不是update 语句,所以如果修改的时候输入学号删除信息又不输入新的信息点确定 原来的就会被删掉
还有用不了Windows连接,!!!数据库登录名和密码自己在代码里改 String user = “sa”;// 登录数据库的用户密码
String password = “1”;
这个分割线--------------------------------------------------------------------------------------
距离文章发布到现在快4年了,sql server的环境我没有了,我并不能解决你们所有人遇到的问题,希望你们能自己解决遇到的问题
2022.3.19更新 修改了标题为商品信息管理系统
链接: 新版源码+运行文件
提取码: su21
修复了主框架的标题 :商品信息管理系统
项目目录介绍
压缩包里有项目源码,里面的bbb文件夹就是项目源码
问题1: 中文显示乱码
那时刚入门,不懂得设置encode编码格式,所以代码都是以GBK格式 编码的,导致一些以UTF-8编码为环境的显示乱码.(tips:更多人用utf-8编码,utf-8才是国际化)
解决方法1 修改eclipse的编码: 设置你的编码格式为GBK
确保编码都是gbk解决方法2 修改文件编码: 把我的代码文件由gbk重新编码为utf-8
问题2: 数据库连接不上
数据库环境,帐号密码如果不一样,什么都不改,当然连不上
- 检查数据库是否能登录成功,数据库wtf是否建立了
- 数据库帐号密码不一样,在Dbcon.java里面修改,重新生成jar 文件才生效,改完要重新打包成jar包,再运行你改完代码生成的jar包(重新打包下面会介绍)
问题3: 标题改完不生效,任何配置改完没效果
hxd,改完代码,是不是要重新编译,生成新的文件,执行新的文件才实现改动,只改代码,不就只是改了源代码里的字吗.
改完代码,保存,重新打包,运行新的jar文件,才看得到变动问题4: 改完代码,如何重新打包成jar
举例: 把登录页面的标题514 改为 " 改标题 "
ctrl+s 保存哦
可以先在eclipse 运行LoginIn.java查看改完效果导出为可运行jar包👇
在项目右键 选择export 导出
导出成功,忽略警告
在桌面上就存在我们新导出的2.jar 双击运行,标题修改成功(登录页背景图片没了?下面会说解决方法)
问题5: 登录页背景图片不显示
要把2.jpg放到 可运行jar包的同级目录下,如
图片名源代码规定是2.jpg,可以在LoginIn 里修改
代码优化建议
bug:里面有个bug 就是修改信息,我用的是先删除后增加,而不是update 语句,所以如果修改的时候输入学号删除信息又不输入新的信息点确定 原来的就会被删掉
不想优化的话,演示的时候就不要把这bug显示出来呗
or
修改逻辑代码,先查有没有这个商品,没有就弹窗显示错误,有就显示修改商品界面(修改商品界面自己新加),而不是调用增加商品界面,然后再编写Dbcon.update()方法去执行update语句这只是优化思路,由于我没有完整的环境,就没有实现这个优化了
另外,有优化后的
简单的商品信息管理系统,(Java 和MySQL版本)
https://blog.csdn.net/weixin_45114101/article/details/123612838
-
IDEA+Java+SSM+Jsp+Mysql实现Web商品信息管理系统
2022-03-20 11:23:31Java+SSM+Bootstrap+Jsp+Mysql实现Web商品信息管理系统,sql在sql文件夹下面。系统功能包含,注册登录系统,管理员对商品信息的增删改查。界面良好,功能完善。 -
【Python案例】--商品信息管理系统
2020-05-05 16:53:02设计一个简易商品信息管理系统,具有能对商品信息进行增删改查的功能。需要正确的设计文字操作界面: 商品信息管理系统V1.0 1.添加 商品信息" 2.删除 商品信息 3.修改 商品信息 4.显示所有 商品信息 0.退出系统 对于... -
**超市商品信息管理系统**
2019-09-02 23:40:31超市商品信息管理系统 商品信息包括:商品名称、价格、厂商、价格、商品分类(比如:速冻、日货、包装食品、饮料等) 功能要求: 注册功能(账号及密码存入数据库中) 商品信息的录入功能: 商品分类的查询功能:... -
商品信息管理系统(c语言)项目报告
2018-08-18 09:26:06二、系统设计(三号,宋体,粗体) 2 (一)系统中的数据定义(四号,黑体,粗体) 2 (二)系统的概要设计 2 (三)系统的详细设计 2 (四)系统的核心算法 2 三、系统编码及运行(三号,宋体,粗体) 3 (一... -
基于SpringBoot+Mybatis+Thymeleaf商品信息管理系统项目学习《第一天》
2019-04-14 08:38:08下单的商品信息表 id item_id ‘商品id’, order_id ‘订单id’, num ‘商品购买数量’, title ‘商品标题’, price ‘商品单价’, total_fee 商品总金额’, pic_path ‘商品图片地址’ tb_order_... -
用C语言编写的超市商品信息管理系统
2015-04-19 21:35:41printf("\n\t\t\t\t超市商品信息管理系统\n"); printf("\t\t\t****************************\n"); printf("\t\t\t1.商品的录入\n"); printf("\t\t\t2.修改某个商品的信息\n"); printf("\t\t\t3.删除... -
C语言课程设计--商场商品信息管理系统(源代码、报告书、可执行文件)
2010-06-15 01:51:27设计一商场商品信息管理系统,功能包括: 1. 文件操作:可建立、打开、保存、关闭数据文件。 2. 输入商品信息数据:数据包括商品编号、商品名、商品类别、商品数量、 商品价格等。 3. 编辑数据:可添加、删除、修改... -
SSM实战之商品信息管理系统《六》
2018-10-10 12:24:21SSM实战之商品信息管理系统《五》 需要源码的留下邮箱或自己文中复制。 1.前言 经过上五篇文章点这里,已经把商品管理系的信息管理写完了,接下里这一篇介绍一下使用前端框架bootstrap来搭建一下登录界面和后台... -
SSM实战之商品信息管理系统《一》
2018-04-15 14:16:04SSM实战之商品信息管理系统《一》 1.前言 本系统属于SSM的常用功能整合使用练习。 涉及到SSM框架整合+前端框Bootstrap+Ajax校验+登录拦截器+图片文件上传+日期类型转换器+json格式传参等常用功能的使用。 使用... -
基于数据库的商品信息管理系统
2015-10-12 14:25:23c# 基于数据库的商品信息管理系统实例(含登录和操作两个界面) 原文在这儿,看的话从这儿开始看:http://blog.csdn.net/tingzhiyi/article/details/49072907 源代码在这儿可以下载:... -
SSM实战之商品信息管理系统《五》
2018-04-24 20:41:39SSM实战之商品信息管理系统《五》 需要源码的留下邮箱或自己文中复制。 1.前言 经过上四篇文章点这里,已经把商品管理系统差不多做完了,接下里这一篇介绍一下使用前端框架bootstrap来美化一下界面。 实际上... -
C语言课程设计-商场商品信息管理系统报告论文汇.doc
2021-05-21 08:26:53C语言课程设计-商场商品信息管理系统报告论文汇摘要C语言程序的发展与应用为各个方面均带来了较多的便捷,更为便捷的实现了数据的快捷运算和对数据的处理与应用,而本文主要介绍了商场商品信息管理系统,该程序有... -
c 设计商品信息管理系统
2015-06-19 07:36:10 -
【数据库】【课程设计】商品销售信息管理系统设计
2021-01-26 21:55:56商品销售信息管理系统设计1.设计目的2.需求分析2.1系统业务分析2.2系统数据处理分析2.3系统数据字典3.系统设计3.1系统开发框架3.2系统功能组成设计3.2.1 系统功能组成3.2.2 子系统功能模块设计3.3数据库结构设计... -
C++的商品管理系统
2021-11-19 01:40:37采用C++语言设计实现一个适合超市使用的进出货商品管理系统,实现商品的进货、销售、商品分类、营收管理、订单管理、管理员等功能。 二、系统分层数据流图 三、系统结构图 四、数据库设计 根据商品管理系统... -
python实现超市商品销售管理系统
2021-02-10 08:34:31本文实例为大家分享了python超市商品销售管理系统的具体代码,供大家参考,具体内容如下class Goods(object):def __init__(self, id, name, price):self.id = idself.name = nameself.price = pricedef __str__(self... -
商品管理系统——Java实现
2019-02-28 20:54:20功能要求: 完成“小商品管理系统”的架构设计 ... 显示商品信息 3. 商品入库(增加数量) 4. 商品出库(减少数量) 5. 修改商品价格 6. 所有产品的总价格(单价*数量) import java.util.ArrayList; impo... -
商品管理系统数据库设计--SQL Server
2022-02-16 14:55:472、医疗信息管理系统数据库–MySQL 医疗信息管理系统数据库–MySQL 3、邮件管理数据库设计–MySQL 邮件管理数据库设计–MySQL 4、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System ... -
基于JAVASE+MYSQL的商品信息管理系统
2019-04-06 20:42:02这几天花了大概两天时间写了一个商品信息管理系统,由于是刚写完,很多地方细节都没有做好, 希望有兴趣的朋友可以一起探讨一下。 然后下面就是我的项目截图: 登陆界面 注册界面 登陆成功界面 主界面 查询所有... -
基于SpringBoot+Mybatis+Thymeleaf商品信息管理系统
2018-04-30 11:29:30基于SpringBoot+Mybatis+Thymeleaf商品信息管理系统 主要用到的技术: - 1、使用maven进行项目构建 - 2、使用Springboot+Mybatis搭建整个系统 - 3、使用Thymeleaf模板技术实现页面静态化 - 4、使用框架...