作業題目: 選課系統
角色:學校、學員、課程、講師
要求:
1. 創建北京、上海 2 所學校
2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,周期,價格,通過學校創建課程
4. 通過學校創建班級, 班級關聯課程、講師
5. 創建學員時,選擇學校,關聯班級
5. 創建講師角色時要關聯學校,
6. 提供兩個角色接口
6.1 學員視圖, 可以注冊, 交學費, 選擇班級,
6.2 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績
6.3 管理視圖,創建講師, 創建班級,創建課程
7. 上面的操作產生的數據都通過pickle序列化保存到文件里
編程小記:
整個程序在寫的過程中讓我花費大量時間思考的問題是數據的存儲問題,如何將各個模塊和我的主邏輯程序聯系起來。在開始寫這個程序之前就要求盡量按照生產過程中的一些要求來寫,包括,整個程序的目錄結構,各個模塊功能的隔離,注釋的規范,日志,配置文件等等。
關於數據存儲的問題,一開始沒有想明白我們是可以直接序列化對象的。而我們存儲了對象就可以將對象所包含的所有數據存儲下來,通過shelve可以很方便省事的實現。
編寫過程:
1.在編程之前要把題目轉化成代碼語言
一:基礎類
1.創建學校類,通過學校類創建學校
2.3 創建課程類,通過學校類創建課程,創建時候關聯學校 創建時候要包含周期價格
4.創建班級類,但是通過學校創建班級,創建時候關聯課程,講師
5.創建學員類,學員自行注冊創建,創建時候選擇學校,選擇上課班級
6.創建講師類,通過學校類創建講師,創建時候關聯學校
二:邏輯類
7.創建三個視圖類
1.學員視圖: 擁有功能: 注冊(注冊時候選擇班級) 交學費 上課
2.講師視圖: 講課,講課時候選擇班級 進入講課后可查看班級學員列表
3.管理視圖: 創建/刪除講師 創建/刪除班級 創建/刪除學校 創建/刪除課程 創建/刪除講師
2.畫流程圖(這個有很多種方式,自行選擇適合自己的方式)
在開始寫程序之前一定要先搞清楚程序的邏輯情況,自己可以通過圖標先大致的畫出來整個程序的一個流程圖,可能這並不是最終的流程,但是可以通過這個圖讓你的思路清晰很多。
3.程序目錄結構
Selesystem/ #項目目錄 |-- bin #啟動腳本目錄 | `-- start.py #啟動腳本 |-- conf #配置文件目錄 | |-- config.py #配置文件 |-- core #核心主邏輯包 | |-- __init__.py # | |-- main.py #主程序文件 |-- data #數據目錄 | |-- school # | | |-- school.db # | | `-- school.db.bak # |-- doc #文檔目錄 |-- logs #日志目錄 | `-- service.log #日志文件 |-- modules #模塊包 | |-- course.py #課程模塊 | |-- grade.py #班級模塊 | |-- __init__.py # | |-- school.py #學校模塊 | |-- student.py #學生模塊 | `-- teacher.py #講師模塊 |-- README.md # `-- test #測試目錄 `-- test.py #測試及生成冊數數據腳本
代碼github地址: https://github.com/nighttidesy/-Selesystem
代碼如下:
start.py

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # author heaven import sys,os,logging BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))) sys.path.append(BASE_DIR) from core.main import Mainprogram if __name__ == '__main__': selectsystem = Mainprogram() selectsystem.run()
config.py

#!/usr/bin/env python3 # -*- encoding = utf-8 -*- #author: heaven import os,sys,logging BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))) DBDIR = "/home/python" #存放學校信息目錄 SCHOOL_DATADIR = BASE_DIR + "/data/school/" #日志配置 LOGFILE = BASE_DIR + "/logs/service.log" logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=LOGFILE, filemode='a+') if __name__ == '__main__': print(SCHOOL_DATADIR)
main.py

#!/usr/bin/env python3 # -*- encoding: utf-8 -*- # author: heaven import os,sys,shelve,time BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASEDIR) from conf.config import * from modules.school import School from modules.course import Course from modules.grade import Grade from modules.student import Student from modules.teacher import Teacher class Mainprogram(object): '''程序接入類''' def __init__(self): pass def run(self): logging.debug('program begain running...') while True: logging.debug('進入選課系統') mainpage = ''' 歡迎進入選課系統 1.學員視圖 2.講師視圖 3.管理員 q.退出 ''' print('\033[1;35m{}\033[0m'.format(mainpage)) yourinput = input("\033[1;35m請輸入你的選擇: \033[0m").strip() logging.debug('你的選擇: ' + yourinput) if yourinput == "1": studen_view_obj = Student_view() studen_view_obj.run_student_view() # Student_view() elif yourinput == "2": teacher_view_obj = Teacher_view() teacher_view_obj.run_teacher_view() # Teacher_view() elif yourinput == "3": admin_view_obj = Admin_view() admin_view_obj.run_admin_view() # Admin_view() 最開始使用這種方式,后面發現雖然也能達到效果但是不符合規范,而且當需要調用另外一個類中的方法的時候就會很麻煩 elif yourinput == "q": logging.info('退出系統') sys.exit() else: print("\033[1;31m您的輸入不正確。\033[0m") logging.error('您的輸入不正確') class Student_view(object): '''學員視圖類,提供注冊,交學費,上課等功能''' def __init__(self): # with shelve.open(SCHOOL_DATADIR + "school.db",writeback = True ) as self.schooldata: # self.run_student_view() # self.schooldata = shelve.open(SCHOOL_DATADIR + "school.db",writeback = True) self.admin_view_obj = Admin_view() def __del__(self): self.admin_view_obj.schooldata.close() logging.info('調用student_view __del__') def run_student_view(self): logging.info('running run_student_view') self.admin_view_obj.school_list() #展示學校列表 self.your_choiseschool1 = input("\033[1;35m 請輸入你要進入的學校:\033[0m").strip() logging.info('您輸入的學校: ' + self.your_choiseschool1) self.your_choiseschool_obj = self.admin_view_obj.schooldata[self.your_choiseschool1] #將選擇學校實例賦值個一個變量your_choiseschool_obj方便調用,這步可能有點繞 for i in self.your_choiseschool_obj.school_grade: #展示該學校當前開設課程 grade_obj = self.your_choiseschool_obj.school_grade[i] print('''\033[1;35m 班級名稱: {} 班級所開課程: {} 班級講師: {} \n\n\033[0m'''.format(grade_obj.grade_name,grade_obj.grade_course,grade_obj.grade_teacher)) self.your_choisegrade = str(input("\033[1;35m請輸入你要登錄的班級: \033[0m").strip()) logging.info('您要登錄的班級' + self.your_choisegrade) self.grade_obj = self.admin_view_obj.schooldata[self.your_choiseschool1].school_grade[self.your_choisegrade] #實例化一個班級實例 print('\033[1;35m歡迎來到 國際精英培訓學院{}分院 \033[0m'.format(self.your_choiseschool1)) logging.info('進入國際精英培訓學院' + self.your_choiseschool1 + '分院') while True: student_view_page = ''' 1:學員注冊 2:學員登錄 3:學員注銷 r:返回上一級 q:退出登錄 ''' student_view_page_data = { '1':'student_registered', '2':'student_login', '3':'student_del', } print('\033[1;35m\n\n{}\n\n\033[0m'.format(student_view_page)) your_input4 = str(input("\033[1;35m請選擇: \033[0m").strip()) if your_input4 == "r": self.admin_view_obj.schooldata.close() #這個操作很重要,在退出這個頁面返回到上個頁面時候如果不關閉這個文件,在返回上級進入其他視圖的時候就會報錯,因為當一個文件通過shelve打開后,如果沒有關閉這個狀態,便不能再通過shelve再去打開。 break if your_input4 == "q": self.admin_view_obj.exit_program() if hasattr(self,student_view_page_data[your_input4]): getattr(self,student_view_page_data[your_input4])() else: print("\033[1;35m您的輸入有誤 !\033[0m") logging.error('您的輸入有誤' + your_input4) def student_registered(self): '''學員注冊''' logging.info('開始學員注冊') student_name = str(input("\033[1;35m請輸入你的姓名 \033[0m").strip()) if student_name in self.grade_obj.grade_student: print("\033[1;35m該學生已經存在。 \033[0m") logging.error('該學生已經存在' + student_name) else: student_passwd = str(input("\033[1;35m請設置你的用戶密碼: \033[0m").strip()) student_gender = str(input("\033[1;35m請設置你的性別: \033[0m").strip()) student_age = str(input("\033[1;35m請輸入你的年齡: \033[0m").strip()) self.grade_obj.add_grade_student(student_name,student_passwd,student_gender,student_age) print('''\033[1;35m\n恭喜添加{}用戶成功.\n\n 您所在的班級是: {} 您報名的課程是: {} 您的班級講師是: {}\033[0m'''.format(student_name,self.your_choisegrade,self.grade_obj.grade_course,self.grade_obj.grade_teacher)) logging.info(student_name + '用戶添加注冊成功') def student_login(self): '''學員登錄''' logging.info('開始學員登錄') student_name = str(input("\033[1;35m請輸入你的姓名 \033[0m").strip()) student_passwd = str(input("\033[1;35m請輸入你的密碼 \033[0m").strip()) self.student_obj = self.grade_obj.grade_student[student_name] #實例化學生對象 while True: if student_name in self.grade_obj.grade_student and student_passwd == self.student_obj.student_passwd: student_page = ''' 1.上課打卡 2.繳費 3.提交作業 4.查看我的信息 5.修改我的信息 6.提問 7.下課打卡 r.返回上級 q.退出 ''' student_page_data = { '1':'studen_clock_in', '2':'studen_paycost', '3':'studen_submitjob', '4':'studen_info', '5':'studen_changeinfo', '6':'studen_askquestions', '7':'studen_clock_out' } print("\033[1;35m恭喜你登陸成功,歡迎您{}\n{} \033[0m".format(student_name,student_page)) logging.info(student_name + '登錄成功') your_input5 = str(input("\033[1;35m請輸入你的選擇: \033[0m").strip()) if your_input5 == "r": break if your_input5 == "q": self.admin_view_obj.exit_program() if hasattr(self,student_page_data[your_input5]): getattr(self,student_page_data[your_input5])() else: print("\033[1;35m您的輸入不正確。 \033[0m") logging.error('您的輸入不正確' + your_input5) else: print("\033[1;35m您輸入的用戶不存在或者密碼錯誤。 \033[0m") logging.error('您輸入的用戶不存在或者密碼錯誤' + student_name) def student_del(self): '''學員注銷''' print("學員注銷") input_name = str(input("\033[1;35m請輸入注銷用戶的用戶名: \033[0m").strip()) input_passwd = str(input("\033[1;35m請輸入注銷用戶的用戶密碼: \033[0m").strip()) if input_name in self.grade_obj.grade_student and input_passwd == self.student_obj.student_passwd: self.grade_obj.grade_student.pop[input_name] print("\033[1;35m用戶{}刪除成功 \033[0m".format(input_name)) logging.info('用戶' + input_name + '刪除成功') else: print("\033[1;35m您輸入的用戶不存在或者密碼錯誤. \033[0m".format(input_name)) logging.error('您輸入的用戶不存在或者密碼錯誤' + input_name) def studen_clock_in(self): '''上課打卡''' print("上課打卡成功") logging.info('上課打卡成功') def studen_clock_out(self): '''下課打卡''' print("下課打卡成功") logging.info('下課打卡成功') def studen_paycost(self): '''繳費''' logging.info('開始繳費') course_obj1 = self.admin_view_obj.schooldata[self.your_choiseschool1].school_course[self.grade_obj.grade_course] #實例化當前課程,這一步需要仔細琢磨,我們是需要獲取到我們存儲在School類中school_course字典中的課程對象 print("\033[1;35m你報名的課程是{},需要支付{}元 \033[0m".format(self.grade_obj.grade_course,course_obj1.course_price)) logging.info('你報名的課程是' + self.grade_obj.grade_course + ',需要支付' + course_obj1.course_price + '元') your_input6 = str(input("\033[1;35m確認支付請輸入yes|YES,輸入其他視為放棄支付。 \033[0m").strip()) if your_input6 == "yes" or "YES": print("\033[1;34m 正在鏈接銀行......請稍等。\033[0m") logging.info('正在鏈接銀行......請稍等') print("\033[1;34m正在支付...... \033[0m") logging.info('正在支付......') time.sleep(2) self.student_obj.paycost_status = True print("\033[1;34m 恭喜你 ,支付完成,你已經繳費成功\033[0m") logging.info('支付完成,你已經繳費成功') else: print("\033[1;34m 您的輸入有誤。\033[0m") logging.error('您的輸入有誤') def studen_submitjob(self): '''提交作業''' print("提交作業成功") logging.info('提交作業成功') def studen_info(self): '''查看個人信息''' logging.info('查看個人信息') print( '''\033[1;34m\n\n您的詳細信息如下: \n\n\n 您的姓名: {} 您的性別: {} 您的年齡: {} 您所在的班級: {} 您所報課程: {} 您的繳費狀態: {} \033[0m'''.format(self.student_obj.student_name,self.student_obj.student_gender,self.student_obj.student_age,self.grade_obj.grade_name,self.grade_obj.grade_course,self.student_obj.paycost_status)) def studen_changeinfo(self): '''修改個人信息''' print("修改個人信息") logging.info('修改個人信息') def studen_askquestions(self): '''提問''' print("提問") logging.info('提問') class Teacher_view(object): '''講師視圖類,擁有講課功能,能查看交班級學生名單及成績''' def __init__(self): self.admin_view_obj = Admin_view() def __del__(self): self.admin_view_obj.schooldata.close() def run_teacher_view(self): logging.info('running run_teacher_view') self.admin_view_obj.school_list() #展示學校列表 self.your_choiseschool1 = input("\033[1;35m 請輸入你要進入的學校:\033[0m").strip() if self.your_choiseschool1 in self.admin_view_obj.schooldata: self.your_choiseschool_obj = self.admin_view_obj.schooldata[self.your_choiseschool1] teacher_name = str(input("\033[1;35m 請輸入你的講師姓名:\033[0m").strip()) teacher_passwd = str(input("\033[1;35m 請輸入你的登錄密碼:\033[0m").strip()) if teacher_name in self.your_choiseschool_obj.school_teacher and teacher_passwd == self.your_choiseschool_obj.school_teacher[teacher_name].teacher_passwd: # 判斷講師存在,且密碼正確 self.teacher_obj = self.your_choiseschool_obj.school_teacher[teacher_name] #實例化講師對象 print("\033[1;35m{}講師,歡迎你\033[0m".format(teacher_name)) logging.info('講師登錄成功,' + teacher_name) while True: teacher_page = ''' 1.講課 2.查看個人信息 3.查看班級學生名單 4.查看學生成績 5.修改個人信息 r.返回上一級 q.退出登錄 ''' teacher_page_data = { '1':'teacher_teaching', '2':'teacher_info', '3':'student_list', '4':'student_chengji', '5':'change_teacherinfo' } print("\033[1;35m{}\033[0m".format(teacher_page)) your_input7 = str(input("\033[1;35m 請輸入你的選擇:\033[0m").strip()) if your_input7 == "r": self.admin_view_obj.schooldata.close() break if your_input7 == "q": self.admin_view_obj.exit_program() if hasattr(self,teacher_page_data[your_input7]): getattr(self,teacher_page_data[your_input7])() else: print("\033[1;35m您的輸入有誤。\033[0m") logging.error('您的輸入有誤。' + your_input7) else: print("\033[1;35m您的輸的賬戶不存在或者密碼錯誤。\033[0m") logging.error('您的輸的賬戶不存在或者密碼錯誤') else: print("\033[1;35m您的輸入有誤。\033[0m") logging.error('您的輸入有誤。' + self.your_choiseschool1) def teacher_teaching(self): '''講課''' print("\033[1;35m開始講課 \033[0m") logging.info('開始講課') time.sleep(2) def teacher_info(self): '''講師個人信息''' logging.info('查看講師個人信息' + self.teacher_obj.teacher_name) print('''\033[1;35m\n講師個人信息如下: 講師名稱:{} 講師性別:{} 講師年齡:{} 講師工資:{} 講師電話號碼:{} \033[0m'''.format(self.teacher_obj.teacher_name,self.teacher_obj.teacher_gender,self.teacher_obj.teacher_age,self.teacher_obj.teacher_salary,self.teacher_obj.teacher_phonenumber)) def student_list(self): '''班級學生名單''' logging.info('查看班級學生名單') print("\033[1;35m 當前的班級如下: \033[0m") for i in self.your_choiseschool_obj.school_grade: print("\033[1;34m{}\033[0m".format(i)) your_input8 = str(input("\033[1;35m請輸入你要查看的班級名: \033[0m").strip()) if your_input8 in self.your_choiseschool_obj.school_grade: grade_obj = self.your_choiseschool_obj.school_grade[your_input8] #實例化班級對象,班級中存放了學生對象字典grade_student print("\033[1;34m\n\n{}學生列表如下: \033[0m".format(your_input8)) for j in grade_obj.grade_student: student_obj = grade_obj.grade_student[j] print('''\033[1;35m 姓名: {} 性別: {} 年齡: {} 繳費狀態: {} \033[0m'''.format(student_obj.student_name,student_obj.student_gender,student_obj.student_age,student_obj.paycost_status)) else: print("\033[1;35m您的輸入有誤。\033[0m") def student_chengji(self): '''查看學生成績''' print("學生成績列表(這個的方法和學生繳費的方法類似,鑒於時間問題,就不寫了)") def change_teacherinfo(self): '''修改講師個人信息''' logging.info('修改講師個人信息') print("\033[1;35m注意: 修改講師個人信息,不能修改姓名,姓名需與之前一樣。 \033[0m。") teacher_name = str(input("\033[1;35m請輸入講師姓名:\033[0m").strip()) teacher_passwd = str(input("\033[1;35m請輸入講師登錄密碼:\033[0m").strip()) teacher_gender = str(input("\033[1;35m請輸入講師性別:\033[0m").strip()) teacher_age = str(input("\033[1;35m請輸入講師年齡:\033[0m").strip()) teacher_phonenumber = str(input("\033[1;35m請輸入講師電話號碼:\033[0m").strip()) print('\033[1;35m你輸入的信息如下: \n 姓名: {}\n性別: {}\n年齡: {}\n電話號碼: {}\033[0m'.format(teacher_name,teacher_gender,teacher_age,teacher_salary,teacher_phonenumber)) your_input = str(input("\033[1;35m確認請輸入yes|YES,輸入其他視為取消修改。 :\033[0m").strip()) if your_input == "yes" or "YES": self.teacher_obj.teacher_name = teacher_name self.teacher_obj.teacher_passwd = teacher_passwd self.teacher_obj.teacher_gender = teacher_gender self.teacher_obj.teacher_age = teacher_age self.teacher_obj.teacher_phonenumber = teacher_phonenumber print('\033[1;35m 修改講師{}信息成功\033[0m'.format(teacher_name)) logging.info('修改講師' + teacher_name + '信息成功') else: print("\033[1;35m您取消了修改 \033[0m") logging.info('您取消了修改') class Admin_view(object): '''管理員視圖類,創建/刪除講師 創建/刪除班級 創建/刪除學校 創建/刪除課程 創建/刪除講師''' def __init__(self): # if os.path.exists(SCHOOL_DATADIR + "school.db"): self.schooldata = shelve.open(SCHOOL_DATADIR + "school.db",writeback = True) # with shelve.open(SCHOOL_DATADIR + "school.db",writeback = True ) as self.schooldata: # pass # self.run_admin_view() # else: # print("school.db文件不存在") def __del__(self): self.schooldata.close() logging.info('調用Admin_view __del__') def run_admin_view(self): logging.info('running run_admin_view') while True: logging.info('進入管理視圖') admin_view_page = ''' 1:添加學校 2:管理學校 3:查看學校列表 4:刪除學校 r:返回上一級 q:退出 ''' #將序號與方法通過字典關系起來 admin_view_page_data = { '1':'add_school', '2':'manage_school', '3':'school_list', '4':'del_school', 'q':'exit_program' } print('\033[1;35m{}\033[0m'.format(admin_view_page)) yourinput = input("\033[1;35m 請輸入你的選擇:\033[0m").strip() if yourinput == "r": self.schooldata.close() break if yourinput in admin_view_page_data: if hasattr(self,admin_view_page_data[yourinput]): getattr(self,admin_view_page_data[yourinput])() else: print("\033[1;31m您的輸入不正確。\033[0m") logging.error('您的輸入不正確' + yourinput) continue def add_school(self): #添加學校 logging.info('開始添加學校') school_name = str(input("\033[1;35m請輸入學校名稱: \033[0m").strip()) if school_name in self.schooldata: print("\033[1;31m該學校已經創建。\033[0m") logging.error('該學校已經創建') else: school_addr = str(input("\033[1;35m請輸入學校地址: \033[0m").strip()) self.schooldata[school_name] = School(school_name,school_addr) #將學校對象存儲於school.db文件中,通過shelve存儲模式 print("\033[1;32m學校添加成功。\033[0m") logging.info('學校添加成功') def school_list(self): '''顯示學校列表''' print("\033[1;34m當前學校列表如下: \n\033[0m") logging.info('顯示學校列表') for i in self.schooldata: print('\033[1;34m國際精英培訓學院{}分院\033[0m'.format(i)) def del_school(self): '''刪除學校''' logging.info('開始刪除學校') getattr(self,"school_list")() your_input = str(input("\033[1;31m請輸入你要刪除的學校名稱(輸入對應分校的名稱就行,如國際精英培訓學院山城分院,就只需要輸入山城。): \033[0m").strip()) print('\033[1;31m你將要刪除學校: {}\033[0m'.format(your_input)) if your_input in self.schooldata: your_comfirm = str(input("\033[1;31m確認請輸入yes|YES,輸入其他視為放棄。\033[0m").strip()) if your_comfirm == "yes" or "YES": del self.schooldata[your_input] print('\033[1;31m刪除學校{}成功\033[0m'.format(your_input)) logging.info('刪除學校' + your_input + '成功') else: print("\033[1;31m您取消了刪除操作。\033[0m") logging.info('您取消了刪除操作') else: print("\033[1;31m你輸入的學校不存在。\033[0m") logging.error('你輸入的學校不存在') def manage_school(self): '''管理學校''' logging.info('進入管理學校') getattr(self,"school_list")() your_choiseschool = str(input("\033[1;35m請輸入你要管理的學校名稱(輸入對應分校的名稱就行,如國際精英培訓學院山城分院,就只需要輸入山城。): \033[0m").strip()) while True: if your_choiseschool in self.schooldata: self.school_obj = self.schooldata[your_choiseschool] #將當前選擇的學校對象傳遞給school_obj print('\033[1;35m 歡迎來到國際精英人才培訓學院{}分院 \033[0m \n\n'.format(your_choiseschool)) manage_school_page = ''' 1:添加講師 2:添加班級 3:添加課程 4:查看講師列表 5:查看班級列表 6:查看學校開設課程列表 7:刪除講師 8:刪除班級 9:刪除課程 r:返回上級 q:退出程序 ''' #將序號與方法通過字典關系起來 manage_school_page_data = { '1':'add_teacher', '2':'add_grade', '3':'add_course', '4':'see_teacher_list', '5':'see_grade_list', '6':'see_course_list', '7':'del_teacher', '8':'del_grade', '9':'del_course', 'q':'exit_program' } print('\033[1;35m {} \033[0m'.format(manage_school_page)) your_choise1 = str(input("\033[1;35m 請輸入你的選擇: \033[0m").strip()) if your_choise1 == 'r': break if hasattr(self,manage_school_page_data[your_choise1]): getattr(self,manage_school_page_data[your_choise1])() else: print("\033[1;31m您的輸入有誤\033[0m") logging.error('你的輸入有誤' + your_choise1) else: print("\033[1;35m 您輸入的學校不存在\033[0m") logging.error('你輸入的學校不存在') break def add_teacher(self): #添加講師 logging.info('添加講師') teacher_name = str(input("\033[1;35m請輸入講師姓名:\033[0m").strip()) teacher_passwd = str(input("\033[1;35m請輸入講師登錄密碼:\033[0m").strip()) teacher_gender = str(input("\033[1;35m請輸入講師性別:\033[0m").strip()) teacher_age = str(input("\033[1;35m請輸入講師年齡:\033[0m").strip()) teacher_salary = str(input("\033[1;35m請輸入講師工資:\033[0m").strip()) teacher_phonenumber = str(input("\033[1;35m請輸入講師電話號碼:\033[0m").strip()) print('\033[1;35m你輸入的信息如下: \n 姓名: {}\n性別: {}\n年齡: {}\n工資: {}\n電話號碼: {}\033[0m'.format(teacher_name,teacher_gender,teacher_age,teacher_salary,teacher_phonenumber)) your_input = str(input("\033[1;35m確認請輸入yes|YES,重新輸入請輸入 r,退出請輸入 q。 :\033[0m").strip()) if your_input == "yes" or "YES": self.school_obj.add_schoolteacher(teacher_name,teacher_passwd,teacher_gender,teacher_age,teacher_salary,teacher_phonenumber) print('\033[1;35m 添加講師{}成功\033[0m'.format(teacher_name)) logging.info('添加講師成功' + teacher_name) elif your_input == "r": getattr("add_teacher") elif your_input == "q": getattr("exit_program") else: print("\033[1;35m您的輸入有誤 \033[0m") logging.error('你的輸入有誤' + your_input) def add_grade(self): #添加班級 logging.info('添加班級') grade_name = str(input("\033[1;35m請輸入班級名稱:\033[0m").strip()) if grade_name in self.school_obj.school_grade: print("\033[1;35m您添加的班級已經存在。 \033[0m") logging.error('您添加的班級已經存在' + grade_name) else: getattr(self,'see_teacher_list')() grade_teacher = str(input("\033[1;35m請為班級分配講師(輸入講師姓名): \033[0m").strip()) getattr(self,'see_course_list')() grade_course = str(input("\033[1;35m請輸入班級開班課程(輸入課程名稱): \033[0m").strip()) self.school_obj.add_schoolgrade(grade_name,grade_teacher,grade_course) print("\033[1;35m班級添加成功 \033[0m") logging.info('添加班級成功' + grade_name) def add_course(self): #添加課程 logging.info('添加課程') course_name = str(input("\033[1;35m請輸入添加的課程名稱:\033[0m").strip()) if course_name in self.school_obj.school_course: print("\033[1;35m您添加的課程已經存在。 \033[0m") logging.error('您添加的班級已經存在' + course_name) else: cource_cycle = str(input("\033[1;35m請輸入添加的課程的周期:\033[0m").strip()) course_price = str(input("\033[1;35m請輸入添加的課程的價格:\033[0m").strip()) self.school_obj.add_schoolcourse(course_name,cource_cycle,course_price) print("\033[1;35m課程添加成功 \033[0m") logging.info('添加課程成功' + course_name) def see_teacher_list(self): #查看講師列表 logging.info('查看講師列表') print("\033[1;35m本校當前教師列表如下: \033[0m") for i in self.school_obj.school_teacher: teacher_obj = self.school_obj.school_teacher[i] print('''\033[1;35m 講師名稱:{} 講師性別:{} 講師年齡:{} 講師工資:{} 講師電話號碼:{} \n\n\n\033[0m'''.format(teacher_obj.teacher_name,teacher_obj.teacher_gender,teacher_obj.teacher_age,teacher_obj.teacher_salary,teacher_obj.teacher_phonenumber)) def see_grade_list(self): #查看班級列表 logging.info('查看班級列表') print("\033[1;35m本校當前班級列表如下: \033[0m") for i in self.school_obj.school_grade: grade_obj = self.school_obj.school_grade[i] print('''\033[1;35m 班級名稱: {} 班級所開課程: {} 班級講師: {} \n\n\033[0m'''.format(grade_obj.grade_name,grade_obj.grade_course,grade_obj.grade_teacher)) def see_course_list(self): #查看課程列表 logging.info('查看課程列表') print("\033[1;35m 當前學校開設課程情況如下: \033[0m") for i in self.school_obj.school_course: course_obj = self.school_obj.school_course[i] print('''\033[1;35m 課程名稱: {} 課程周期: {} 課程價格: {} \n\n\033[0m'''.format(course_obj.course_name,course_obj.cource_cycle,course_obj.course_price)) def del_teacher(self): #刪除講師 logging.info('刪除講師') getattr(self,'see_teacher_list')() your_input1 = str(input("\033[1;35m請輸入你要刪除的講師姓名: \033[0m").strip()) if your_input1 in self.school_obj.school_teacher: self.school_obj.school_teacher.pop(your_input1) print('\033[1;35m講師{}刪除成功。 \033[0m'.format(your_input1)) logging.info('刪除講師成功' + your_input1) else: print("\033[1;35m你輸入的講師不存在。\033[0m") logging.error('您輸入的講師不存在' + your_input1) pass def del_grade(self): #刪除班級 logging.info('刪除班級') getattr(self,'see_grade_list')() your_input3 = str(input("\033[1;35m請輸入你要刪除的班級名稱: \033[0m").strip()) if your_input3 in self.school_obj.school_grade: self.school_obj.school_grade.pop(your_input3) print('\033[1;35m班級{}刪除成功。 \033[0m'.format(your_input3)) logging.info('刪除班級成功' + your_input3) else: print("\033[1;35m你輸入的班級不存在。\033[0m") logging.error('您輸入的講師不存在' + your_input3) def del_course(self): #刪除課程 logging.info('刪除課程') getattr(self,'see_course_list')() your_input2 = str(input("\033[1;35m請輸入你要刪除的課程名稱: \033[0m").strip()) if your_input2 in self.school_obj.school_course: self.school_obj.school_course.pop(your_input2) print('\033[1;35m課程{}刪除成功。 \033[0m'.format(your_input2)) logging.info('刪除課程成功' + your_input2) else: print("\033[1;35m你輸入的課程不存在。\033[0m") logging.error('您刪除的講師不存在' + your_input2) def return_previouspage(self): #返回 通過映射功能返回上一級,么有實現這個,貌似直接將break寫到這個函數里面並不管用,后續繼續研究方法。 pass def exit_program(self): #退出選課系統 self.schooldata.close() logging.info('退出選課系統') sys.exit("\033[1;32m拜拜。。0.0 感謝使用選課系統! ^.^\033[0m") if __name__ == "__main__": selectsystem = Mainprogram() selectsystem.run()
course.py

#!/usr/bin/env python3 # -*- encoding: utf-8 -*- # author: heaven class Course(object): '''課程類,定義課程名稱,周期,價格''' def __init__(self,course_name,course_cycle,course_price): self.course_name = course_name self.cource_cycle = course_cycle self.course_price = course_price
grade.py

#!/usr/bin/env python3 # -*- encoding: utf-8 -*- # author: heaven from modules.student import Student class Grade(object): '''班級類,定義班級類名稱,班級講師,綁定班級課程,班級包含的學生''' def __init__(self,grade_name,grade_teacher,grade_course): self.grade_name = grade_name self.grade_teacher = grade_teacher self.grade_course = grade_course self.grade_student = {} def add_grade_student(self,student_name,student_passwd,student_gender,student_age): newstudent = Student(student_name,student_passwd,student_gender,student_age) self.grade_student[student_name] = newstudent
school.py

#!/usr/bin/env python3 # -*- coding: utf-8 -*- #author: heaven from modules.teacher import Teacher from modules.course import Course from modules.grade import Grade class School(object): '''學校類,定義學校名,地址,以及學校包含的課程,班級,老師''' def __init__(self,school_name,school_addr): self.school_name = school_name self.school_addr = school_addr self.school_course = {} #學校包含的課程實例 self.school_grade = {} #學校包含的班級實例 self.school_teacher = {} #學校包含的講師實例 def add_schoolteacher(self,teacher_name,teacher_passwd,teacher_gender,teacher_age,teacher_salary,teacher_phonenumber): '''添加學校講師對象到self.school_teacher字典中''' newteacher = Teacher(teacher_name,teacher_passwd,teacher_gender,teacher_age,teacher_salary,teacher_phonenumber) self.school_teacher[teacher_name] = newteacher def add_schoolcourse(self,course_name,course_cycle,course_price): '''添加課程對象到self.school_course字典中''' newcourse = Course(course_name,course_cycle,course_price) self.school_course[course_name] = newcourse def add_schoolgrade(self,grade_name,grade_teacher,grade_course): '''添加班級對象到self.school_grade字典中''' newgrade = Grade(grade_name,grade_teacher,grade_course) self.school_grade[grade_name] = newgrade
student.py

#!/usr/bin/env python3 # -*- encoding = utf-8 -*- #author: heaven class Student(object): '''學生類,定義學生的姓名,登錄密碼,性別,年齡,繳費狀態(默認是False)''' def __init__(self,student_name,student_passwd,student_gender,student_age,paycost_status=False): self.student_name = student_name self.student_passwd = student_passwd self.student_gender = student_gender self.student_age = student_age self.paycost_status = paycost_status
teacher.py

#!/usr/bin/env python3 # -*- encoding: utf-8 -*- # author: heaven class Teacher(object): '''講師類,定義講師姓名,講師登錄密碼,性別,年齡,工資,電話''' def __init__(self,teacher_name,teacher_passwd,teacher_gender,teacher_age,teacher_salary,teacher_phonenumber): self.teacher_name = teacher_name self.teacher_passwd = teacher_passwd self.teacher_gender = teacher_gender self.teacher_age = teacher_age self.teacher_salary = teacher_salary self.teacher_phonenumber = teacher_phonenumber