苦恼的朋友
最近,我的朋友非常没有精神,常常郁郁寡欢,我感觉他的状态很欠好,于是关心他到底怎样了,然后他就和我说了他遇到的困惑
他:今年年初开端,我一直在学习编程,眼看着现在现已6月多了,半年多过去了,但是我仍是只会写“黑窗口”的程序,我感觉很没有用,不知道能做什么,为什么我只能写这样的程序呢,这样的程序有什么用呢?
我:那你写了什么样的“黑窗口”程序呢?
他:比如说,我学会写了“学生办理体系”的程序,我的代码是这样写的
class StudentSystem:
def __init__(self):
self.students = dict()
def add_student(self, name, age):
if name in self.students:
print(f"{name}现已存在,不能够增加同名学生")
else:
self.students[name] = age
print(f"现已成功增加了学生,名字:{name}")
def all_students(self):
for name in self.students:
print(f"学生,名字:{name},年纪:{self.students[name]}")
def find_student(self, name):
if name in self.students:
print(f"学生,名字:{name},年纪{self.students[name]}")
else:
print(f"没有找到名为{name}的学生")
def main(self):
while 1:
print("\n****\t欢迎来到学生办理体系!\t****")
print("****\t1. 增加学生\t****")
print("****\t2. 检查一切学生\t****")
print("****\t3. 查找一个学生\t****")
print("****\t4. 退出体系\t****")
c = input("请挑选一个选项 (1-4): ")
if c == "1":
name = input("请输入学生的名字: ")
age = input("请输入学生的年纪: ")
self.add_student(name, age)
elif c == "2":
self.all_students()
elif c == "3":
name = input("请输入要查找的学生的名字: ")
self.find_student(name)
elif c == "4":
print("感谢您运用咱们的体系!欢迎下次莅临!")
break
else:
print("您输入的有误呢,请输入正确的选项(1-4)")
if __name__ == "__main__":
s = StudentSystem()
s.main()
他:这个代码运行今后的效果就像是这样的
他:你这个代码写的很厉害啊,你这个但是运用了“面向对象”的程序规划,将一切的代码都封装到了一个类中,是非常好的完成啊,为什么你不满意呢?
他:但是没有用啊,这样的程序,虽然是我花了很长的时刻才写出来的,但是谁会用呢?谁会去运用这样的程序呢?
他:你这样想就不对了,假如你把你的程序改写为“微信小程序”,就能够发挥出很大的效果了,在现实世界中,有许多许多的人都会运用这样的程序,你和他们的差异仅仅在于用户界面不一样算了,没什么值得灰心丧气的!
他:微信小程序很厉害,我也常常运用,甚至出门吃饭,买东西都要用,但是我仍是不知道我写的程序怎样才能够做成微信小程序,我该怎样做呢?
这没什么困难的,今天,咱们就以朋友的这个学生办理体系为基础,将其改写为微信小程序的学生办理体系
体系规划
许多人可能有一个错误的主意,也便是以为完成一个学生办理体系,是很没有用的,做不了什么事情,既不能用于工作,也没有实践的运用价值,这个主意是不对的。这样的体系是否有运用价值,取决于咱们对其的规划,事实上,假如咱们规划的功用较为完善,是彻底能够使其具有运用价值的。
例如说,咱们经过创立账户,以及区分职责,别离创立学生,教师和办理员的账户,还需求能够完成以下的功用:
- 学生信息办理:办理学生的信息(包含名字、性别、生日、联系方法、所属班级、年级),其间答应办理员增加、修正和删去学生信息
- 教师信息办理:办理教师的信息(包含名字、性别、生日、联系方法),其间,一个教师也可能教授多个年级和班级,同样答应办理员增加、修正和删去教师信息
- 课程信息办理:办理员能够增加、修正和删去课程信息,包含课程名称、课程描绘、授课老师、上课时刻和地点。
- 成果办理:学生能够检查他们的成果,教师能够增加和修正学生的成果。
- 考勤办理:教师能够记载学生的出勤状况,包含迟到、早退、请假和缺席。
- 作业告诉:教师能够安置作业,学生能够提交作业,教师能够批改并评分。
- 告诉与公告:办理员和教师能够发布学校新闻、活动公告和重要告诉。
当然,即使现在现已包含了许多的功用,也仍是能够扩展增加更多的功用的。比如说,学习资料和文件的上传与下载,课程视频的上传与观看,讨论区/答疑区/论坛的创立与建造等等。经过不断的增加更多的功用,完善体系,就能够做出非常有用的程序,而非一般人以为的“毫无价值”。
当然,介于时刻的缘故,因而这次咱们只完成以上规划出的7个主要功用,后续假如有需求,还能够依据主要功用,进行扩展和增加
数据存储
依据咱们期望完成的功用,能够规划出对应的存储结构
1.学生表 :存储学生的信息。
id:学生ID,主键
name:学生的名字
gender:学生的性别
birthday:学生的出生日期
phone:学生的联系方法
grade:学生所在的年级
class:学生所在的班级
2.教师表 :存储教师的信息。
id:教师ID,主键
name:教师的名字
gender:教师的性别
birthday:教师的出生日期
phone:教师的联系方法
3.课程表 :存储课程的信息。
id:课程ID,主键
name:课程名称
description:课程描绘
teacher_id:授课教师的ID,外键,应当相关教师表的id
course_info:上课时刻和地点
4.成果表 :存储学生的成果。
id:成果ID,主键
student_id:学生的ID,外键,应当相关学生表的id
course_id:课程的ID,外键,应当相关课程表的id
grade:成果
5.出勤表 :存储学生的出勤状况。
id:出勤记载ID,主键
student_id:学生的ID,外键,应当相关学生表的id
course_id:课程的ID,外键,应当相关课程表的id
status:出勤状态
date:出勤日期
6.作业表:存储作业告诉。
id:作业ID,主键
course_id:课程的ID,外键,应当相关课程表的id
description:作业描绘
end_date:截止日期
7.告诉表 :存储告诉和公告。
id:告诉ID,主键
title:告诉标题
content:告诉内容
date:发布日期
在挑选了合适的字段类型今后,就能够依据先前的规划,创立出所需的数据表
1.学生表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
gender ENUM('male', 'female'),
birthday DATE,
phone VARCHAR(15),
grade INT,
class INT );
2.教师表
CREATE TABLE teachers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
gender ENUM('male', 'female'),
birthday DATE,
phone VARCHAR(15)
);
3.课程表
CREATE TABLE courses (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
teacher_id INT,
course_info VARCHAR(250),
FOREIGN KEY (teacher_id) REFERENCES teachers(id)
);
4.成果表
CREATE TABLE grades (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
course_id INT,
grade FLOAT,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
5.出勤表
CREATE TABLE attendance (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
course_id INT,
status ENUM('attend', 'late', 'absent'),
date DATE,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
6.作业表
CREATE TABLE homework (
id INT AUTO_INCREMENT PRIMARY KEY,
course_id INT,
description TEXT,
end_date DATE,
FOREIGN KEY (course_id) REFERENCES courses(id)
);
7.告诉表
CREATE TABLE news (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(250),
content TEXT,
date DATE
);
接口规划
针对以上的功用,咱们能够规划出以下的接口
1. 学生信息办理:
GET /students:获取一切学生的信息
GET /students/{studentId}:获取指定ID的学生的信息
GET /students/{studentName}:获取指定名字的学生的信息
GET /students/{studentPhone}:获取指定联系方法的学生的信息
POST /students:增加新的学生信息
PUT /students/{studentId}:更新指定ID的学生的信息
DELETE /students/{studentId}:删去指定ID的学生的信息
2.教师信息办理:
GET /teachers:获取一切教师的信息
GET /teachers/{teacherId}:获取指定ID的教师的信息
GET /teachers/{teacherName}:获取指定名字的教师的信息
GET /teachers/{teacherPhone}:获取指定联系方法的教师的信息
POST /teachers:增加新的教师信息
PUT /teachers/{teacherId}:更新指定ID的教师的信息
DELETE /teachers/{teacherId}:删去指定ID的教师的信息
3.课程信息办理:
GET /courses:获取一切课程的信息
GET /courses/{courseId}:获取指定ID的课程的信息
POST /courses:增加新的课程信息
PUT /courses/{courseId}:更新指定ID的课程的信息
DELETE /courses/{courseId}:删去指定ID的课程的信息
4.成果办理:
GET /students/{studentId}/grades:获取指定学生的一切成果
POST /students/{studentId}/grades:增加指定学生的新成果
PUT /students/{studentId}/grades/{gradeId}:更新指定学生的指定成果
DELETE /students/{studentId}/grades/{gradeId}:删去指定学生的指定成果
5.考勤办理:
GET /students/{studentId}/attendance:获取指定学生的出勤状况
POST /students/{studentId}/attendance:增加指定学生的出勤记载
PUT /students/{studentId}/attendance/{attendanceId}:更新指定学生的指定出勤记载
DELETE /students/{studentId}/attendance/{attendanceId}:删去指定学生的指定出勤记载
6.作业告诉:
GET /homework:获取一切作业告诉
GET /homework/{homeworkId}:获取指定ID的作业告诉
POST /homework:增加新的作业告诉
PUT /homework/{homeworkId}:更新指定ID的作业告诉
DELETE /homework/{homeworkId}:删去指定ID的作业告诉
7.告诉与公告:
GET /news:获取一切告诉和公告
GET /news/{newsId}:获取指定ID的告诉或公告
POST /news:增加新的告诉或公告
PUT /news/{newsId}:更新指定ID的告诉或公告
DELETE /news/{newsId}:删去指定ID的告诉或公告
能够看到这里,咱们别离运用了GET,POST,PUT和DELETE四种恳求方法,可能许多人会以为运用这么多种恳求方法没有必要,反而麻烦,只运用GET和POST就能够了。
其实不然,多种恳求方法的运用是有优点的,假如咱们只运用GET和POST恳求,那么,以学生信息为例
GET /students/{studentId}:获取指定ID的学生的信息
POST /students:增加新的学生信息
PUT /students/{studentId}:更新指定ID的学生的信息
DELETE /students/{studentId}:删去指定ID的学生的信息
此刻,咱们就无法再运用相同的接口地址/students/{studentId},有必要修正为
GET /get_students/{studentId}:获取指定ID的学生的信息
POST /add_students:增加新的学生信息
POST /modify_students/{studentId}:更新指定ID的学生的信息
GET /delete_students/{studentId}:删去指定ID的学生的信息
很显然,这种修正方法即使每个都起了对应的名字,也是不如直接运用PUT,DELETE这样的恳求方法直观而清晰的。因而,在实践中,挑选合适的恳求方法也是必要的,并非总是只运用GET和POST两种恳求
也能够看到,这里咱们别离运用了多个不同的接口,来别离对应不同的功用,如下所示
GET /students/{studentId}:获取指定ID的学生的信息
GET /students/{studentName}:获取指定名字的学生的信息
GET /students/{studentPhone}:获取指定联系方法的学生的信息
当然,假如不喜欢增加接口的数量的话,也能够挑选运用恳求参数的方法,例如
GET /get_students:获取学生的学生信息
GET /get_students?id=指定ID
GET /get_students?name=名字
GET /get_students?phone=电话
页面制造
同样的,依据咱们期望完成的功用,制造所需求的微信小程序的页面,这些页面都应该增加到pages中
- 主页(index):在主页上能够展现放置重要的告诉和公告,也能够展现当时运用的用户的基本信息,如名字、班级。
- 登录页(login):用户能够经过此页面登录,需求经过微信小程序授权登录
- 学生信息页(students):该页面用于展现学生的一切信息。假如用户是办理员的话,还能够在这个页面上增加、修正和删去学生信息。
- 教师信息页(teachers):该页面用于展现教师的一切信息。假如用户是办理员的话,还能够在这个页面上增加、修正和删去教师信息。
- 课程信息页(courses):该页面用于展现课程的一切信息。假如用户是办理员的话,还能够在这个页面上增加、修正和删去课程信息。
- 成果页(grades):该页面用于展现学生的一切成果。假如用户是教师的话,还能够在这个页面上增加和修正学生成果。
- 出勤页(attendance):该页面展现学生的一切出勤记载。假如用户是教师的话,还能够在这个页面上增加和修正出勤的记载。
- 作业页(homework):该页面展现一切作业告诉。学生能够在此页面上检查作业,教师能够在此页面上发布和批改作业。
最终成果
朋友看完了我做的微信小程序的学生办理体系今后,不由连连称奇,“真没想到,扩展了功用,更换了显示方法今后,一个简单的学生办理体系,都能够发挥出这么大的效果,编程真是太棒了。现在我终于找到了学习的方向了,知道今后该怎样做了。今后,我也要学习制造微信小程序。”
看着朋友从头振作起来,我也是非常的欣喜,其实学习编程便是这样,看起来很不起眼,“没什么用”的常识,其实未来都能够发挥出大效果。因而,关于程序的初学者来说,仅仅是一时写的程序不能够真实的在现实中运用,是很正常的,彻底不需求心灰意冷。重要的是,学习到了这些“黑窗口”的常识,未来有一天,都能够在更宽广的天空下发挥效果。