学生选课系统安卓开发

实验环境

集成开发工具:IDEA、AndroidStudio

数据库:SQLite

操作系统:windows10

Web服务器:Tomcat

实验过程与分析

如图所示为项目的基本结构该项目使用MVC架构

 

Android 应用程序的主页 MainActivity 类,其中包含多个 Fragment(FirstFragment、SecondFragment 和 ThirdFragment,以及作为管理员页面的 ManagerFirstFragment、ManagerSecondFragment和ManagerThirdFragment)以及使用 ViewPager、BottomNavigationView 等控件实现 Fragment 间的切换。在 onCreate() 方法中,全局变量 studentId 通过 Intent 来获取之前登录页面传递过来的参数(id 值),用于判断当前用户是否为管理员账号。 dbHelper 变量则用来创建或打开 SQLite 数据库,既存储一些应用程序需要的信息。viewPager 则用来展示所有 Fragment,并且与 bottomNavigationViex关联。使用 bottomNavigationView.setOnNavigationItemSelectedListener() 方法来监听 bottomNavigationView 的点击事件,切换当前 Fragment。onPageSelected() 方法在 ViewPager 页面发生变化时被调用,用来更新 bottomNavigationView 的选中状态。onOptionsItemSelected() 方法中,则通过 MenuInflater 类的方法来将 layout 中的 menu.xml 文件加载进来,用来实现点击 Menu 中的 Item(切换账号或退出等功能)。最后,setupViewPager() 方法通过添加 Fragment,并设置 adapter 来绑定到 viewPager 上将 Fragment 绑定到 Adapter 上,以实现 Fragment 的展示和切换。

 

这是一个 RecyclerView.Adapter 类,用于 RecyclerView 中显示多个课程列表。其中 ViewHolder 内部类用来绑定列表中的布局和 View 控件,通过 onCreateViewHolder() 方法来将 layout 中的 course_item.xml 文件加载进来,用于实例化 ViewHolder 并返回。onBindViewHolder() 方法用于将给定 position 上的课程数据绑定到 ViewHolder 中的 View 控件上。getItemCount() 方法则返回列表中的课程数量。

在 onCreateViewHolder() 方法中,定义了对号入座的 OnClickListener 事件监听器,用于捕获用户单击了课程列表项(包括整个课程视图和其中的图像部分)的事件。然后分别获取选中位置的课程信息,创建 Toast 弹框并在弹框中显示相应的数据信息。

在 onBindViewHolder() 方法中,通过 CourseAdapter 构造方法传入一个课程列表,从中获取到指定位置上的 Course 对象,然后将 Course 中存储的课程图像和课程名称,以及课程学分信息绑定到 ViewHolder 中的对应 View 控件上,以更新课程列表。

最后,在 getItemCount() 方法中,返回的是所包含的课程列表的大小(即数量)。

这是一个 RecyclerView.Adapter 类,用于 RecyclerView 中显示多个课程列表。其中 ViewHolder 内部类用来绑定列表中的布局和 View 控件,通过 onCreateViewHolder() 方法来将 layout 中的 course_item.xml 文件加载进来,用于实例化 ViewHolder 并返回。onBindViewHolder() 方法用于将给定 position 上的课程数据绑定到 ViewHolder 中的 View 控件上。getItemCount() 方法则返回列表中的课程数量。

在 onCreateViewHolder() 方法中,定义了对号入座的 OnClickListener 事件监听器,用于捕获用户单击了课程列表项(包括整个课程视图和其中的图像部分)的事件。然后分别获取选中位置的课程信息,创建 Toast 弹框并在弹框中显示相应的数据信息。

在 onBindViewHolder() 方法中,通过 CourseAdapter 构造方法传入一个课程列表,从中获取到指定位置上的 Course 对象,然后将 Course 中存储的课程图像和课程名称,以及课程学分信息绑定到 ViewHolder 中的对应 View 控件上,以更新课程列表。

最后,在 getItemCount() 方法中,返回的是所包含的课程列表的大小(即数量)。

 

RecyclerView.Adapter 类,用于 RecyclerView 中具体课程的具体信息显示。其中 ViewHolder 内部类用来绑定布局和 View 控件,通过 onCreateViewHolder() 方法来将 layout 中的 course_item.xml 文件加载进来,用于实例化 ViewHolder 并返回。onBindViewHolder() 方法则用于将给定 position 上课程选项的数据绑定到相应的 ViewHolder 中的 View 控件上。getItemCount() 方法返回列表中的课程数量。

在 onCreateViewHolder() 方法中,同样定义了对应位置点击的 OnClickListener 事件监听器,用于捕获用户单击了课程项(包括整个课程视图和其中的图像部分)事件。当用户单击视图中的某个选项时,可以通过将 ViewHolder 中的适当数据提取出来以响应单击事件。这里并未实现具体的操作,仅仅是获取了被选中的位置和对应的 CourseSec 对象。

在 onBindViewHolder() 方法中,通过 CourseSecAdapter 构造方法传入一个具体的课程信息列表,从中获取指定位置上的 CourseSec 对象,然后将其显示在 ViewHolder 中的相应控件上。具体来说,CourseSec 对象的图片资源、课程名称、课程学分以及课程成绩会被绑定在 ImageView 和 TextView 控件上,用于显示该课程的详细信息。最后,在 getItemCount() 方法中,返回的是数据源列表的大小(即数量)。

总之,这是一个适配器类,用于将具体课程信息的列表显示在 RecyclerView 中,而 onCreateViewHolder() 和 onBindViewHolder() 方法则用于实现对列表项的创建和更新。

 

RecyclerView.Adapter 类,用于 RecyclerView 中的具体课程信息的显示。其中 ViewHolder 内部类用于绑定布局和 View 控件,通过 onCreateViewHolder() 方法来将 layout 中的 course_item.xml 文件加载进来,用于实例化 ViewHolder 并返回。onBindViewHolder() 方法则用于将给定位置上的课程选项的数据绑定到相应的 ViewHolder 中的 View 控件上,包括每个课程所对应的图片资源和名称。getItemCount() 方法返回列表中的课程数量。

在 onCreateViewHolder() 方法中,同样定义了对应位置点击的 OnClickListener 事件监听器,用于捕获用户选课行为并执行相应的操作。当用户单击视图中的选项时,将对应的 Course 对象提取出来,通过 ScoreDao 类中的 chooseCourse() 方法来为登录的学生选择该课程,并通过 Toast 来提示选课成功。此外,在选课成功的同时,更新 SecondFragment 和 FirstFragment 中的视图和数据,以便实时更新用户的选课信息列表。

在 onBindViewHolder() 方法中,对于给定位置上的课程选项,该方法会将其图片资源和名称显示到相应的 ViewHolder 中绑定的 ImageView 和 TextView 控件上。具体来说,Course 对象的图片资源、课程名称和课程学分会被绑定在 ImageView 和 TextView 控件上,用于显示该课程的信息。

总之,这是一个适配器类,用于将具体课程信息的列表显示在 RecyclerView 中,而 onCreateViewHolder() 和 onBindViewHolder() 方法则用于实现对列表项的创建和更新。此外,通过监听器实现了选课功能。

 

RecyclerView.Adapter 类,用于 RecyclerView 中学生信息的显示,其中 ViewHolder 内部类用于绑定布局和 View 控件,通过 onCreateViewHolder() 方法来将 layout 中的 student_item.xml 文件加载进来,用于实例化 ViewHolder 并返回。onBindViewHolder() 方法则用于将给定位置上的学生选项的数据绑定到相应的 ViewHolder 中的 View 控件上,包括每个学生所对应的图片资源和信息。getItemCount() 方法返回列表中的学生数量。

在 onCreateViewHolder() 方法中,同样定义了对应位置点击的 OnClickListener 事件监听器,用于捕获用户操作并显示相应的信息。在点击学生信息卡片时,将对应的 Student_info 对象提取出来,但未实际进行任何操作。

在 onBindViewHolder() 方法中,对于给定位置上的学生选项,该方法会将其图片资源和信息显示到相应的 ViewHolder 中绑定的 ImageView 和 TextView 控件上。具体来说,Student_info 对象的图片资源和信息会被绑定在 ImageView 和 TextView 控件上,用于显示哪个学生的信息。

总之,这是一个适配器类,用于将学生信息的列表显示在 RecyclerView 中,而 onCreateViewHolder() 和 onBindViewHolder() 方法则用于实现对列表项的创建和更新。此外,通过监听器实现显示学生信息的功能,但没有具体的操作。

 

FragmentPagerAdapter 类,用于管理 ViewPager 中的 Fragment 的显示和切换。它通过实现 getItem() 和 getCount() 方法来实现 ViewPager 中的 Fragment 在数量和内容上的初始化。在 addFragment() 方法中,该类将一个新的 Fragment 添加到内部的 Fragment 列表中,以便在 ViewPager 中被显示。在 setFragments() 方法中,该类将接收到的 Fragment 列表设置为当前的 FragmentList,并调用 notifyDataSetChanged() 方法来使更新生效。

在此基础上,该类扩展了 getItemPosition() 方法来判断要更新的 Fragment 所在的位置,并调用该 Fragment 的 update() 或 updata() 方法来执行刷新操作。

综上,该类实现了一个可管理多个 Fragment 的 ViewPager 页面适配器。在进行更新操作时,通过重写 getItemPosition() 方法判断要更新的 Fragment 所在的位置,并执行相应的刷新操作。

 

EditCheck 类,用于检查用户输入的文本是否符合指定的规则。该类包含两个公共的静态方法 CheckInt() 和 CheckString() 用于检查用户输入的整数和字符串是否符合指定规则,并返回布尔值表示是否通过检查。对于不符合规则的输入,该类通过静态的 warning 字符串存储错误信息描述,并在 getWarning() 方法中返回该信息以便 UI 层显示。

具体来说,CheckInt() 方法采用整数形式的输入值,同时限定输入值的区间在给定的 min 和 max 范围内。 如果输入为空,则返回“标签+不能为空!”的错误信息,并返回 false;如果输入的整数超出了指定范围,则返回“标签+应在min至max区间”的错误信息,并返回 false;如果输入不能转换为整数,则返回“标签+格式错误!”的错误信息,并返回 false。如果通过检查,返回 true。

CheckString() 方法允许输入一个字符串,并指定其最大长度,如果输入为空,则返回“标签+不能为空!”的错误信息,并返回 false;如果输入长度超过了指定大小,则返回“标签+长度错误!”的错误信息,并返回 false。

综上,该类为检验用户输入数据的一个统一接口,可以检查和过滤一些不符合要求的数据,并将错误信息反馈给上一层调用,以便进行相应的处理。

 

LoginActivity 类,用于登录系统。在 onCreate() 方法中,该类创建了一个 MyDatabaseHelper 类型的 dbHelper 对象以对数据库进行操作。同时,在 layout 文件中定义的控件进行了绑定,包括 account 和 password 两个 EditText,log 和 sign 两个 Button。并设置了 log 按钮的点击事件,在点击时先检查用户输入的账号和密码是否符合规则,如果通过检查则查询数据库,查询成功则携带该用户的 id 跳转到 MainActivity 页面,否则弹出“账号或密码错误”的提示框。同时,sign 按钮被点击后,跳转到修改密码的页面 ModifyPasswdActivity。

在 showNormalDialog() 方法中,该类创建了一个 AlertDialog 组件,用于显示提示信息,其中通过 builder 模式创建了标题为“提示”、内容为传入参数 word 的 Dialog,并添加了一个确定按钮,点击确定则会设置 Dialog 可被取消。

综上,该类实现了一个简单的登录系统,能够检查用户输入的账号和密码是否符合规则,并跳转到对应的页面,同时还实现了弹出提示框的功能。通过 MyDatabaseHelper 类,该类能够连接到数据库进行账号的字符串匹配。

所有活动的总管理,可以创建和停止实例。

   

 

CourseDao 类,用于实现对数据库表 course 进行增删改查的操作。通过 MyDatabaseHelper 类,该类能够连接到数据库进行操作。在构造函数中,该类创建了一个 MyDatabaseHelper 类型的 dbHelper 对象以对数据库进行操作,并传入了 context 上下文对象。在 isDataExist() 方法中,该类查询表中是否有数据,通过查询 COUNT(Id) 的数量判断是否有数据存在。如果存在数据则返回 true,否则返回 false。

在 getCourse() 方法中,该类通过 sql 语句查询 course 表中的所有数据,并通过 parseCourse() 方法将找到的数据转为 Course 类型对象,存入列表中返回。

在 addCourse() 方法中,该类通过 ContentValues 对象存储提交的数据,并通过 insertOrThrow() 方法向数据库 course 表中插入数据,如主键冲突则返回 false。

在 deleteCourse() 方法中,该类根据传入的 courseId,删除 course 表中对应的数据,删除成功返回 true,否则返回 false。

在 parseCourse() 方法中,该类解析 Cursor 对象中的数据,根据数据生成 Course 对象并返回。

 

ScoreDao,StudentDao,UserDao同理。

   MyDatabaseHelper 类,它继承了 SQLiteOpenHelper 类,通过该类定义了创建数据库所需的表、数据库名、数据库版本号等信息。在构造函数中,该类接收了 Context 上下文对象,并调用了父类的构造方法进行初始化。在 onCreate() 方法中,该类通过 SQLiteDatabase 对象的 execSQL() 方法执行 SQL 语句,创建了学生表、课程表、成绩表和登录日志表。并通过 init() 方法将初始数据插入相应的表中。其中学生表、登录日志表中含有管理员账户,具有特殊的权限。在 onUpgrade() 方法中,该类实现了空方法,用于当数据库升级时调用。init() 方法用于将预备的初始数据插入到表中,其中包括学生信息、课程信息、成绩信息和登录信息。

如图所示为该项目所连接的数据库,该项目使用sqlite数据库

 Fragment 类中的 onCreateView() 方法,该方法在创建 Fragment 时调用,用于初始化视图,包括加载布局,初始化控件,以及将数据绑定到控件中。在该方法中,首先通过 inflater.inflate() 方法加载布局,然后通过 findViewById() 方法初始化 RecyclerView 和 TextView 控件。接着,通过调用 course.getScore() 方法获取该学生已选课程的列表,若该列表为空则显示 emptyText 控件,隐藏 recyclerView 控件。否则,将获取到的列表通过创建适配器(CourseSecAdapter),设置布局管理器(LinearLayoutManager)和分割线(DividerItemDecoration)的方式绑定到 recyclerView 控件中,并且设置该控件为可见状态。最后,该方法返回由 inflater.inflate() 方法加载的视图 view。update() 方法是用于在列表中选中对应课程时刷新列表内容的方法,实现方式与 onCreateView() 方法类似,通过重新调用 course.getScore() 方法获取课程列表,并更新适配器和 RecyclerView 控件。

 

如图所示为该项目运行时的部分界面

实验创新点

MVC(Model-View-Controller)是一种架构模式,将应用程序分为三个部分,即模型(Model)、视图(View)和控制器(Controller)。MVC架构的优点包括:

分离关注点:MVC模式将应用程序划分为三个部分,每个部分有不同的职责。模型处理数据逻辑,视图处理界面显示,控制器处理用户请求和协调模型和视图之间的交互,使得各个模块之间相互独立,关注点分离,易于维护和修改。

可复用性:MVC模式的各个模块相对独立,模型和视图可以被多个控制器共享,控制器可以根据需要调用多个模型和视图,使得这些模块更容易被复用,并提高了代码的可读性和模块化水平。

易于扩展:MVC模式的各个模块之间不直接依赖,可以通过添加或替换相应的模块来扩展应用程序的功能和灵活性,且不会影响其他的模块。

可测试性:MVC模式的模型、视图和控制器各自独立,这样分离的设计使得组件可以单独测试。这降低了测试复杂度并加速了开发过程。

总之,MVC架构模式在设计应用程序时具有诸多优点,包括分离关注点、可复用性、易于扩展和可测试性,从而提高了应用程序的可维护性和可扩展性,带来更好的用户体验和用户界面。

使用SQlite数据库存储数据。适应兼容性,适应通用性,实现一般APP通用功能,设置(切换APP显示风格、个人信息、退出、切换账号等)、通知等

实验总结

该项目使用 Java 语言、Android前端技术、Web后端技术(Servlet、JSP、Listener、Filter、JDBC等)、数据库,开发了一套基本完善的基于Web的业务系统。通过这个项目,我对web开发的知识有了更一步的了解,在开发一个Android项目前选择合适的架构模式是设计一个应用程序的重要因素之一,MVC架构模式可以使应用程序的功能清晰分割,有利于代码的管理和维护。在开发过程中,要尽可能地模块化,将代码分解成小而独立的模块,便于单独测试和维护,同时使得代码更加可读,易于他人维护和阅读。在这个项目中,不同的功能模块被分解成不同的实体类、数据访问对象、服务、控制器、视图等模块,使得代码逻辑更加清晰。在测试过程中,遇到bug,可以在程序中添加断点,方便程序运行,从而更清楚地了解问题所在。通过这次实验,我的知识得到了深化。

 

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值