Python之路day08-面向对象作业_实现学生选课系统

Eva_J 老师博客链接:  https://www.cnblogs.com/Eva-J/articles/11370946.html day06-面向对象

开发环境:
  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
import os

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 import sys
 6 from core import authentication as au
 7 from core import manager as ma
 8 from core import student as stu
 9 
10 
11 def main():
12     ret = au.login()
13     if ret:
14         while True:
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 import os
 6 import sys
 7 from conf import settings as cof
 8 
 9 
10 def login():
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 in f:
15             if line:
16                 usr, pwd, role = line.strip().split('|')
17                 if usr == input_usr and pwd == input_pwd:
18                     print('%s登录成功,欢迎您%s' % (role, usr))
19                     return usr, pwd, role
20         else:
21             print('账号密码错误')
22             return None
authentication.py
 1 #!/usr/bin/python
 2 # -*- coding:utf-8 -*-
 3 # Author :wangliujun
 4 
 5 import pickle
 6 from conf import settings as cof
 7 from core import course as co
 8 
 9 class Course():  # 课程类
10     def __init__(self, name, price, cycle, teacher):
11         self.name = name
12         self.price = price
13         self.cycle = cycle
14         self.teacher = teacher
15 
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             while True:
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                 except EOFError:
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 import sys
 6 import pickle
 7 from core import student as stu
 8 from core import course as co
 9 from conf import settings as cof
10 
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 = name
23 
24     @classmethod
25     def init(cls, username):
26         return cls(username)  # 返回实例化对象
27 
28     def create_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 and pwd:
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             while True:
56                 try:
57                     obj = pickle.load(f)
58                     print('%s %s' % (n, obj.name))
59                     n += 1
60                 except EOFError:
61                     print('-' * 50)
62                     break
63 
64     def show_sit(self):  # 查看所有选课情况
65         with open(cof.select_course, 'rb') as  f:
66             n = 1
67             while True:
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                 except EOFError:
75                     break
manager.py
 1 #!/usr/bin/python
 2 # -*- coding:utf-8 -*-
 3 # Author :wangliujun
 4 import pickle
 5 import os
 6 from conf import settings as cof
 7 from core import course as co
 8 
 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 = name
20         self.course_list = []
21 
22     @classmethod
23     def init(cls,username):
24         with open(cof.select_course, mode='rb') as  f:
25             while True:
26                 try:
27                     stu_obj = pickle.load(f)
28                     if stu_obj.name == username:
29                         return stu_obj
30                 except EOFError:
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             while True:
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                 except EOFError:
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             while True:
55                 try:
56                     obj = pickle.load(f1)
57                     if obj.name == self.name:
58                         obj = self
59                     pickle.dump(obj, f2)
60                 except EOFError:
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             while True:
68                 try:
69                     obj = pickle.load(f)
70                     if self.name == obj.name:
71                         for i in obj.course_list:
72                             print(i.name)
73                 except EOFError:
74                     break
student.py

db 目录下:

  存储格式: 用户名|密码|角色 例: alex|alex3714|Manager

转载于:https://www.cnblogs.com/wanglj/p/11444345.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值