摘  要

随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,高校当然也不例外。学生选课系统小程序是以实际运用为开发背景,运用软件工程原理和开发方法,采用PHP语言构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结,得出系统中存在的不足及需要改进的地方,为以后的系统维护提供了方便,同时也为今后开发类似系统提供了借鉴和帮助。

学生选课系统小程序主要功能模块包括主页,个人资料(个人信息,修改密码),公共管理(轮播图,公告消息),用户管理(管理员,教师用户,学生用户),信息管理(课程资讯,资讯分类),培养计划,课程信息,选课学生,课程评分,退课信息,课程分类等,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求。

关键词:学生选课系统小程序;PHP;ThinkPHP

PHP student course selection system mini program

Abstract

With the rapid development of science and technology, all aspects of society and industries are striving to integrate with modern advanced technology and improve their own advantages through technological means, and universities are no exception. The student course selection system mini program is a management system developed based on practical application, using software engineering principles and development methods, and using PHP language. The entire development process starts with a requirement analysis of the software system to determine its main functions. Then proceed with the overall and detailed design of the system. The overall design mainly includes system functional design, system overall structure design, system data structure design, and system security design; The detailed design mainly includes the implementation of system database access, the specific implementation of main functional modules, and the key code for module implementation. Finally, functional testing was conducted on the system, and the test results were analyzed and summarized to identify the shortcomings and areas for improvement in the system. This provided convenience for future system maintenance and also provided reference and assistance for the development of similar systems in the future.

The main functional modules of the student course selection system mini program include homepage, personal information (personal information, password modification), public management (broadcast map, announcement message), user management (administrator, teacher user, student user), information management (course information, information classification), training plan, course information, course selection students, course grading, withdrawal information, course classification, etc, Adopting an object-oriented development model for software development and hardware installation can effectively meet practical usage needs.

Key words: Student course selection system mini program; PHP;ThinkPHP

                                                     目录

摘  要

Abstract

第一章 绪论

1.1 课题研究背景

1.2研究现状

1.3研究方法

第二章 相关技术

2.1 开发技术

2.1.1微信开发者工具

2.1.2 小程序框架

2.1.3 PHP介绍

2.1.4 Mysql数据库

第三章 学生选课系统小程序分析

3.1 可行性分析

3.1.1 技术可行性分析

3.1.2 经济可行性分析

3.2 系统需求分析

3.2.1 功能性需求分析

3.2.2 非功能性分析

3.3 系统用例分析

第四章 系统总体设计

4.1 系统模块设计

4.2 数据库设计

4.3.1 数据库概念结构设计

4.2.2 数据库逻辑结构设计

第五章 系统实现

5.1登录模块的实现

5.2管理员功能模块

5.3学生用户功能模块

5.4教师用户功能模块

第六章 系统测试

6.1测试目的

6.2测试过程

6.3测试结果

结论

参考文献

致  谢

                                   第一章 绪论

1.1 课题研究背景

互联网发展至今,已经解决了很多我们解决不了的难题,使得我们工作更加便捷,提高了我们的工作效率。目前各行各业都在运用网络信息管理程序,不同的人群也都接触到信息管理,特别是在各大高校广泛的应运起来。通过对当前网络环境发展的分析与总结,开发选课系统可以改变以往的学生选课方式,改变传统学生选课的状态,由于人群的不断增多,使用传统的线下学生选课模式已经远远不能满足于用户需求了,而且越来越多的校园也在开通线上选课,所以开发一个选课系统小程序可以解决校园线下选课面临的诸多问题,同时校园可以利用网络对课程信息进行管理,设计的网站保证信息的完整安全,这样才能提高工作效率,保证系统安全正常的运行。

1.2研究现状

国内外对于选课系统的研究已有一定的成果,但由于涉及范围广且各高校规模程度不一,选课系统开发成本大等原因,所以很多普通高校是没有资本开发建立自己的管理系统的,更多是基于传统方式在管理学生,教师,课程信息的。但人的精力是有限的,所以传统的经营方式难免会存在效率低下等缺点,还伴随着人力资源的大量浪费。在管理的工作中,所涉及到的工作系统比人类更为擅长,能够达到快速、准确、耗费资源小等要求。基于这些显著的优点,如果能设计一套完整且贴合所有高校需求的选课系统小程序,那么将大大地提高高校教务人员的工作效率和精度。在具备这样的系统之下,只需配备少量管理人员对数据库进行日常数据审核、管理以及定期维护,节省了大量人力物力成本。

1.3研究方法

首先,通过引擎搜索或者查阅相关文献资料,了解了本系统开发的背景以及设计系统的意义所在,收集用户需求信息。其次,在开发工具上,最终确定是基于Mysql数据库,在PHP的ThinkPHP框架设计的基础上实现,设计出系统大致的功能模块。主要从方便系统用户和系统管理员的角度进行分析,明确该系统应该具有的功能。最终是测试系统,通过用例测试发现存在的问题并找到解决的方案。利用现有的开发平台,结合自己所学的知识,在老师的指导帮助下来完成该设计,确保系统的可用性、实用性。

第二章 相关技术

2.1 开发技术

本系统前端部分基于小程序模式进行开发,后端部分基于PHP的ThinkPHP框架进行开发。

前端部分:前端框架采用微信小程序,使用微信开发者工具。后端部分:采用ThinkPHP框架,运用PHPstudy 集成开发工具。

2.1.1微信开发者工具

微信开发者工具现在已经被小程序开发团队开发运行,目前微信开发者工具任然在不断的完善中,在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具,开发者工具将使用这个微信帐号的信息进行小程序的开发和调试。

机型选择:小程序以智能手机的屏幕尺寸为设计标准,进行切图。

预览界面:写好视图布局后点击编译,用来刷新视图界面。

控制台:方便调试打印输出信息。

上传代码:上传到腾讯服务器,提交审核必经步骤。上传代码时可以填写版本号和备注信息。

资源文件:一般可以在资源文件进行对应项目的文件目录的断点调试。

显示远程调试:手机端和PC端开发工具联调对用户而言是非常实用的。

本地数据存储:显示的是本地存储的数据。

视图调试:标组件以子父层级结构呈现,方便调试。

微信限制在2M 以内的代码体积;开发中一般不校验合法域名信息;小程序后台要做配置服务器域名。

以上就是在开发过程中微信开发者工具常用到的功能,微信开发者工具也在不断的完善。

2.1.2 小程序框架

整个小程序框架系统分为两部分:逻辑层和视图层。小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 小程序 体验的服务。小程序在视图层与逻辑层间提供了数据传输和事件系统,提供了自己的视图层以及逻辑层框架,让开发者能够专注于数据与逻辑。框架的核心是一个响应的数据绑定系统,可以让数据与视图非常简单地保持同步。在逻辑层做数据修改,在视图层就会做相应的更新。框架提供了一套基础的组件,这些组件自带微信风格的样式以及特殊的逻辑,开发者可以通过组合基础组件,创建出强大的微信小程序。

2.1.3 PHP介绍

PHP是一种面向对象的程序设计语言,类是PHP程序的基本组成单元,类中又包含了属性和方法,在类中又可以创建无数个对象。类中包含的主要成员是字段和方法,字段是指一种数据变量,方法是指对字段进行操作的集合,包括给其他变量赋值、调用方法等。PHP代码都是编写在类体中,类体中的每个数据项都可以看作是一个对象,PHP不支持类的多重继承,但可以支持接口的多重继承,并且支持类和接口的实现。由于PHP通常在网络环境中使用,所以PHP提供了一个防止代码恶意攻击的安全机制,同时,PHP具有强类型机制、自动收集垃圾和异常处理等特性,这些都是PHP语言健壮性的重要保证。

1、PHP语言具有如下特点:

(1)PHP 结合 C、PHP、Perl 以及自创的新语法形成了自己独特的语法。

(2)PHP可以更快速的执行动态网页,当然这只是相对于CGI或者Perl来说,PHP可以在HTML文档中嵌入程序,而且去执行,另外PHP能够实现CGI的所有功能,因此说明PHP具有很强大的功能。

(3)大部分当下流行的数据库和操作系统PHP语言都能够支持。

(4)PHP语言的最重要特点就是可以让C、C++进行扩展

2、PHP语言具有如下优势:

(1)开放源代码:事实上PHP的所有源代码都可以得到。

(2)免费性:PHP是开源代码并且免费

(3)快捷性:PHP对于初学者来说,它不止编辑简单可以嵌入与HTML语言中,而且对于程序开发和运行也是非常快速的,并且非常容易掌握。

(4)跨平台性强:PHP是可以在服务器运行的脚本语言,所以在UNIX、Android、Mac OS、WINDOWS等操作平台上都可以运行。

(5)效率高:PHP对系统资源的消耗相当少,所以它的效率高。

(6)图像处理:PHP不止是可以使用GD2对图像进行处理,而且他还可以完成对图像的创建。

(7)面向对象:PHP4、PHP5对于PHP在面向对象上,有了许多的改进,PHP语言开发大型商业程序也是可以胜任的。

2.1.4 Mysql数据库

Mysql 经过多次的更新,功能层面已经非常的丰富和完善了,从Mysql4版本到5版本进行了比较大的更新,在商业的实际使用中取得了很好的实际应用效果。最新版本的Mysql支持对信息的压缩,同时还能进行加密能更好的满足对信息安全性的需求。同时经过系统的多次更新,数据库自身的镜像功能也得到了很大的增强,运行的流畅度和易用性方面有了不小的进步,驱动的使用和创建也更加的高效快捷。最大的变动还是进行了空间信息的显示优化,能更加方便的在应用地图上进行坐标的标注和运算。强大的备份功能也保证了用户使用的过程会更加安心,同时支持的Office特性还支持用户的自行安装和使用。在信息的显示形式上也进行了不小的更新,增加了两个非常使用的显示区,一个是信息区,对表格和文字进行了分类处理,界面的显示更加清爽和具体。第二是仪表的信息控件,能在仪表信息区进行信息的显示,同时还能进行多个信息的比对,为用户的实际使用带来了很大的便捷。

针对本文中设计的学生选课系统小程序在实际的实现过程中,最终选择Mysql数据库的主要原因在于在企业的应用系统应用及开发的过程中会存在大量的数据库比较频繁的操作,而且数据的安全性要求也是非常的高。综合这些因素,最终选择安全性系数比较高的Mysql来对学生选课系统小程序后台数据进行存储操作。

第三章 学生选课系统小程序分析

3.1 可行性分析

3.1.1 技术可行性分析

从开发工具来看,由于学生选课系统小程序是基于PHP的,因此有很多开发工具都可以进行开发,这些功能强大的开发工具可以给我来设计学生选课系统小程序带来非常大的方便。

从学生选课系统小程序的本身技术来说,对于我来开发一个学生选课系统小程序这个毕设是不费事的。学生选课系统小程序的开发可以简单的分为前台端、后台端开发以及数据库开发。其中的大部分技术难点在我上学时已经使用过了,同时网络上很多技术点可以让我来借鉴。后台管理使用PHP的ThinkPHP架构开发,数据库使用mysql,因此为我在开发学生选课系统小程序这个毕设上省去了很多多余代码,这给我的毕设项目编写带来了极大的便利。综上所述,从技术层面来看开发学生选课系统小程序是可行的。

从用户体验来看,市面上很多被广泛使用的系统案例可以让我来参考,因此我可以综合它们的页面交互设计的优点,基于我的毕设项目特点来进行改版,最后达到令用户满意的页面交互体验。综上所述,从技术层面来看开发学生选课系统小程序是可行的。

3.1.2 经济可行性分析

从学生选课系统小程序的开发成本来看,学生选课系统小程序的设计和开发都是我自己完成的,没有其他成本上的开销。

从学生选课系统小程序的维护成本来看,学生选课系统小程序的开发遵循一套完整的代码编写规范,并且学生选课系统小程序的结构设计非常灵活,遵循高内聚低耦合的原则,因此易于维护和迭代开发。

在学生选课系统小程序上线之后,上线前期我会根据真实需求来调查,对使用我开发的学生选课系统小程序来制定一套符合的使用费。系统运行稳定后我会将推广范围到其他的校园当中,其他校园可以使用我的学生选课系统小程序,只需要缴纳一点点的定金,我会给他们引入广告投资和自营业务。

综合以上的分析,学生选课系统小程序所带来的经济效益将会带来极大的收益。并且随着我的推广,来使用我开发的学生选课系统小程序的市场将越来越大,学生选课系统小程序带来的利润也就越来越多。因此,从经济层面来看开发学生选课系统小程序的是可行的。

3.2 系统需求分析

3.2.1 功能性需求分析

学生选课系统小程序需要满足的需求有以下几个:

1.信息获取方便,用户可在网页上快速浏览到新的信息

2.查看课程资讯、详情等。

3.注册登录,需要吸引用户,即通过注册来提高用户的存留率。

4.修改用户信息,可以修改用户密码或者用户名等一些个性化操作。

5.管理员功能,管理员可以对用户或者课程分类、资讯类型进行管理。

6.系统安全,操作简便,不过于复杂。

   7.系统可以稳定运行,不存在卡顿等问题造成用户反感

3.2.2 非功能性分析

学生选课系统小程序的非功能性需求比如学生选课系统小程序的安全性怎么样,可靠性怎么样,性能怎么样,可拓展性怎么样等。具体可以表示在如下2-1表格中:

表3-1学生选课系统小程序非功能需求表

安全性 主要指学生选课系统小程序数据库的安装,数据库的使用和密码的设定必须合乎规范。 可靠性 可靠性是指学生选课系统小程序能够安装用户的指示进行操作,经过测试,可靠性90%以上。 性能 性能是影响学生选课系统小程序占据市场的必要条件,所以性能最好要佳才好。 可扩展性 比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。 易用性 用户只要跟着学生选课系统小程序的页面展示内容进行操作,就可以了。 可维护性 学生选课系统小程序开发的可维护性是非常重要的,经过测试,可维护性没有问题

3.3 系统用例分析

根据上一节功能分析,可以得出系统的用例,用户角色用例如图2.1所示。

图3.1 学生选课系统小程序中用户角色用例图

学生选课系统小程序的管理员是维护整个学生选课系统小程序中一系列数据流程,管理员角色用例如图2.2所示。

图3.2 学生选课系统小程序管理员角色用例图

第四章 系统总体设计

4.1 系统模块设计

根据第二章中学生选课系统小程序的功能分析可知,学生选课系统小程序中整体功能模块图如图4.1所示, 

图4.1 学生选课系统小程序功能模块图

4.2 数据库设计

4.3.1 数据库概念结构设计

下面是整个学生选课系统小程序中主要的数据库表总E-R实体关系图。

图4.2 学生选课系统小程序总E-R关系图

4.2.2 数据库逻辑结构设计

通过上一小节中学生选课系统小程序中总E-R关系图上得出一共需要创建很多个数据表。在此我主要罗列几个主要的数据库表结构设计。

表access_token (登陆访问时长)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 token_id int 10 0 N Y 临时访问牌ID 2 token varchar 64 0 Y N 临时访问牌 3 info text 65535 0 Y N 4 maxage int 10 0 N N 2 最大寿命:默认2小时 5 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 6 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间: 7 user_id int 10 0 N N 0 用户编号:

表article (文章:用于内容管理系统的文章)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 article_id mediumint 8 0 N Y 文章id:[0,8388607] 2 title varchar 125 0 N Y 标题:[0,125]用于文章和html的title标签中 3 type varchar 64 0 N N 0 文章分类:[0,1000]用来搜索指定类型的文章 4 hits int 10 0 N N 0 点击数:[0,1000000000]访问这篇文章的人次 5 praise_len int 10 0 N N 0 点赞数 6 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 7 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间: 8 source varchar 255 0 Y N 来源:[0,255]文章的出处 9 url varchar 255 0 Y N 来源地址:[0,255]用于跳转到发布该文章的网站 10 tag varchar 255 0 Y N 标签:[0,255]用于标注文章所属相关内容,多个标签用空格隔开 11 content longtext 2147483647 0 Y N 正文:文章的主体内容 12 img varchar 255 0 Y N 封面图 13 description text 65535 0 Y N 文章描述

表article_type (文章分类)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 type_id smallint 5 0 N Y 分类ID:[0,10000] 2 display smallint 5 0 N N 100 显示顺序:[0,1000]决定分类显示的先后顺序 3 name varchar 16 0 N N 分类名称:[2,16] 4 father_id smallint 5 0 N N 0 上级分类ID:[0,32767] 5 description varchar 255 0 Y N 描述:[0,255]描述该分类的作用 6 icon text 65535 0 Y N 分类图标: 7 url varchar 255 0 Y N 外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置 8 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 9 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间:

表auth (用户权限管理)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 auth_id int 10 0 N Y 授权ID: 2 user_group varchar 64 0 Y N 用户组: 3 mod_name varchar 64 0 Y N 模块名: 4 table_name varchar 64 0 Y N 表名: 5 page_title varchar 255 0 Y N 页面标题: 6 path varchar 255 0 Y N 路由路径: 7 position varchar 32 0 Y N 位置: 8 mode varchar 32 0 N N _blank 跳转方式: 9 add tinyint 3 0 N N 1 是否可增加: 10 del tinyint 3 0 N N 1 是否可删除: 11 set tinyint 3 0 N N 1 是否可修改: 12 get tinyint 3 0 N N 1 是否可查看: 13 field_add text 65535 0 Y N 添加字段: 14 field_set text 65535 0 Y N 修改字段: 15 field_get text 65535 0 Y N 查询字段: 16 table_nav_name varchar 500 0 Y N 跨表导航名称: 17 table_nav varchar 500 0 Y N 跨表导航: 18 option text 65535 0 Y N 配置: 19 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 20 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间:

表collect (收藏)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 collect_id int 10 0 N Y 收藏ID: 2 user_id int 10 0 N N 0 收藏人ID: 3 source_table varchar 255 0 Y N 来源表: 4 source_field varchar 255 0 Y N 来源字段: 5 source_id int 10 0 N N 0 来源ID: 6 title varchar 255 0 Y N 标题: 7 img varchar 255 0 Y N 封面: 8 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 9 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间:

表comment (评论)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 comment_id int 10 0 N Y 评论ID: 2 user_id int 10 0 N N 0 评论人ID: 3 reply_to_id int 10 0 N N 0 回复评论ID:空为0 4 content longtext 2147483647 0 Y N 内容: 5 nickname varchar 255 0 Y N 昵称: 6 avatar varchar 255 0 Y N 头像地址:[0,255] 7 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 8 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间: 9 source_table varchar 255 0 Y N 来源表: 10 source_field varchar 255 0 Y N 来源字段: 11 source_id int 10 0 N N 0 来源ID:

表course_classification (课程分类)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 course_classification_id int 10 0 N Y 课程分类ID 2 course_classification varchar 64 0 Y N 课程分类 3 recommend int 10 0 N N 0 智能推荐 4 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 5 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

表course_grading (课程评分)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 course_grading_id int 10 0 N Y 课程评分ID 2 course_no varchar 64 0 Y N 课程编号 3 course_name varchar 64 0 Y N 课程名称 4 course_classification varchar 64 0 Y N 课程分类 5 course_time varchar 64 0 Y N 课程时间 6 course_location varchar 64 0 Y N 课程地点 7 course_teacher int 10 0 Y N 0 课程教师 8 teacher_id varchar 64 0 Y N 教师工号 9 teacher_name varchar 64 0 Y N 教师姓名 10 elective_student int 10 0 Y N 0 选课学生 11 student_id varchar 64 0 Y N 学生学号 12 student_name varchar 64 0 Y N 学生姓名 13 scoring_date date 10 0 Y N 评分日期 14 scoring_score int 10 0 Y N 0 评分分数 15 teacher_comments text 65535 0 Y N 教师评语 16 recommend int 10 0 N N 0 智能推荐 17 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 18 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

表course_information (课程信息)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 course_information_id int 10 0 N Y 课程信息ID 2 course_no varchar 64 0 Y N 课程编号 3 course_name varchar 64 0 Y N 课程名称 4 course_classification varchar 64 0 Y N 课程分类 5 course_time varchar 64 0 Y N 课程时间 6 course_location varchar 64 0 Y N 课程地点 7 course_teacher int 10 0 Y N 0 课程教师 8 teacher_id varchar 64 0 Y N 教师工号 9 teacher_name varchar 64 0 Y N 教师姓名 10 course_description text 65535 0 Y N 课程描述 11 examination_method text 65535 0 Y N 考试方式 12 course_cover varchar 255 0 Y N 课程封面 13 course_introduction text 65535 0 Y N 课程简介 14 recommend int 10 0 N N 0 智能推荐 15 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 16 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

表elective_student (选课学生)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 elective_student_id int 10 0 N Y 选课学生ID 2 course_no varchar 64 0 Y N 课程编号 3 course_name varchar 64 0 Y N 课程名称 4 course_classification varchar 64 0 Y N 课程分类 5 course_time varchar 64 0 Y N 课程时间 6 course_location varchar 64 0 Y N 课程地点 7 course_teacher int 10 0 Y N 0 课程教师 8 teacher_id varchar 64 0 Y N 教师工号 9 teacher_name varchar 64 0 Y N 教师姓名 10 elective_student int 10 0 Y N 0 选课学生 11 student_id varchar 64 0 Y N 学生学号 12 student_name varchar 64 0 Y N 学生姓名 13 recommend int 10 0 N N 0 智能推荐 14 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 15 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

表hits (用户点击)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 hits_id int 10 0 N Y 点赞ID: 2 user_id int 10 0 N N 0 点赞人: 3 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 4 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间: 5 source_table varchar 255 0 Y N 来源表: 6 source_field varchar 255 0 Y N 来源字段: 7 source_id int 10 0 N N 0 来源ID:

表notice (公告)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 notice_id mediumint 8 0 N Y 公告id: 2 title varchar 125 0 N N 标题: 3 content longtext 2147483647 0 Y N 正文: 4 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 5 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间:

表praise (点赞)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 praise_id int 10 0 N Y 点赞ID: 2 user_id int 10 0 N N 0 点赞人: 3 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 4 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间: 5 source_table varchar 255 0 Y N 来源表: 6 source_field varchar 255 0 Y N 来源字段: 7 source_id int 10 0 N N 0 来源ID: 8 status bit 1 0 N N 1 点赞状态:1为点赞,0已取消

表slides (轮播图)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 slides_id int 10 0 N Y 轮播图ID: 2 title varchar 64 0 Y N 标题: 3 content varchar 255 0 Y N 内容: 4 url varchar 255 0 Y N 链接: 5 img varchar 255 0 Y N 轮播图: 6 hits int 10 0 N N 0 点击量: 7 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 8 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间:

表student_users (学生用户)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 student_users_id int 10 0 N Y 学生用户ID 2 student_id varchar 64 0 N N 学生学号 3 student_name varchar 64 0 Y N 学生姓名 4 student_gender varchar 64 0 Y N 学生性别 5 student_age varchar 64 0 Y N 学生年龄 6 student_department varchar 64 0 Y N 学生院系 7 student_major varchar 64 0 Y N 学生专业 8 examine_state varchar 16 0 N N 已通过 审核状态 9 recommend int 10 0 N N 0 智能推荐 10 user_id int 10 0 N N 0 用户ID 11 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 12 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

表teacher_user (教师用户)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 teacher_user_id int 10 0 N Y 教师用户ID 2 teacher_id varchar 64 0 N N 教师工号 3 teacher_name varchar 64 0 Y N 教师姓名 4 gender_of_teachers varchar 64 0 Y N 教师性别 5 age_of_teacher varchar 64 0 Y N 教师年龄 6 faculty varchar 64 0 Y N 教师院系 7 teacher_position varchar 64 0 Y N 教师岗位 8 examine_state varchar 16 0 N N 已通过 审核状态 9 recommend int 10 0 N N 0 智能推荐 10 user_id int 10 0 N N 0 用户ID 11 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 12 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

表training_plan (培养计划)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 training_plan_id int 10 0 N Y 培养计划ID 2 plan_name varchar 64 0 Y N 计划名称 3 plan_type varchar 64 0 Y N 计划类型 4 course_classification varchar 64 0 Y N 课程分类 5 applicable_direction varchar 64 0 Y N 适用方向 6 plan_description text 65535 0 Y N 计划描述 7 cover_photo varchar 255 0 Y N 封面图片 8 details text 65535 0 Y N 详情内容 9 recommend int 10 0 N N 0 智能推荐 10 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 11 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

表upload (文件上传)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 upload_id int 10 0 N Y 上传ID 2 name varchar 64 0 Y N 文件名 3 path varchar 255 0 Y N 访问路径 4 file varchar 255 0 Y N 文件路径 5 display varchar 255 0 Y N 显示顺序 6 father_id int 10 0 Y N 0 父级ID 7 dir varchar 255 0 Y N 文件夹 8 type varchar 32 0 Y N 文件类型

表user (用户账户:用于保存用户登录信息)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 user_id mediumint 8 0 N Y 用户ID:[0,8388607]用户获取其他与用户相关的数据 2 state smallint 5 0 N N 1 账户状态:[0,10](1可用|2异常|3已冻结|4已注销) 3 user_group varchar 32 0 Y N 所在用户组:[0,32767]决定用户身份和权限 4 login_time timestamp 19 0 N N CURRENT_TIMESTAMP 上次登录时间: 5 phone varchar 11 0 Y N 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时 6 phone_state smallint 5 0 N N 0 手机认证:[0,1](0未认证|1审核中|2已认证) 7 username varchar 16 0 N N 用户名:[0,16]用户登录时所用的账户名称 8 nickname varchar 16 0 Y N 昵称:[0,16] 9 password varchar 64 0 N N 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成 10 email varchar 64 0 Y N 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时 11 email_state smallint 5 0 N N 0 邮箱认证:[0,1](0未认证|1审核中|2已认证) 12 avatar varchar 255 0 Y N 头像地址:[0,255] 13 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间:

表user_group (用户组:用于用户前端身份和鉴权)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 group_id mediumint 8 0 N Y 用户组ID:[0,8388607] 2 display smallint 5 0 N N 100 显示顺序:[0,1000] 3 name varchar 16 0 N N 名称:[0,16] 4 description varchar 255 0 Y N 描述:[0,255]描述该用户组的特点或权限范围 5 source_table varchar 255 0 Y N 来源表: 6 source_field varchar 255 0 Y N 来源字段: 7 source_id int 10 0 N N 0 来源ID: 8 register smallint 5 0 Y N 0 注册位置: 9 create_time timestamp 19 0 N N CURRENT_TIMESTAMP 创建时间: 10 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间:

表withdrawal_information (退课信息)

编号 名称 数据类型 长度 小数位 允许空值 主键 默认值 说明 1 withdrawal_information_id int 10 0 N Y 退课信息ID 2 course_no varchar 64 0 Y N 课程编号 3 course_name varchar 64 0 Y N 课程名称 4 course_classification varchar 64 0 Y N 课程分类 5 course_time varchar 64 0 Y N 课程时间 6 course_location varchar 64 0 Y N 课程地点 7 course_teacher int 10 0 Y N 0 课程教师 8 teacher_id varchar 64 0 Y N 教师工号 9 teacher_name varchar 64 0 Y N 教师姓名 10 elective_student int 10 0 Y N 0 选课学生 11 student_id varchar 64 0 Y N 学生学号 12 student_name varchar 64 0 Y N 学生姓名 13 reason_for_withdrawal text 65535 0 Y N 退课原因 14 recommend int 10 0 N N 0 智能推荐 15 create_time datetime 19 0 N N CURRENT_TIMESTAMP 创建时间 16 update_time timestamp 19 0 N N CURRENT_TIMESTAMP 更新时间

第五章 系统实现

5.1登录模块的实现

系统的登录窗口是用户的入口,用户只有在登录成功后才可以进入访问。通过在登录提交表单,后台处理判断是否为合法用户,进行页面跳转,进入系统中去。

登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后发送登录请求,调用src下的mainctrl类的dopost方法来验证。

用户登录模块的IPO如下所示:

输入:用户名和密码。

处理:

1)检测用户输入的账号、密码是否正确及在数据库已对应存在。

2)从数据库中提取记录,并储存在本地的session中(timeout默认=30min)。

3)根据用户名,将其显示在系统首页上。

输出:是否成功的信息。

登录流程图如下所示。

图5-1登录流程图

系统登录界面如下所示。

图5-2系统登录界面

  登录,也是获取用户post的数据,并将用户提交的密码md5加密与数据库中加密的密码比对校验。登录请求时我们会生成一个用户token,token作为用户登录令牌会保存在用户设备的缓存中,以实现保持登录状态的效果。代码如下:

public function login()

    {

        if (Request::isPost()) {

            $request = Request::param();

            $result = $this->validate($request, $this->validate);

            if (true !== $result) {

                // 验证失败 输出错误信息

                $data['error'] = 30000;

                $data['message'] = $result;

            } else {

                $request['password'] = md5($request['password']);

                $result = $this->model->login($request, $this->table);

                $data = $result;

            }

        } else {

            $data['error'] = 30000;

            $data['message'] = "field的值不能为空!";

        }

        return json_encode($data);

    }

public function login($request=[],$table_name = ''){

        $username = $request['username'];

        $password = $request['password'];

        $bol = $this->where(['username'=>$username])->find();

        if ($bol){

            $password = md5($password);

            if ($request['password']==$bol['password']) {

                //添加token信息

                $access_token['create_time'] = date('Y-m-d H:i:s');

                $access_token['update_time'] = date('Y-m-d H:i:s');

$access_token['info'] = json_encode($bol);

                // $access_token['info'] = $bol;

                $access_token['token'] = md5(date('Y-m-d H:i:s'));

                $bol_token = Db::name('AccessToken')->insert($access_token);

                if ($bol_token){

                    $data['obj'] = $bol;

                    $data['obj']['token'] = $access_token['token'];

                    return ['result' => $data];

                }else{

                    return ['error' => ['code' => 5000, 'message' => '登录失败,token生成失败']];

                }

            } else {

                return ['error' => ['code' => 5000, 'message' => '登录失败,密码不正确']];

            }

        }else{

            return ['error' => ['code' => 5000, 'message' => '登录失败,账号不存在']];

        }

    }

验证登录状态则是使用到登录后更新的token值,验证token是否过期,这里我们是保存2个小时。当token已经过期时,就会返回false,这个时候前端就会重新调用登录方法了。代码如下:

public function state()

    {

        $accessTokenModel = new AccessTokenModel();

        $token = Request::header('x-auth-token');

        if (!empty($token)) {

            $result = $accessTokenModel->getToken($token);

            if($result){

$data['result'] = $result;

}else{

$data['error'] = 30000;

$data['message'] = '未登录';

}

//            $data = $result;

        } else {

            $data['error'] = 30000;

            $data['message'] = "token的值不能为空!";

        }

        return json_encode($data);

    }

public function getToken($token){

        $token_info = $this->where(['token'=>$token])->find();

        if ($token_info){

            $time = date('Y-m-d H:i:s');

            $create_time = $token_info['create_time'];

            $bol_time = date('Y-m-d H:i:s',strtotime('+2 hour',strtotime($create_time)));

            $info = json_decode($token_info['info'],true);

            $info['token'] = $token_info['token'];

            if ($bol_time>=$time){

                return $info;

            }else{

                return false;

            }

        }else{

            return false;

        }

}

5.2管理员功能模块

系统呈现出一种简洁大方的首页:界面简约、鳞次栉比,用户能轻车熟路的使用。出于对系统使用群体广泛的顾虑,应有良好性能的后台。

如下图所示为系统的首页界面。

图5-3系统首页界面

// 加载基础文件

require __DIR__ . '/../thinkPHP/base.PHP';

// 允许的原域名

header('Access-Control-Allow-Origin: *');

//允许的请求头信息

header("Access-Control-Allow-Headers: *");

//允许的请求类型

header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE,OPTIONS,PATCH');

//允许携带证书式访问(携带cookie)

header('Access-Control-Allow-Credentials:true');

// 支持事先使用静态方法设置Request对象和Config对象

// 执行应用并响应

Container::get('app')->run()->send();

管理员登录进入学生选课系统小程序可以查看:主页,个人资料(个人信息,修改密码),公共管理(轮播图,公告消息),用户管理(管理员,教师用户,学生用户),信息管理(课程资讯,资讯分类),培养计划,课程信息,选课学生,课程评分,退课信息,课程分类等内容,如下图所示。

图5-4管理员功能界面图

用户管理,在此页面可以查看用户名、昵称、姓名、性别等信息,并可根据需要进行新增、重置或删除操作,如下图所示。

图5-5用户管理界面图

课程资讯管理,在列表可以查看资讯标题,封面图,文章分类,标签等信息,并可根据需要进行新增、重置或删除操作,如下图所示。

图5-6课程资讯管理界面图

图5-7课程资讯新增界面图

培养计划管理,在列表可以查看计划名称,类型,课程分类,适用方向等等信息,并可根据需要进行新增、重置或删除操作,如下图所示。

图5-8培养计划管理界面图

图5-9培养计划新增界面图

5.3学生用户功能模块

学生用户通过输入姓名,昵称,手机,身份,学号,性别,年龄等信息进行账号注册,如下图所示。

图5-10学生用户注册界面图

关键代码如下:

public function register()

    {

        if (Request::isPost()) {

            $request = Request::param();

            $request['create_time'] = isset($request['create_time']) ? $request['create_time'] : date('Y-m-d H:i:s');

            $request['update_time'] = isset($request['update_time']) ? $request['update_time'] : date('Y-m-d H:i:s');

            $result = $this->validate($request, $this->validate);

            if (true !== $result) {

                // 验证失败 输出错误信息

                $data['error'] = 30000;

                $data['message'] = $result;

            } else {

                $request['password'] = md5($request['password']);

                $result = $this->model->register($request, $this->table);

                $data = $result;

            }

        } else {

            $data['error'] = 30000;

            $data['message'] = "field的值不能为空!";

        }

        return json_encode($data);

    }

public function register($request=[],$table_name = ''){

        $username = $request['username'];

        $bol = $this->where(['username'=>$username])->find();

        if (!$bol){

            $result = self::allowField(true)->save($request);

            if ($result) {

                return ['result' => 1];

            } else {

                return ['error' => ['code' => 3000, 'message' => '注册失败']];

            }

        }else{

            return ['error' => ['code' => 3000, 'message' => '注册失败,账号已存在']];

        }

    }

学生用户登录进入学生选课系统小程序可以查看:首页,网站公告,课程资讯,培养计划,课程信息,我的(基本信息,收藏,选课学生,课程评分,退课信息)等内容,如下图所示。

图5-11学生用户登录界面图    图5-12学生用户首页界面图

培养计划,在列表可以查看计划名称,类型,课程分类,适用方向等信息,如下图所示。

 

 

图5-13培养计划界面图  图5-14详情界面图  

课程信息,在列表可以查看课程编号,名称,分类,时间,地点,教师等信息,可以进行选课或者收藏操作,如下图所示。

 

图5-15课程列表界面图  图5-16详情界面图  图5-17选课界面图

学生选课,在列表可以查看自己选择的课程,可以进行详情查看或者退课操作,如下图所示。

 

图5-18我的界面图    图5-19详情界面图  图5-20退课界面图

5.4教师用户功能模块

课程信息,教师用户在此页面通过输入课程编号,名称,分类,时间,地点,教师等信息新增课程信息。如下图所示。

图5-21选课界面图

学生选课,教师用户在此页面查看学生的选课信息,并进行评分。如下图所示。

图5-22学生选课信息界面图

图5

第六章 系统测试

6.1测试目的

在对该系统进行完详细设计和编码之后,就要对学生选课系统小程序方案的程序进行测试,检测程序是否运行无误,反复进行测试和修改,使之最后成为完整的软件,满足用户的需求,实现预期的功能。

6.2测试过程

在软件的测试过程中,通常测试人员需要针对不同的功能模块设计多种测试用例。通过测试用例能够及时发现代码业务逻辑上是否与真实的业务逻辑相对应,及时发现代码上或逻辑上的缺陷,以此来来完善系统,提高软件产品的质量,使软件具有良好的用户体验。

登录测试用例表如下所示。

表6-1登录测试用例

测试性能 用户或操作员登录系统 用例目的 测试用户或操作员登录系统时功能是否正常 前提条件 进入用户登录页面或操作员登录页面 输入条件 预期输出 实际情况 各项信息不予填写,直接点击登陆按钮 不允许登录,提示填写账号相关信息 一致 填写错误的登录名或密码后点击登录系统 提示用户名或密码错误,要求重新填写进行登录 一致 填写与验证码信息不一致的信息 系统显示出提示信息,表明验证码错误,要求重新填写 一致

学生用户选课测试用例表如下所示。

表6-2学生用户选课测试用例

测试性能 用户进行学生用户选课的操作 用例目的 测试用户进行学生用户选课操作时,该功能是否正常 前提条件 用户进入学生用户详情页,该学生用户能够考勤选课 输入条件 预期输出 实际情况 对着某学生用户点击“选课”按钮 界面跳转至选课界面 一致 在选课界面,输入必填项,点击“提交”按钮 提示“选课成功”,并返回上一级界面 一致 在选课界面,填写选课表单的时候未输入完整,点击“提交”按钮 提示“选课失败” 一致

用户管理测试用例表如下所示。

表6-3用户管理测试用例

测试性能 学生用户相关信息管理功能 用例目的 测试系统操作者对学生用户相关信息进行管理的功能是否正常 前提条件 登录系统进入相关管理页面 输入条件 预期输出 实际情况 进入学生用户管理界面,点击“录入”按钮,填写所有必填项,点击提交 提示“录入成功”,并返回查询界面 一致 进入学生用户管理界面,点击“录入”按钮,未填写一个或者多个必填项,点击提交 提示“录入失败”,请填写必填项 一致 进入学生用户管理界面,选择要修改的一条数据,点击该条数据后面的“修改”按钮  节目跳转至修改界面 一致 在修改界面,修改可修改项后,点击“提交”按钮 提示“修改成功”,并返回查询界面 一致 进入学生用户管理界面,点击某条数据后面的删除按钮 提示“是否要删除该数据”,如果用户点击“确定”按钮,则成功删除该条数据,并提示“删除成功”,之后返回查询界面 一致

6.3测试结果

经过对此系统的测试,得出该系统足以满足用户日常需求,在功能项目和操作等方面也能满足操作员对于其他用户的管理。但是,还有很多功能有待添加,这个系统仅能满足大部分的需求,还需要对此系统的功能更进一步的完善,这样使用起来才能更加的完美。

                                                          结论

至此,学生选课系统小程序的设计开发已经结束,在开发前做了许多的准备,在本系统的设计和开发过程中阅览和学习了许多文献资料,从中我也收获了很多宝贵的方法和设计思路,对系统的开发也起到了很重要的作用,系统的开发技术选用的都是自己比较熟悉的,比如ThinkPHP、PHP技术、MYSQL,这些技术都是在以前的学习中学到了,其中许多的设计思路和方法都是在以前不断地学习中摸索出来的经验,其实对于我们来说工作量还是比较大的,但是正是由于之前的积累与准备,才能顺利的完成这个项目,由此看来,积累经验跟做好准备是十分重要的事情。

当然在该系统的设计与实现的过程中也离不开老师以及同学们的帮助,正是因为他们的指导与帮助,我才能够成功的在预期内完成了这个系统。同时在这个过程当中我也收获了很多东西,此系统也有需要改进的地方,但是由于专业知识的浅薄,并不能做到十分完美,希望以后有机会可以让其真正的投入到使用之中。

                                                   参考文献

[1]Ruiying He,Yajun Han. Design and Implementation of Personnel Recruitment System in Higher Vocational School[J]. Advances in Vocational and Technical Education,2023,5(1).

[2]蒋先梅.基于PHP的学生信息管理系统的设计与实现[J].无线互联科技,2023,20(01):45-47.

[3]胡伟东.基于B/S结构的学生选课系统设计与实现[J].信息与电脑(理论版),2023,35(01):23-25.

[4]黄波.基于PHP+MySQL图书管理系统设计与实现[J].信息与电脑(理论版),2021,33(19):124-126.

[5]吴国辰.基于PHP+微信小程序的教务管理系统设计与实现[J].电脑编程技巧与维护,2021(05):72-73.DOI:10.16184/j.cnki.comprg.2021.05.028.

[6]苏天意,余明朕.基于PHP的高校实验室管理系统的设计与实现[J].中国管理信息化,2021,24(02):198-199.

[7]杨博森,严张凌.微服务架构下学生选课系统的设计与实现[J].信息与电脑(理论版),2020,32(20):84-86.

[8]张湖森.基于Android学生选课系统设计与实现[J].科技创新与应用,2019(35):33-34.

[9]沈涛,杨露.基于WeChat公众平台的大学选课系统设计与实现[J].信息与电脑(理论版),2019(08):91-93.

[10]蒋舟,杨健叶,张红伟.高校学生选课系统的设计与实现[J].电脑知识与技术,2019,15(12):60-61.DOI:10.14004/j.cnki.ckt.2019.1342.

[11]白伟丽.学生选课系统的设计与实现[J].电脑与电信,2018(10):38-40.DOI:10.15966/j.cnki.dnydx.2018.10.012.

[12]尚渡新.简析学生选课系统的研究与设计[J].中国新通信,2018,20(17):188.

[13]QingHai Yin. Research and Implementation of Network Examination System Based on PHP Language[J]. Journal of Physics: Conference Series,2018,1087(6).

[14]E S Soegoto,I B Nurwahan. Designing Student Aspiration Website with PHP[J]. IOP Conference Series: Materials Science and Engineering,2018,407(1).

[15]钮永莉,邹长忠.基于MVC框架的高校学生选课系统的设计与实现[J].北京印刷学院学报,2018,26(03):57-59.DOI:10.19461/j.cnki.1004-8626.2018.03.016.

[16]王鑫.基于Web的学生选课系统研究[J].无线互联科技,2018,15(06):63-64+72.

[17]苏博妮,化希耀.基于PHP的高校分级选课系统研究与设计[J].四川文理学院学报,2018,28(02):27-30.

[18]吕凤花.学生选课系统的设计与实现[J].电脑编程技巧与维护,2018(02):110-113.DOI:10.16184/j.cnki.comprg.2018.02.033.

[19]Rotmianto Mohamad,Wahyudi Eko. Developing Plugin e-DDC as an Additional Application for Senayan Library Management System with PHP Language Programming and MySQL Database[J]. Record and Library Journal,2018,2(1).

[20]Li L.. Application of PHP technology in student PE score management system[J]. IPPTA: Quarterly Journal of Indian Pulp and Paper Technical Association,2018,30(8).

                                                       致  谢

时间过的很快,不知不觉,在中北大学的学习生活即将结束。毕业之际,我真诚地向帮助过我的老师、家人、同学、朋友们表达感谢。首先要感谢的是我的母校。感谢母校给了我美好的生活和优越的学习环境,使我能学到了很多知识,也不断的变得优秀;感谢家人在这四年期间一直给与我的爱和无条件的支持,让我没有后顾之忧地完成学业;感谢软件学院的任课老师们给我鼓励和认可,让我有信心去做好每一件事情;感谢同学们的帮助,让我的大学生活更有意义。在此次毕业设计的实现过程中, 我得到了老师们的耐心指导让我顺利完成了该设计。从最初的选题和开题开始,老师就给予我很多帮助,他们认真负责的态度、丰富的教学经验让我学到了很多。

同时也要感谢我敬爱的班主任和实训课程的老师,他们在各个方面都教给了我丰富的经验,在面对各种困难时如何处理。因为今年的特殊性,老师们不仅在学习中给我以精心的指导,同时还在其它方面给予我观关怀,指导老师不辞辛苦的为大家录制视频和一遍遍讲解让我心怀感激之情。在此,我真诚的感恩、感谢我的指导教师们。

还要感谢实习期间不厌其烦教导我鼓励我的技术师傅,他指导了我各个方面的技巧,尤其是编程方面,迄今我的很多技巧和编写规范都有赖于他的指导、纠正。

最后还要特别感谢身边的各位同学们,一直支持鼓励我,无论何时何种境况。我很荣幸获得同学们的帮助,也很开心能够和大家共度大学四年的时光。

最后的最后,再次发自肺腑的感谢所有帮助过我的人。

                                                         免费领取源码,请点赞关注私信博主

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: