Python開發程式:選課系統

来源:http://www.cnblogs.com/lianzhilei/archive/2016/09/02/5832691.html
-Advertisement-
Play Games

本節作業: 選課系統 角色:學校、學員、課程、講師要求:1. 創建北京、上海 2 所學校2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開3. 課程包含,周期,價格,通過學校創建課程 4. 通過學校創建班級, 班級關聯課程、講師5. 創建學員 ...


本節作業: 選課系統

角色:學校、學員、課程、講師
要求:
1. 創建北京、上海 2 所學校
2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,周期,價格,通過學校創建課程 
4. 通過學校創建班級, 班級關聯課程、講師
5. 創建學員時,選擇學校,關聯班級
5. 創建講師角色時要關聯學校, 
6. 提供兩個角色介面
7. 學員視圖, 可以註冊, 交學費, 選擇班級,
8. 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績 
9. 管理視圖,創建講師, 創建班級,創建課程

10. 上面的操作產生的數據都通過pickle序列化保存到文件里

 

程式:

1、最最重要的readme:

### 作者介紹:
* author:lzl
### 博客地址:
* http://www.cnblogs.com/lianzhilei/p/5813986.html

### 功能實現
    1. 創建北京、上海 2 所學校
    2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
    3. 課程包含,周期,價格,通過學校創建課程
    4. 通過學校創建班級, 班級關聯課程、講師
    5. 創建學員時,選擇學校,關聯班級
    5. 創建講師角色時要關聯學校,
    6. 提供兩個角色介面
    6.1 學員視圖, 可以註冊, 交學費, 選擇班級,
    6.2 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績
    6.3 管理視圖,創建講師, 創建班級,創建課程
    7. 上面的操作產生的數據都通過pickle序列化保存到文件里
    (所有功能均實現)

###程式需知
    1. 當前資料庫已建立好信息,可以直接進行查看增加
        北京  課程:Python   講師:金角大王     班級:S14      學員:我要學python
              課程:Linux    講師:銀角大王     班級:L01      學員:我要學Linux
        上海  課程:Go       講師:天棚元帥     班級:G01      學員:我要學GO
    2. 也可以把database下的兩個資料庫文件刪除掉,數據清空,執行程式,資料庫進行初始化,初始化只生成北京、上海學校名
    3. 資料庫結構main_dict 儲存主要的邏輯結構:
        {學校名:{課程名1:{"teacher":講師,"grade":班級},課程名2:{"teacher":講師2,"grade":班級2}},
        學校名:{課程名3:{"teacher":講師3,"grade":班級3},課程名4:{"teacher":講師4,"grade":班級4}}}
        存儲的數據類型都為實例對象
       資料庫結構teacher_dict 存儲講師與班級的對應關係,用於方便講師登錄系統認證,結構為
        {講師:{grade:班級}
        兩個資料庫文件均可擴展
    4. 程式實現了以下嚴格限制:
       ①一個學校裡面不能出現同名的課程
       ②一個課程只能有一個講師
       ③講師被聘用後,不能再進行聘用,一個講師也只能教一門課程(教python,就不能再教linux了)
       ④班級只能對應一門課程,班級名只能出現一次,不能重覆(python班級s14,linux的班級就不能再出現s14班級了)

###後期擴展
     程式沒有定義學生類,後期可定義類,添加學生屬性(年齡,成績),對可學生成績信息進行修改,把功能添加到教師中心,很顯然
     我沒時間了。。。。。
     程式按功能分出不同的模塊,可以更簡潔
Readme

 

2、程式目錄結構

 

3、資料庫:

main_dict和teacher_dict兩個資料庫文件可不創建,運行程式自動生成

�}q (c__main__
School
q)�q}q(X   nameqX   北京qX   addrqX       北京市qub}q(c__main__
Course
q    )�q
}q(X   priceqX   9900q
hX   PythonqX   timeqX   7qub}q(X   teacherqc__main__
Teacher
q)�q}q(X   roleqX   講師qX   schoolqhhX   金角大王qX   ageqX   33qX   courseqX   PythonqubX   gradeqc__main__
Grade
q)�q }q!(hhX   studentq"cbuiltins
set
q#]q$�q%Rq&hX   Pythonq'hX   S14q(ubuh    )�q)}q*(hX   9000q+hX   Linuxq,hX   8q-ub}q.(hh)�q/}q0(hhhhhX   銀角大王q1hX   25q2hX   Linuxq3ubhh)�q4}q5(hh1h"h#]q6�q7Rq8hX   Linuxq9hX   L01q:ubuuh)�q;}q<(hX   上海q=hX       上海市q>ub}q?h    )�q@}qA(hX   8000qBhX   GoqChX   9qDub}qE(X   teacherqFh)�qG}qH(hX   講師qIhh=hX   天蓬元帥qJhX   25qKhX   GoqLubX   gradeqMh)�qN}qO(hhJh"h#]qP�qQRqRhX   GoqShX   S01qTubusu.
main_dict
�}q (c__main__
Teacher
q)�q}q(X   roleqX   講師qX   schoolqX   北京qX   nameqX   金角大王q    X   ageq
X   33qX   courseqX   Pythonq
ub}qX   gradeqc__main__
Grade
q)�q}q(X   teacherqh    X   studentqcbuiltins
set
q]qX   我要學pythonqa�qRqhX   PythonqhX   S14qubsh)�q}q(hX   講師qhX   北京qhX   銀角大王q h
X   25q!hX   Linuxq"ub}q#X   gradeq$h)�q%}q&(hh hh]q'X   我要學linuxq(a�q)Rq*hX   Linuxq+hX   L01q,ubsh)�q-}q.(hX   講師q/hX   上海q0hX   天蓬元帥q1h
X   25q2hX   Goq3ub}q4X   gradeq5h)�q6}q7(hh1hh]q8X   我要學go語言q9a�q:Rq;hX   Goq<hX   S01q=ubsu.
teacher_dict

 

4、程式main.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian

import pickle,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#數據地址
__db_main = BASE_DIR + r"\database\main_dict"
__db_teacher = BASE_DIR + r"\database\teacher_dict"

class School(object):
   #創建學校
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr

    def cat_school(self):
        print("學校名:【%s】\t地址:【%s】"%(self.name,self.addr))

    def hire_teacher(self,dict,course,teacher,file):
        #資料庫添加講師信息
        dict[self][course] = {"teacher":teacher}
        file_oper(file,"wb", dict)

    def create_course(self,dict,course,file):
        # 資料庫添加課程資料
        dict[self][course]={}
        file_oper(file,"wb", dict)

    def create_grade(self,dict,teacher_dict,course,grade,teacher,file1,file2):
        #資料庫添加班級信息
        dict[self][course]["grade"] = grade
        file_oper(file1, "wb", dict)
        teacher_dict[teacher] = {"grade":grade}
        file_oper(file2, "wb", teacher_dict)

class Course():
    #創建課程
    def __init__(self,name,price,time):
        self.name = name
        self.price = price
        self.time = time

    def cat_course(self):
        #查看課程信息
        print("課程:【%s】\t價格:【¥%s】\t周期:【%s個月】"
              %(self.name,self.price,self.time))

class Grade():
    # 創建班級
    def __init__(self,name,course,teacher):
        student = set([])
        self.name = name
        self.course = course
        self.teacher = teacher
        self.student = student

    def cat_grade(self):
        #查看班級信息
        print("班級:【%s】\t課程:【%s】\t講師:【%s】"
              %(self.name, self.course, self.teacher))

    def add_student(self,student_name,dict,teacher,file):
        self.student.add(student_name)
        dict[teacher]={"grade":self}
        file_oper(file, "wb", dict)

class People():
    def __init__(self,name,age):
        self.name = name
        self.age = age

class Teacher(People):
    # 創建講師
    def __init__(self,name,age,school,course,role="講師"):
        super(Teacher,self).__init__(name,age)
        self.role = role
        self.school = school
        self.course = course

    def cat_teacher(self):
        #查看老師資料和課程
        print('課程【%s】\t講師【%s】'%(self.course,self.name))


def file_oper(file,mode,*args):
    #資料庫寫入、讀取操作
    if mode == "wb":
        with open(file, mode) as f:
            dict = args[0]
            f.write(pickle.dumps(dict))

    if mode == "rb":
        with open(file, mode) as f:
            dict = pickle.loads(f.read())
            return dict

def information(dict,mode,*args):
    '''通過匹配mode模式,列印相應的輸出信息'''
    if args:
        dict_info, set_info = {}, args[0]
    else:
        dict_info,set_info = {},set([])
    if dict:
        for key in dict:
            if mode == "course":
                key.cat_course()
            if mode == "main":
                key.cat_school()
            if mode == "teacher" and key == "teacher":
                dict[key].cat_teacher()
                # dict_info[key] = dict[key]
                set_info.add(dict[key].name)
            if mode == "grade" and key == "grade":
                dict[key].cat_grade()
                set_info.add(dict[key].name)
            if mode == "teacher_center":
                pass
            if type(key) != str:        #key值不是字元串
                dict_info[key.name] = key
    return dict_info,set_info

def school_center():
    #學校管理中心
    Flag = True
    while Flag:
        dict_main = file_oper(__db_main,"rb")       #主字典
        res_dict = information(dict_main,"main")[0]    #列印學校信息
        school_name = input("\33[34;0m輸入要選擇的學校名\33[0m:").strip()
        if school_name in res_dict:
            school = res_dict[school_name]          #匹配選擇的學校
            while Flag:
                print("\33[32;1m歡迎進入【%s】學校\33[0m".center(50, "*")%school.name)
                choice = options(list_school)       #列印當前選項
                if choice == "1":
                    while True:
                        print("\33[32;0m學校【%s】目前已經有的班級信息\33[0m".center(40, "-")%school.name)
                        teacher_dict = file_oper(__db_teacher,"rb")
                        res_course = information(dict_main[school], "None")[0]
                        set_info = set([])
                        if res_course:  # 列印課程與講師對應關係
                            for i in res_course:
                                k = res_course[i]
                                res_grade = information(dict_main[school][k], "grade",set_info)[1]
                        if_cont = input("\n\33[34;0m是否要創建班級 【y】創建 【b】退出\33[0m:")
                        if if_cont == "y":
                            grade_name = input("\33[34;0m輸入要創建班級的名稱\33[0m:").strip()
                            course_name = input("\33[34;0m輸入要班級要上的課程\33[0m:").strip()
                            if course_name in res_course:
                                course = res_course[course_name]
                                if dict_main[school][course]:
                                    teacher = dict_main[school][course]["teacher"]
                                    if grade_name not in res_grade:
                                        grade = Grade(grade_name, course_name, teacher.name)
                                        school.create_grade(dict_main, teacher_dict, course, grade, teacher, __db_main,
                                                        __db_teacher)
                                    else:
                                        print("\33[31;0m錯誤:當前班級已經存在\33[0m")
                                else:
                                    print("\33[31;0m錯誤:當前課程還沒有講師\33[0m")
                            else:
                                print("\33[31;0m錯誤:課程【%s】不存在,請先創建課程\33[0m" % course_name)
                        if if_cont == "b":
                            break

                if choice == "2":
                    #招聘講師
                    while True:
                        print("\33[32;0m學校【%s】目前已經有的課程與講師\33[0m".center(40, "-")%school.name)
                        res_course = information(dict_main[school],"None")[0]
                        set_info = set([])
                        if res_course:                  #列印課程與講師對應關係
                            for i in res_course:
                                k = res_course[i]
                                res_teacher = information(dict_main[school][k], "teacher",set_info)[1]
                                if not res_teacher:
                                    print("課程【%s】\t講師【None】" %(i))
                        if_cont = input("\n\33[34;0m是否要招聘講師 【y】招聘 【b】退出\33[0m:")
                        if if_cont == "y":
                            teacher_name = input("\33[34;0m輸入要招聘講師的名字\33[0m:").strip()
                            teacher_age = input("\33[34;0m輸入要招聘講師的年齡\33[0m:").strip()
                            course_name = input("\33[34;0m輸入講師【%s】要授課的課程\33[0m:"%teacher_name).strip()
                            if course_name in res_course:
                                    course = res_course[course_name]        #創建講師並寫入資料庫
                                    if teacher_name not in res_teacher:
                                        teacher = Teacher(teacher_name,teacher_age,school.name,course_name)
                                        school.hire_teacher(dict_main, course, teacher, __db_main)
                                    else:
                                        print("\33[31;0m錯誤:教師【%s】已經被聘用\33[0m" %teacher_name)
                            else:
                                print("\33[31;0m錯誤:課程【%s】不存在,請先創建課程\33[0m" %course_name)
                        if if_cont == "b":
                            break

                if choice == "3":
                    #創建課程
                    while True:
                        print("\33[32;0m學校【%s】目前已經有的課程\33[0m".center(40,"-")%school.name)
                        res_dict = information(dict_main[school],"course")[0]     #列印課程信息賦值給字典course_dict
                        if_cont = input("\n\33[34;0m是否要創建課程 【y】創建 【b】退出\33[0m:")
                        if if_cont == "y":
                            course_name = input("\33[34;0m輸入要創建的課程\33[0m:").strip()
                            if course_name not in res_dict:     #課程不存在,創建
                                price = input("\33[34;0m輸入課程 【%s】 的價格\33[0m:" % (course_name))
                                time = input("\33[34;0m輸入課程 【%s】 的周期(月)\33[0m:" % (course_name))
                                course = Course(course_name, price, time)   #創建課程course
                                school.create_course(dict_main,course, __db_main)   #關聯學校和課程
                            else:                                   #課程存在
                                print("\33[31;0m錯誤:當前課程 【%s】 已經存在\33[0m" % (course_name))
                        if if_cont == "b":
                            break

                if choice == "4":
                    Flag = False
        if Flag:
            print("\33[31;0m錯誤:輸入的學校 【%s】 不存在\33[0m"%(school_name))


def teacher_center():
    #講師中心
        print("\33[32;1m歡迎進入講師中心\33[0m".center(50, "*"))
        teacher_dict = file_oper(__db_teacher, "rb")
        dict_info = information(teacher_dict,"teacher_center")[0]   #驗證登錄
        teacher_name = input("\n\33[34;0m輸入要登錄講師的名字\33[0m:").strip()
        if teacher_name in dict_info:
            while True:
                print("\33[32;1m歡迎進入講師【%s】的管理中心\33[0m".center(40, "*")%teacher_name)
                choice = options(list_teacher)
                teacher = dict_info[teacher_name]
                grade = teacher_dict[teacher]["grade"]
                if choice == "1":
                    print("\33[32;0m講師【%s】的班級信息\33[0m".center(40,"-")%teacher.name)
                    print("學校【%s】\t課程【%s】\t班級【%s】\t"%(teacher.school,teacher.course,grade.name))
                    any = input("\n\33[34;0m輸入任意鍵退出當前\33[0m:")
                if choice == "2":
                    print("\33[32;0m講師【%s】的班級學員列表\33[0m".center(40, "-") % teacher.name)
                    print("班級【%s】\n學員【%s】"%(grade.name,grade.student))
                    any = input("\n\33[34;0m輸入任意鍵退出當前\33[0m:")
                if choice == "3":
                    break
        else:
            print("\33[31;0m錯誤:講師【%s】 不存在\33[0m"%(teacher_name))

def student_center():
    #學員中心
    print("\33[32;1m歡迎進入學員中心中心\33[0m".center(50, "*"))
    while True:
        choice = options(list_student)          #列印學生中心選項
        if choice == "1":
            student_name = input("\33[34;0m輸入學員的名字\33[0m:")
            dict = file_oper(__db_main, "rb")
            teacher_dict = file_oper(__db_teacher,"rb")
            school_dict = information(dict,"main")[0]   #列印當前可選的學校
            school_name = input("\33[34;0m輸入要選擇的學校名\33[0m:").strip()
            if school_name in school_dict:
                school = school_dict[school_name]
                if dict[school]:
                    course_dict = information(dict[school],"course")[0]  # 列印當前學校下的課程
                    course_name = input("\33[34;0m輸入要選擇的課程\33[0m:").strip()
                    if course_name in course_dict:
                        course = course_dict[course_name]
                        if dict[school][course].get("grade"):
                            for i in teacher_dict:
                                if course.name == i.course:
                                    teacher = i
                                    grade = teacher_dict[teacher]["grade"]
                            print("課程【%s】的費用為【%s】"%(course.name,course.price))
                            if_pay = input("\33[34;0m是否支付當前費用 支付【y】\33[0m:")
                            if if_pay == "y":           #上面全部匹配成功,選課成功
                                grade.add_student(student_name,teacher_dict,teacher,__db_teacher)
                                print("\33[31;0m選課成功\33[0m")
                                any = input("\n\33[34;0m輸入任意鍵退出當前\33[0m:")
                        else:
                            print("\33[31;0m錯誤:課程沒有班級\33[0m")
                    else:
                        print("\33[31;0m錯誤:課程不存在\33[0m")
                else:
                    print("\33[31;0m錯誤:當前學校沒有課程\33[0m")
        if choice == "2":
            break

def options(list):
    #列印可選擇的操作模式,並返回選擇值
    for i, v in enumerate(list):
        print(i+1, v)
    choice = input("\33[34;0m選擇要進入模式\33[0m:")
    return choice

def start():
    '''程式開始'''
    while True:
        print("\33[35;1m歡迎進入選課系統\33[0m".center(50, "#"))
        choice = options(list_main)      #列印選項
        if choice == "1":
            student_center()        #學生中心
        if choice == "2":
            teacher_center()        #教師中心
        if choice == "3":
            school_center()         #學校中心
        if choice == "4":
            break

def init_database():
    '''資料庫初始化,不存在則創建,存在跳過'''
    bj = School("北京","北京市")
    sh = School("上海","上海市")
    if not os.path.exists(__db_teacher):
        dict = {bj:{},sh:{}}
        file_oper(__db_main,"wb",dict)
    if not os.path.exists(__db_teacher):
        dict = {}
        file_oper(__db_teacher,"wb",dict)


if __name__ == '__main__':
    init_database()        #初始化資料庫
    list_main = ["學生中心", "講師中心", "學校中心","退出"]
    list_school = ["創建班級", "招聘講師", "創建課程","返回"]
    list_teacher = ["查看班級", "查看班級學員列表","返回" ]
    list_student = ["學員註冊","返回"]
    start()

 

5、程式運行過程的簡略圖

*********************學校中心***********************

 

*********************學生中心***********************

 

 

*********************講師中心***********************


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 自己設計的一個mysql資料庫批量添加數據的基類。用於批量向mysql資料庫添加數據,子類實現起來很簡單,自測性能也還不錯。 1、基類實現-BatchAddBase 2、一個簡單的子類實現-PersonAddHelper 3、控制台項目,使用示例 4、源碼示例地址:http://files.cnbl ...
  • 芒果TV For Win10商店內測版 v3.1.6 於2016年9月1日星期四下午正式登陸商店,主要是優化手機版視頻下載相關設置、策略、風險提示,並升級相容目標,率先支持Xbox One平臺,覆蓋更多用戶,提供更廣泛更統一的全屏體驗。 ...
  • 一、項目背景 我們是傳統行業,但是我們有一顆不傳統的心。企業用戶遍佈國內和國外,面對行業,要建設行業級的(大)數據平臺。一提到大數據平臺,大家往往想到Hadoop、Spark、Nosql、分散式等等,我只能說我們還比較低級,但是後期肯定會涉及到這些技術。做大數據平臺是有風險的,拋開絕技術方面,應該從 ...
  • Asp.net MVC中的ViewData與ViewBag ViewData ViewBag 它是Key/Value字典集合 它是dynamic類型對像 從Asp.net MVC 1 就有了 ASP.NET MVC3 才有 基於Asp.net 3.5 framework 基於Asp.net 4.0與 ...
  • /** * 組合微信app支付 獲得prepayid * @param int $order_num */ private function _wxpay_request($order_num = 0) { //判斷訂單編號必須是數組並且不為0 check_order_num($order_num) ...
  • 一、HTTPS簡介 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),簡單來講就是加了安全的HTTP,即HTTP+SSL;我們知道HTTP通訊時,如果客戶端C請求伺服器S,那麼可以通過網路抓包的形式來獲取信息,甚至可以模擬伺服器 ...
  • //壓入首字母 foreach ($res as $k => $v) { $res[$k]['first'] = strtoupper(substr(trim($v['name']), 0, 1)); $arr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', ' ...
  • array_sum(array_column($attr, '欄位')); ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...