要求:
1. 创建北京、上海 2 所学校 class
2. 创建linux , python , go 3个课程 , linuxpy 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
上面的操作产生的数据都通过pickle序列化保存到文件里
思路分析:
project的文件结构
bin#主程序进入
bin.py
core#逻辑程序
schoole.py
class School
teacher.py
class Teacher
course.py
class Course
clas_s.py
class Class
student.py
class Student
lib#特殊功能
base.py#文件写入和md5计算
class Write
class Md5
log.py#日志类文件
db#数据库
school#学校数据
student#学生数据
teacher#老师数据
course#课程数据
class_s#班级数据
构思功能
1.bin为主文件,调用其他模块所以需要加一个环境变量,我有2层文件夹,所以使用os,sys模块添加
import os, sys sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
2.school创建一个类,学校要包含 学校名称 学校地址 学校网站 学校电话 校长 如下:
1 class School(bace.write): 2 def __init__(self, name, xiaozhang, address,www): 3 self.name = name#学校名称 4 self.xz = xiaozhang#校长 5 self.addr = address#学校地址 6 self.www = www#学校网站 7 self.phone = phone #学校联系电话
3.需要将school创建的对象写入文件,用pickle将文件写入。因为需要一个文件绝对路径,所以需要拼接一个,要保证每次都不一样,固使用time时间戳和md5转换成一个文件名。再os拼接文件路径。
1 import os, pickle, time, hashlib 2 3 PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 4 5 def Md5(): 6 '''生成一个文件名称''' 7 t = time.time() # 读取时间戳 8 obj = hashlib.md5() # 创建MD5对象 9 obj.update(str(t).encode("utf-8")) 10 return obj.hexdigest() 11 12 def file(type): 13 ''' 14 返回文件绝对路径 15 :param type: 存在哪个路径 16 :param filename: 文件名称 17 :return: 返回文件的绝对路径 18 ''' 19 return os.path.join(PATH,"db",type,Md5()) 20 21 class write: 22 '''写入文件''' 23 def __init__(self,addr): 24 self.path = addr#文件的绝对路径 25 def save(self): 26 with open(self.path,"wb") as f: 27 pickle.dump(self,f)
4.我可以写入文件,也可以读取文件。而且文件还不止一个,读取文件夹内文件有os模块即可,多个文件用for循环。可以将读取的对象加编号,打印用于用户方便选择。自己写,俺不写了!
1 SCHOOLE_PATH = os.path.join(PATH,"school") #学校的数据库文件夹拼接 2 def read(): 3 li = []#用于存读取的对象 4 file_li = os.listdir(SCHOOLE_PATH)#读取文件夹内的所有文件 5 for i in file_li:#循环文件列表 6 file = os.path.join(SCHOOLE_PATH,i)#拼接文件路径 7 with open(file,"rb") as f:#打开文件 8 a =pickle.load(f)#读取数据 9 li.append(a)#将对象添加到列表中 10 print(a.name)#可以打印此对象的数据属性 11 return li#将对象列表返回用于其他关联
5.读取都可以了,就可以做下一个类了。teacher类同学校,在生成构造方法init 可以将学校的对象取出放在老师对象中即可就是使用组合方法。其他同理。
1 def t_bin(): 2 '''老师逻辑''' 3 path = os.path.join(BASE_PATH, "db", "school")#老师数据文件路径 4 print("1.查看老师 2.添加老师 3.老师离职") 5 user_c = str(input(">>>")).strip() 6 if user_c == "1": 7 a = teacher.Teacher.show()#老师类里写的 类方法 8 elif user_c == "2": 9 a = school.School.show()#调用学校类的类方法读取所有学校数据 10 scc = str(input(">>>")).strip()#选择学校 11 if scc.isdigit(): 12 scc = int(scc) 13 else: 14 return 0 15 xx = teacher.user_input()#老师模块的输入函数,返回一个元组 16 s = teacher.Teacher(xx[0], xx[1], xx[2], a[scc - 1])#此处绑定对象就可以 17 s.save()#执行一个储存的方法,来自继承 18 elif user_c == "3": 19 pass 20 else: 21 print("33[31;1m输入错误33[1m")
6.写组合逻辑 bin内,将每个模块的逻辑写到一个函数内
1 #!/usr/bin/env python 2 # -*- coding=utf-8 -*- 3 # Time: 2016/12/15 AM11:11 4 # author: 郑建文 5 # Filename: bin.py 6 # blog:www.hairuinet.com 7 # Version: 1.0 8 9 import os, sys 10 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 11 from core import school, teacher, coures, class_school, student 12 from lib import log 13 14 sys.path.append(os.path.dirname(os.path.abspath(__file__))) 15 BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 16 17 18 def s_bin(): 19 '''school逻辑''' 20 print("学校系统".center(50, "+")) 21 print("1.查看学校 2.添加学校") 22 user_c = str(input(">>>")).strip() 23 if user_c == "1": 24 school.School.show() 25 elif user_c == "2": 26 date = school.user_input() 27 a = school.School(date[0], date[1], date[2]) 28 a.save() 29 else: 30 print("输入有误") 31 32 33 def t_bin(): 34 '''老师逻辑''' 35 path = os.path.join(BASE_PATH, "db", "school") 36 print("1.查看老师 2.添加老师 3.老师离职") 37 user_c = str(input(">>>")).strip() 38 if user_c == "1": 39 a = teacher.Teacher.show() 40 elif user_c == "2": 41 a = school.School.show() 42 scc = str(input(">>>")).strip() 43 if scc.isdigit(): 44 scc = int(scc) 45 else: 46 return 0 47 xx = teacher.user_input() 48 s = teacher.Teacher(xx[0], xx[1], xx[2], a[scc - 1]) 49 s.save() 50 elif user_c == "3": 51 pass 52 else: 53 print("33[31;1m输入错误33[1m") 54 55 56 def c_bin(): 57 '''课程逻辑''' 58 print("1.查看课程 2.添加课程 3.删除课程") 59 user_c = str(input(">>>")).strip() 60 if user_c == "1": 61 coures.Course.show() 62 elif user_c == "2": 63 s = school.School.show() 64 u_s = str(input("选择学校:")).strip() 65 data = coures.user_input() 66 t = teacher.Teacher.show() 67 c_t = str(input("选择老师:")).strip() 68 kc = coures.Course(data[0], data[1], data[2], 69 t[int(c_t) - 1], s[int(u_s) - 1]) 70 kc.save() 71 else: 72 print("输入错误") 73 74 75 def cls_bin(): 76 while True: 77 print("33[36;1m1.查看班级 2.新班开课 3.返回33[1m") 78 user_c = str(input(">>>")).strip() 79 if user_c == "1": 80 class_school.Class.show() 81 elif user_c == "2": 82 print("班级开课系统".center(50, "+")) 83 a = school.School.show() 84 u_a = input("选择校区:").strip() 85 xx = class_school.user_input() 86 t = teacher.Teacher.show() 87 u_t = input("选择任教老师:").strip() 88 bj = class_school.Class(xx, a[int(u_a) - 1], t[int(u_t) - 1]) 89 bj.save() 90 elif user_c == '3': 91 break 92 else: 93 print("输入错误") 94 95 96 def st_bin(): 97 while True: 98 print("1.学生列表 2.学生入学 3.返回") 99 user_c = str(input(">>>")).strip() 100 if user_c == "1": 101 student.Student.show() 102 elif user_c == "2": 103 print("学生入学".center(50, "+")) 104 s = school.School.show() 105 u_s = input("选择学校:").strip() 106 c = coures.Course.show() 107 u_c = input("选择课程:").strip() 108 cls = class_school.Class.show() 109 u_cla = input("选择班级:").strip() 110 xx = student.user_input() 111 data = student.Student(xx[0], xx[1], c[int(u_c) - 1], 112 cls[int(u_cla) - 1], s[int(u_s) - 1]) 113 data.save() 114 115 116 if __name__ == '__main__': 117 logg = log.log("DEBUG") 118 logg.file("INFO","系统启动一次") 119 while True: 120 print("33[32;1m学校CRM选课系统33[1m".center(50, "=")) 121 print("1.学校系统 2.老师系统 3.课程系统 4.班级系统 5.学生系统") 122 menu = {"1": s_bin, "2": t_bin, "3": c_bin, "4": cls_bin, "5": st_bin} 123 user_c = input(">>>").strip() 124 if menu.get(user_c, 0): 125 menu[user_c]() 126 else: 127 print("输入错误! ")
原文阅读:www.hairuinet.com