开发环境:
Python3.7
Windows
各文件夹说明:
bin:
start.py #启动目录
conf:
settings.py #配置文件,用于保存项目目录、课程、选课、以及用户等文件目录
core: #主要代码块
main.py #主程序目录
authentication.py #登录认证
student.py #学生类
manager.py #管理员类
course.py #课程类和公共类
db:#数据存储
course #课程数据,存储类型为pickle
select_course #学生已选课程信息,存储类型为pickle
user #用户表,明文存储
bin 目录下:
start.py
conf 目录下:
#!/usr/bin/python#-*- coding:utf-8 -*-#Author :wangliujun
importos
path= r'E:\老男孩Python\Class_27\Class_27\CourseSelectionSystem' #项目目录
course_file= os.path.join(path, 'db\course') #存储课程
user_file = os.path.join(path, r'db\user') #存储用户
select_course = os.path.join(path, 'db\select_course') #已选课程
settings.py
core 目录下:
1 #!/usr/bin/python
2 #-*- coding:utf-8 -*-
3 #Author :wangliujun
4
5 importsys6 from core importauthentication as au7 from core importmanager as ma8 from core importstudent as stu9
10
11 defmain():12 ret =au.login()13 ifret:14 whileTrue:15 usr, role = ret[0], ret[2]16 if role == 'Student':17 cls =getattr(stu, role)18 elif role == 'Manager':19 cls =getattr(ma, role)20 obj =cls.init(usr)21 print('-' * 40)22 for index, i in enumerate(cls.menu_list, 1): #遍历列表中菜单
23 print(index, i[0])24 print('-' * 40)25 choice = int(input('请选择序号:').strip())26 func = obj.menu_list[choice - 1][1] #取出选择序号对应的方法名,字符串类型
27 getattr(obj, func)() #执行对象中的方法
28 #cls = getattr(sys.modules[__name__], role)
29 #obj = cls.init(usr)
30 #print('-' * 40)
31 #for index, i in enumerate(cls.menu_list, 1): # 遍历列表中菜单
32 #print(index, i[0])
33 #print('-' * 40)
34 #choice = int(input('请选择序号:').strip())
35 #func = obj.menu_list[choice - 1][1] # 取出选择序号对应的方法名,字符串类型
36 #getattr(obj, func)() # 执行对象中的方法
main.py
1 #!/usr/bin/python
2 #-*- coding:utf-8 -*-
3 #Author :wangliujun
4
5 importos6 importsys7 from conf importsettings as cof8
9
10 deflogin():11 input_usr = input('请输入用户名:').strip()12 input_pwd = input('请输入密码:').strip()13 with open(cof.user_file, mode='r', encoding='utf-8') as f:14 for line inf:15 ifline:16 usr, pwd, role = line.strip().split('|')17 if usr == input_usr and pwd ==input_pwd:18 print('%s登录成功,欢迎您%s' %(role, usr))19 returnusr, pwd, role20 else:21 print('账号密码错误')22 return None
authentication.py
1 #!/usr/bin/python
2 #-*- coding:utf-8 -*-
3 #Author :wangliujun
4
5 importpickle6 from conf importsettings as cof7 from core importcourse as co8
9 class Course(): #课程类
10 def __init__(self, name, price, cycle, teacher):11 self.name =name12 self.price =price13 self.cycle =cycle14 self.teacher =teacher15
16
17 class Public(object): #公共类
18 def show_courses(self): #查看所有课程
19 with open(cof.course_file, mode='rb') as f:20 print('序号:\t课程名\t课程价格\t课程周期\t老师')21 n = 1
22 whileTrue:23 try:24 course =pickle.load(f)25 tplt = '{0:<3}{1:<15}{2:<10}{3:<10}{4:<10}'
26 print(tplt.format(n, course.name, course.price, course.cycle, course.teacher))27 n += 1
28 exceptEOFError:29 break
30
31 def exit(self): #退出
32 exit('bye')
course.py
1 #!/usr/bin/python
2 #-*- coding:utf-8 -*-
3 #Author :wangliujun
4
5 importsys6 importpickle7 from core importstudent as stu8 from core importcourse as co9 from conf importsettings as cof10
11
12 class Manager(co.Public): #管理员
13 menu_list =[14 ('创建课程', 'create_course'),15 ('查看所有课程', 'show_courses'),16 ('创建学生账号', 'create_stu'),17 ('查看所有学生', 'show_students'),18 ('查看所有选课情况', 'show_sit'),19 ('退出程序', 'exit')] #管理员菜单
20
21 def __init__(self, name):22 self.name =name23
24 @classmethod25 definit(cls, username):26 return cls(username) #返回实例化对象
27
28 defcreate_course(self):29 name = input('课程名:')30 price = input('课程价格:')31 cycle = input('课程周期:')32 teacher = input('老师:')33 course = co.Course(name, price, cycle, teacher) #创建新的课程对象
34 with open(cof.course_file, 'ab') as f:35 pickle.dump(course, f)36 print('课程创建成功') #创建课程
37
38 def create_stu(self): #创建学生账号
39 user = input('请输入学生用户名:').strip()40 pwd = input('请输入密码:').strip()41 cof_pwd = input('确认密码:').strip()42 if pwd == cof_pwd and user andpwd:43 with open(cof.user_file, 'a', encoding='utf-8') as f:44 f.write('\n%s|%s|%s' % (user, pwd, 'Student'))45 print('用户%s创建成功' %user)46 stu_obj =stu.Student(user)47 with open(cof.select_course, mode='ab') as f:48 pickle.dump(stu_obj, f)49 else:50 print('帐号密码格式不符合')51
52 def show_students(self): #查看所有学生
53 with open(cof.select_course, mode='rb') as f:54 n = 1
55 whileTrue:56 try:57 obj =pickle.load(f)58 print('%s %s' %(n, obj.name))59 n += 1
60 exceptEOFError:61 print('-' * 50)62 break
63
64 def show_sit(self): #查看所有选课情况
65 with open(cof.select_course, 'rb') as f:66 n = 1
67 whileTrue:68 try:69 stu_obj =pickle.load(f)70 print('%s 用户:%s\t' % (n, stu_obj.name), end='所选课程:')71 for i in stu_obj.course_list: print(i.name, end=' ')72 n += 1
73 print()74 exceptEOFError:75 break
manager.py
1 #!/usr/bin/python
2 #-*- coding:utf-8 -*-
3 #Author :wangliujun
4 importpickle5 importos6 from conf importsettings as cof7 from core importcourse as co8
9 class Student(co.Public): #学生类
10 #存储学生菜单
11 menu_list =[12 ('查看可选课程', 'opt_course'),13 ('选择课程', 'select_course'),14 ('查看所选课程', 'show_selected_course'),15 ('退出', 'exit')16 ]17
18 def __init__(self, name):19 self.name =name20 self.course_list =[]21
22 @classmethod23 definit(cls,username):24 with open(cof.select_course, mode='rb') as f:25 whileTrue:26 try:27 stu_obj =pickle.load(f)28 if stu_obj.name ==username:29 returnstu_obj30 exceptEOFError:31 break
32
33 def opt_course(self): #查看可选课程
34 co.Public.show_courses(self)35
36 def select_course(self): #选择课程
37 co.Public.show_courses(self)38 choice = int(input('请输入要选择的序号:').strip())39 n = 1
40 with open(cof.course_file, 'rb') as f:41 whileTrue:42 try:43 obj =pickle.load(f)44 if choice ==n:45 self.course_list.append(obj)46 print('用户%s,添加课程%s成功' %(self.name, obj.name))47 break
48 n += 1
49 exceptEOFError:50 print('没有要选的课程')51 tmp = os.path.dirname(cof.select_course) + '/tmp'
52 with open(cof.select_course, mode='rb') as f1, open(tmp, mode='wb') as f2:53 #with open(select_course, mode='rb'):
54 whileTrue:55 try:56 obj =pickle.load(f1)57 if obj.name ==self.name:58 obj =self59 pickle.dump(obj, f2)60 exceptEOFError:61 break
62 os.remove(cof.select_course)63 os.rename(tmp, cof.select_course)64
65 def show_selected_course(self): #查看已选课程
66 with open(cof.select_course, 'rb') as f:67 whileTrue:68 try:69 obj =pickle.load(f)70 if self.name ==obj.name:71 for i inobj.course_list:72 print(i.name)73 exceptEOFError:74 break
student.py
db 目录下:
存储格式: 用户名|密码|角色 例: alex|alex3714|Manager