我的朋友之管理数据类型的小程序的思路

苦恼的朋友

最近,我的朋友非常没有精神,经常闷闷不乐,我感觉他的状态很不好,于是关切他到底怎么了,然后他就和我说了他遇到的困惑

:今年年初开始,我一直在学习编程,眼看着现在已经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的通知或公告

可以看到这里,我们分别使用了GETPOSTPUTDELETE四种请求方式,可能很多人会认为使用这么多种请求方式没有必要,反而麻烦,只使用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中

  1. 首页(index):在首页上可以展示放置重要的通知和公告,也可以展示当前使用的用户的基本信息,如姓名、班级。
  2. 登录页(login):用户可以通过此页面登录,需要通过微信小程序授权登录
  3. 学生信息页(students):该页面用于展示学生的所有信息。如果用户是管理员的话,还可以在这个页面上添加、修改和删除学生信息。
  4. 教师信息页(teachers):该页面用于展示教师的所有信息。如果用户是管理员的话,还可以在这个页面上添加、修改和删除教师信息。
  5. 课程信息页(courses):该页面用于展示课程的所有信息。如果用户是管理员的话,还可以在这个页面上添加、修改和删除课程信息。
  6. 成绩页(grades):该页面用于展示学生的所有成绩。如果用户是教师的话,还可以在这个页面上添加和修改学生成绩。
  7. 出勤页(attendance):该页面展示学生的所有出勤记录。如果用户是教师的话,还可以在这个页面上添加和修改出勤的记录。
  8. 作业页(homework):该页面展示所有作业通知。学生可以在此页面上查看作业,教师可以在此页面上发布和批改作业。

最终结果

朋友看完了我做的微信小程序的学生管理系统以后,不禁连连称奇,“真没想到,扩展了功能,更换了显示方式以后,一个简单的学生管理系统,都可以发挥出这么大的作用,编程真是太棒了。现在我终于找到了学习的方向了,知道以后该怎么做了。今后,我也要学习制作微信小程序。”



看着朋友重新振作起来,我也是非常的欣慰,其实学习编程就是这样,看起来很不起眼,“没什么用”的知识,其实未来都能够发挥出大作用。因此,对于程序的初学者来说,仅仅是一时写的程序不能够真正的在现实中使用,是很正常的,完全不需要心灰意冷。重要的是,学习到了这些“黑窗口”的知识,未来有一天,都能够在更广阔的天空下发挥作用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容