python開發項目:學生選課系統


程序要求:
1.創建北京、上海兩所學校(分析:通過學校類實例化兩個學校實例

2.創建Linux、python、go三個課程,Linux\go在北京開,Linux在上海開(創建Linux、python、go三門課程

3.課程包含:周期、價格,通過學校來創建課程(分析:通過學校實例來創建課程,課程包含三個屬性:名字、周期、價格

4.通過學校來創建班級,班級關聯課程、講師(分析:通過學校實例來創建班級,班級要關聯課程、講師

5.創建學員時,選擇學校、關聯班級(分析:選擇學校后通過學校實例創建學員,學員關聯班級

6.創建講師時要關聯學校(分析:通過學校實例來創建講師,並關聯班級

7.創建講師角色時要關聯學校提供的兩個角色接口(同上

8.學員視圖:可以注冊、交學費、選擇班級

9.講師視圖:講師可以管理自己的班級,上課選擇班級、查看班級學員列表、修改所管理的學員的成績

10.管理視圖:創建講師、創建班級、創建課程

11。上面的操作產生的數據都保存在文件里

由上述分析可知:需要創建5個類:學校、學員、班級、課程、講師

5個類的對應關系:

一個學校對應多個班級、學員、課程、講師

一個班級對應多個學員、一個課程、一個講師

一個講師對應多個班級、多個學員,(可通過班級找到學員、課程)

一個學員對應多個班級

有以上可知:可由學校類的屬性中保存班級、學員、課程、講師的實例字典,由班級類的屬性中保

                     存學員實例字典,課程實例。由講師類的屬性中保存班級實例字典

功能需求:三個視圖,即8、9、10所要求的功能

以下是程序的目錄結構:

以下是程序的全部代碼:

bin目錄下的start

 1 # -*- coding:utf-8 -*-
 2 #!/user/bin/env.python
 3 #Author:Mr Wu
 4 
 5 import os,sys  6 
 7 BASE_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  8 sys.path.insert(0,BASE_dir)  9 from core import main 10 
11 if __name__ == '__main__': 12     obj = main.intersection_center() 13     obj.intersection()
View Code

conf目錄下的settings

 1 '''定義數據庫的絕對路徑'''
 2 import os  3 if os.sep == "\\":  4     BASE_dir = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1])  5     database_dir = os.path.join(BASE_dir,"database")  6 else:  7     BASE_dir = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1])  8     database_dir = os.path.join(BASE_dir,"database")  9 
10 school_db_file = os.path.join(database_dir,"school")
View Code

core目錄下的main:

import os,sys,shelve BASE_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0,BASE_dir) from modules import School from conf import settings class intersection_center(object): '''開始交互'''
    def __init__(self): pass
    def intersection(self): while True: print("\033[1;30m歡迎來到學生選課系統\033[0m\n"
                  "1:\033[1;31m管理視圖\033[0m\n"
                  "2:\033[1;32m講師視圖\033[0m\n"
                  "3:\033[1;33m學員視圖\033[0m\n"
                  "q:\033[1;34m退出\033[0m\n") user_choice = input("\033[1;30m input your choice ID>>>:\033[0m") if user_choice == "1": manage_view() elif user_choice == "2": teacher_view() elif user_choice == "3": student_view() elif user_choice == "q": print("\033[1;30m感謝您使用學生信息管理系統\033[0m") break
            else: print("\033[1;31m輸入錯誤!\033[0m") class manage_view(object): '''管理視圖'''
    def __init__(self): if os.path.exists(settings.school_db_file+".dat"): #shelve的.dat文件是用來存數據的
            self.school_db = shelve.open(settings.school_db_file) self.manage_intersection() self.school_db.close() else: print("\033[1;31m系統提示:開始創建學校\033[0m") self.create_school() self.manage_intersection() self.school_db.close() def create_school(self): '''創建學校''' self.school_db = shelve.open(settings.school_db_file) for i in range(2): school_name = input("\033[1;30m input school name>>>:\033[0m") school_address = input("\033[1;30m input school address>>>:\033[0m") self.school_db[school_name] = School.School(school_name,school_address) def manage_intersection(self): '''管理視圖交互''' count = 0 print("\033[1;30m學校名稱:\033[0m") for key in self.school_db: print(key) while count < 3: self.school_name = input("\033[1;30m輸入要管理的學校名稱>>>:\033[0m") if self.school_name in self.school_db: self.school = self.school_db[self.school_name] while True: print("\033[1;30m歡迎來到管理視圖\033[0m\n"""
                          "1:\033[1;31m創建班級\033[0m\n"
                          "2:\033[1;32m創建課程\033[0m\n"
                          "3:\033[1;33m招聘講師\033[0m\n"
                          "4:\033[1;34m查看班級\033[0m\n"
                          "5:\033[1;35m查看講師\033[0m\n"
                          "6:\033[1;36m查看課程\033[0m\n"
                          "b:\033[1;37m返回\033[0m\n") user_choice = input("\033[1;30m input your choice ID>>>:\033[0m") if user_choice == "1": self.create_class() elif user_choice == "2": self.create_course() elif user_choice == "3": self.create_teacher() elif user_choice == "4": self.show_class() elif user_choice == "5": self.show_teacher() elif user_choice == "6": self.show_course() elif user_choice == "b": print("\033[1;35m感謝您使用管理視圖\033[0m") break
                    else: print("\033[1;31m輸入錯誤!\033[0m") break
            else: print("\033[1;31m輸入錯誤,請重新輸入\033[0m") count += 1

    def create_class(self): '''創建班級'''
        while True: class_number = input("\033[1;30m輸入班級編號>>>:\033[0m") if class_number in self.school.classes: print("\033[1;31m這個班級已經存在!\033[0m") continue
            else: course_name = input("\033[1;30m輸入關聯的課程名稱>>>:\033[0m") if course_name in self.school.courses: self.school.create_class(class_number,course_name) print("\033[1;30m創建班級:\033[0m[\033[1;33m%s班]成功\033[0m,\033[1;30m開設課程:\033[0m[\033[1;33m%s\033[0m]"%(class_number,course_name)) if_continue = input("\033[1;30m是否繼續創建班級? Y/N>>>:\033[0m") if if_continue == "Y": continue
                    elif if_continue == "N": self.school_db.update({self.school_name:self.school}) break
                    else: print("\033[1;31m輸入錯誤!\033[0m") else: print("\033[1;31m此課程不存在,請先創建此課程!\033[0m") break

    def create_teacher(self): '''招聘教師'''
        while True: tea_name = input("\033[1;30m輸入講師的名字>>>:\033[0m") if tea_name in self.school.teachers: print("\033[1;31m這個講師已經存在!\033[0m") continue
            else: tea_age = input("\033[1;30m輸入講師的年齡>>>:\033[0m") tea_sex = input("\033[1;30m輸入講師的性別>>>:\033[0m") tea_salary = input("\033[1;30m輸入講師的薪資>>>:\033[0m") while True: class_number_str = input("\033[1;30m輸入關聯的班級編號(格式:int,int...)>>>:\033[0m") class_number_list = class_number_str.split(",") count = 0 for class_number in class_number_list: if class_number in self.school.classes: count += 1
                    if count == len(class_number_list): self.school.create_teacher(tea_name,tea_age,tea_sex,tea_salary,class_number_list) print("講師:[%s] 關聯班級:[%s班]"%(tea_name,class_number_str)) break
                    else: print("\033[1;31m關聯的班級中有不存在的班級,請檢查后重新輸入!\033[0m") if_continue = input("\033[1;30m是否繼續招聘講師? Y/N>>>:\033[0m") if if_continue == "Y": continue
                elif if_continue == "N": print("\033[1;30m招聘講師:[%s]成功\033[0m \033[1;33m薪資:[%s]\033[0m"%(tea_name,tea_salary)) self.school_db.update({self.school_name:self.school}) break
                else: print("\033[1;31m輸入錯誤!\033[0m") break

    def create_course(self): '''創建課程'''
        while True: course_name = input("\033[1;30m輸入課程名字>>>:\033[0m") if course_name in self.school.courses: print("\033[1;31m這個課程已經存在!\033[0m") continue
            else: course_time = input("\033[1;30m輸入課程周期>>>:\033[0m") course_price = input("\033[1;30m輸入課程價格>>>:\033[0m") self.school.create_course(course_name,course_time,course_price) print("\033[1;30m創建課程:\033[0m\033[1;33m[%s]成功\033[0m,\033[1;30m課程周期:\033[0m\033[1;33m[%s]\033[0m"%(course_name,course_time)) if_continue = input("\033[1;30m是否繼續創建課程? Y/N>>>:\033[0m") if if_continue == "Y": continue
                elif if_continue == "N": self.school_db.update({self.school_name:self.school}) break
                else: print("\033[1;31m輸入錯誤!\033[0m") break

    def show_class(self): '''班級信息'''
        while True: self.school.show_classes() if_continue = input("\033[1;30m是否繼續查看班級信息? Y/N>>>:\033[0m") if if_continue == "Y": continue
            elif if_continue == "N": break
            else: print("\033[1;301輸入錯誤!\033[0m") def show_teacher(self): '''講師信息'''
        while True: self.school.show_teachers() if_continue = input("\033[1;30m是否繼續查看講師信息? Y/N>>>:\033[0m") if if_continue == "Y": continue
            elif if_continue == "N": break
            else: print("\033[1;31m輸入錯誤!\033[0m") def show_course(self): '''課程信息'''
        while True: self.school.show_courses() if_continue = input("\033[1;30m是否繼續查看課程信息? Y/N>>>:\033[0m") if if_continue == "Y": continue
            elif if_continue == "N": break
            else: print("\033[1;31m輸入錯誤!\033[0m") class teacher_view(object): '''講師視圖'''
    def __init__(self): if os.path.exists(settings.school_db_file+".dat"): self.school_db = shelve.open(settings.school_db_file) self.teacher_intersection() self.school_db.close() else: print("\033[1;31m抱歉學校還未建成!\033[0m") def teacher_intersection(self): '''講師交互''' count = 0 while count < 3: self.school_name = input("\033[1;30m請輸入您就職學校的名字>>>:\033[0m") if self.school_name in self.school_db: self.school = self.school_db[self.school_name] tea_name = input("\033[1;30m輸入您的名字>>>:\033[0m") if tea_name in self.school.teachers: self.teacher = self.school.teachers[tea_name] while True: print("\033[1;30m歡迎來到講師視圖\033[0m\n"
                              "1:\033[1;31m上課選擇班級\033[0m\n"
                              "2:\033[1;32m查看學員列表\033[0m\n"
                              "b:\033[1;33m返回\033[0m\n") user_choice = input("\033[1;30minput your choice ID>>>:\033[0m") if user_choice == "1": self.select_class() elif user_choice == "2": self.show_student() elif user_choice == "b": print("\033[1;33m感謝您使用講師視圖\033[0m") break
                        else: print("\033[1;31m輸入錯誤!\033[0m") break
                else: print("\033[1;31m輸入錯誤!\033[0m") count += 1
            else: print("\033[1;31m輸入錯誤!\033[0m") count += 1

    def show_student(self): '''查看學員列表'''
        while True: print("\033[1;30m班級列表:\033[0m") for key in self.teacher.classes: print("\033[1;36m班級編號:%s 開設課程:%s\033[0m"%(key,self.teacher.classes[key].course_obj.course_name)) class_number = input("\033[1;30m輸入您想查看的班級編號>>>:\033[0m") if class_number in self.teacher.classes: class_obj = self.teacher.classes[class_number] for key in class_obj.student_list: stu_name = key stu_age = class_obj.student_list[stu_name].stu_age print("\033[1;30m學員名字:%s\033[0m \033[1;31m學員年齡:%s\033[0m"%(stu_name,stu_age)) if_continue = input("\033[1;30m是否繼續查看學員列表? Y/N>>>:\033[0m") if if_continue == "Y": continue
                elif if_continue == "N": break
                else: print("\033[1;31m輸入錯誤!\033[0m") else: print("\033[1;31m班級編號不存在!\033[0m") def select_class(self): '''上課選擇班級'''
        while True: for class_number in self.teacher.classes: class_obj = self.teacher.classes[class_number] course_name = class_obj.course_obj.course_name print("\033[1;30m班級編號:%s\033[0m \033[1;31m開設課程:m%s\033[0m"%(class_number,course_name)) select_class = input("\033[1;30m輸入您想要上課的班級編號>>>:\033[0m") if select_class in self.teacher.classes: print("\033[1;35m講師%s今天給%s班上課....\033[0m"%(self.teacher.tea_name,select_class)) if_continue = input("\033[1;30m是否重新選擇上課班級? Y/N>>>:\033[0m") if if_continue == "Y": continue
                elif if_continue == "N": break
                else: print("\033[1;31m輸入錯誤!\033[0m") else: print("\033[1;31m輸入錯誤!\033[0m") class student_view(object): '''學員視圖'''
    def __init__(self): if os.path.exists(settings.school_db_file+".dat"): self.school_db = shelve.open(settings.school_db_file) self.student_interaction() self.school_db.close() else: print("\033[1;31m抱歉學校還未建成!\033[0m") def student_interaction(self): '''學生交互'''
        while True: print("\033[1;30m歡迎來到學生視圖\033[0m\n"
                  "1:\033[1;31m注冊\033[0m\n"
                  "2:\033[1;32m查看課程\033[0m\n"
                  "b:\033[1;33m返回\033[0m\n") user_choice = input("\033[1;30m input your choice ID>>>:\033[0m") if user_choice == "1": self.registered_class() elif user_choice == "2": self.show_course() elif user_choice == "b": print("\033[1;35m感謝您使用學生視圖\033[0m") break
            else: print("\033[1;35m輸入錯誤!\033[0m") def registered_class(self): '''注冊學校、班級、繳費'''
        while True: print("\033[1;30m學校名稱:\033[0m") for key in self.school_db: print(key) self.school_name = input("\033[1;30m輸入您想要注冊的學校>>>:\033[0m") if self.school_name in self.school_db: self.school = self.school_db[self.school_name] for key in self.school.classes: class_obj = self.school.classes[key] course_name = class_obj.course_obj.course_name course_price = class_obj.course_obj.course_price print("\033[1;33m班級編號:%s\033[0m \033[1;34m課程名稱:%s\033[0m \033[1;35m課程價格:%s\033[0m"%(key,course_name,course_price)) class_number = input("\033[1;30m輸入您想要注冊的班級編號>>>:\033[0m") if class_number in self.school.classes: class_obj = self.school.classes[class_number] course_money = class_obj.course_obj.course_price stu_name = input("\033[1;30m輸入您的名字>>>:\033[0m") if stu_name in class_obj.student_list: print("\033[1;31m您已經報名此班級,請選擇其他班級\033[0m") else: stu_age = input("\033[1;30m輸入您的年齡>>>:\033[0m") stu_sex = input("\033[1;30m輸入您的性別>>>:\033[0m") if_pay = input("\033[1;30m您選中的課程費用為:%s,是否支付費用? Y/N>>>:\033[0m"%(course_money)) if if_pay == "Y": print("\033[1;39m注冊班級:[%s班]成功 , 學習課程:[%s]\033[0m"%(class_number,class_obj.course_obj.course_name)) elif if_pay == "N": continue
                        else: print("\033[1;31m輸入錯誤!\033[0m") self.school.create_student(stu_age,stu_sex,stu_name,class_number) self.school_db.update({self.school_name:self.school}) break
                else: print("\033[1;31m不存在此班級編號!\033[0m") else: print("\033[1;31m不存在此學校!\033[0m") def show_course(self): '''查看課程信息'''
        while True: class_number = input("\033[1;30m輸入您上課的班級編號>>>:\033[0m") if class_number in self.school.classes: class_obj = self.school.classes[class_number] course_obj = class_obj.course_obj course_name = course_obj.course_name course_time = course_obj.course_time course_price = course_obj.course_price print("\033[1;32m課程:%s\033[0m \033[1;33m周期:%s\033[0m \033[1;34m價格:%s\033[0m"%(course_name,course_time,course_price)) if_continue = input("\033[1;30m是否繼續查看課程信息? Y/N>>>:\033[0m") if if_continue == "Y": continue
                elif if_continue == "N": break
                else: print("\033[1;31m輸入錯誤\033[0m") else: print("\033[1;31m不存在此班級編號!\033[0m")
View Code

modules目錄:

Class:

1 class Class(object): 2     def __init__(self,class_number,course_obj): 3         self.class_number = class_number 4         self.course_obj = course_obj 5         self.student_list = {}
View Code

Teacher:

1 class Teacher(object): 2     def __init__(self,tea_name,tea_age,tea_sex,tea_salary): 3         self.tea_name = tea_name 4         self.tea_age = tea_age 5         self.tea_sex = tea_sex 6         self.tea_salary = tea_salary 7         self.classes = {} 8     def teacher_add_class(self,class_number,class_obj): 9         self.classes[class_number] = class_obj
View Code

School:

from modules import Course,Class,Student,Teacher import pickle class School(object): '''學校類'''
    def __init__(self,school_name,school_address): self.school_name = school_name self.school_address = school_address self.teachers = {} #講師實例
        self.classes = {} #班級實例
        self.courses = {} #課程實例
        #self.students = {} #待擴展
    def create_class(self,class_number,course_name): '''創建班級、班級關聯課程''' class1 = Class.Class(class_number,self.courses[course_name]) self.classes[class_number] = class1 def create_teacher(self,tea_name,tea_age,tea_sex,tea_salary,class_number_list): '''招聘講師''' teacher = Teacher.Teacher(tea_name,tea_age,tea_sex,tea_salary) for class_number in class_number_list: teacher.teacher_add_class(class_number,self.classes[class_number]) self.teachers[tea_name ] = teacher def create_student(self,stu_age,stu_sex,stu_name,class_number): '''創建學員,關聯班級''' student = Student.Student(stu_name,stu_age,stu_sex) self.classes[class_number].student_list[stu_name] = student def create_course(self,course_name,course_time,course_price): '''創建課程''' course = Course.Course(course_name,course_time,course_price) self.courses[course_name] = course def show_teachers(self): '''查看教師信息'''
        for key in self.teachers: tea_obj = self.teachers[key] print("名字:%s 年齡:%s 性別:%s 薪資:%s"%(tea_obj.tea_name,tea_obj.tea_age,tea_obj.tea_sex,tea_obj.tea_salary)) def show_classes(self): '''查看班級信息'''
        for key in self.classes: class_obj = self.classes[key] print("班級編號:%s 開設課程:%s"%(class_obj.class_number,class_obj.course_obj.course_name)) def show_courses(self): '''查看課程信息'''
        for key in self.courses: course_obj = self.courses[key] print("課程:%s 周期:%s 價格:%s"%(course_obj.course_name,course_obj.course_time,course_obj.course_price))
View Code

Course·:

class Course(object): def __init__(self,course_name,course_time,course_price): self.course_name = course_name self.course_time = course_time self.course_price = course_price
View Code

Student:

1 class Student(object): 2     def __init__(self,stu_name,stu_age,stu_sex): 3         self.stu_name = stu_name 4         self.stu_age = stu_age 5         self.stu_sex = stu_sex
View Code

 以下是程序執行過程、結果

開始界面:

管理視圖

 

創建課程:

創建班級:

 招聘講師:

 查看班級:

查看講師:

查看課程:

講師視圖

上課選班級:

 

查看學員列表:

學員視圖:

注冊:

查看課程:

 開發過程中遇到的問題:

1.數據存儲問題:學校、班級、講師、課程、學員之間的信息相互關聯,如果將其分開存文件,那么如果有一處的信息變動,那么與之相關聯的文件也要修改,這樣做十分麻煩。

所以把班級實例、講師實例、課程實例、學員實例都保存在學校實例中,這樣只需要存學校一個文件即可

2.數據序列化問題:開始的時候我使用的是pickle序列化,這樣在每個方法中都必須打開-關閉文件才能將文件中的數據更新,這樣做十分麻煩。解決方法:使用shelve數據序列化,

在交互開始的時候打開文件,在交互結束的時候再關閉文件,在交互的過程中使用sellf.school_d.update({self.school_name:sellf.school})來更新文件中的數據,這樣做十分簡略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM