system: [SYSTEM]

user: 3. 校园微信扫码签到平台设计 该签到平台开发基于JavaEE，采用MVC模式，使用SSM框架处理业务、数据交互等，数据存取采用MySQL，界面设计采用MUI框架和Layer插件，使用JavaScript、JQurey和Ajax实现前后台交互。 3.1. 校园签到平台架构设计 该平台采用SSM框架五层架构：数据层(Model层)、持久层(Dao层)、业务层(Service层)、控制器层(Controller层)和视图层(View层)。Model层映射数据表；Dao层用来处理数据，负责与数据库的交互；Service层主要调用接口层的公共方法；Controller层主要调用服务层的接口来控制业务流程。平台架构图如图1所示。该平台基于微信公众号开发，用户通过自定义的安全域名，绑定微信授权地址和回调地址请求微信服务器端，微信端验证成功后发送响应信息给用户。 图1. 扫码签到平台架构 3.2. 校园签到平台软件结构设计 根据上节平台的功能需求分析，该平台分移动端和服务器端，根据“高内聚、低耦合”原则，设计为基础、学生、教师、管理员等模块。该本平台客户端、服务器端软件结构设计分别见图2~3。 图2. 客户端软件结构 图3. 服务器端软件结构 3.3. 数据设计 依据平台的需求，该平台主要包括用户、管理员、学生、教师、课程、班级、教室、二维码、院系和教学任务等实体。 用户实体属性：用户ID、openId、昵称、用户头像、普通用户类型、用户生成时间、用户更新时间等；管理员实体属性：管理员ID、登录名、登录密码、生成时间、更新时间；学生实体属性：学生ID、用户Id、班级Id、学生名、学号、年级、院系、生成时间、更新时间等；班级实体属性：班级ID、班级名称、班级生成时间、班级更新时间等；院系实体属性：院系Id、班院系名称、生成时间和更新时间等；教师实体属性：教师ID、用户Id、教师姓名、教师年龄、电话、邮箱、生成时间、更新时间等；课程实体属性：课程ID、课程名、课时、状态、生成时间、更新时间等；教室实体属性：教室ID、教室名称、教室地点、状态、生成时间、更新时间等；签到二维码实体属性：教师Id、学生Id、课程Id、班级Id、教学安排Id和生成时间等；教学任务实体属性：教学任务Id、班级Id、课程Id、教室Id、用户Id、生成时间和更新时间等。 根据平台需求，上述实体间的联系见图4。 图4. 系统E-R图 签到平台使用MySQL数据库存储数据，依据上面分析，在数据库中设计user (用户表)、admin (管理员表)、student (学生表)、teacher (教师表)、class (班级表)、croom (教室表)、course (课程表)，arrange (教学安排表)，sign (签到表)等表。 3.4. 关键问题设计方案 本节将描述身份精确定位、自动获取周次和生成具有时效性的二维码等问题的设计思路。 1) 身份精确定位设计方案 用户首次进入平台个人中心需先确定身份，以便再次进入该平台时可以自动获取用户信息。用户授权登录成功，选择身份后，平台将该身份数据传入服务器端。服务器端分析传入的身份数据1或0，进而确定身份信息，分析成功后入库。用户身份选择成功后，进入个人中心时，平台根据已录入的身份类型进行分析，自动进入到对应的个人中心页面。若用户再次进入个人中心，身份已确定。当用户处于签到公众号平台时，移动端可自动获取用户微信信息。 2) 自动获取周次设计方案 教师可在微信端查看任意周次签到记录。教师按授课时间选择周次，平台首先获取到事先录入到平台的开学时间，然后再调用日期接口获取当前时间戳，二者相减，得到时间差。将相减的结果向上取整后对7整除，动态获取本周及以前的周次(不会获取到超过本周的周次)，并在一级选择器中自动显示。 3) 生成具有时效性的二维码设计方案 生成教师拥有的时效性二维码，以便学生扫码签到。教师选择所教院系、班级、本节课程、地点等信息生成实时的签到二维码，同时记录二维码生成时间。平台获取当前时间戳和生成二维码时间戳，二者相减，差值进行时间换算后，对1小时整除，得到有效的分钟数(比如10分钟)。二维码的时效性为5分钟，学生需在5分钟内扫码签到，否则，二维码无效，不能再进行签到。 4) 随机抽查设计方案 教师随机抽取课堂学生签到情况，核实学生是否代签，避免统计失误。平台根据教师、上课班级、课程名、地点等信息，调用随机函数随机显示学生姓名。教师点击停止菜单，口头核实界面显示学生签到信息，若有误，则会记为旷课并入库。 3.5. 客户端关键模块设计 客户端包括基础模块、普通用户模块。基础模块为用户共有操作，该模块设置微信公众平台对接、身份选择、个人信息设置三个子模块；普通用户模块包括教师和学生子模块。限于篇幅，本节只描述客户端关键模块的设计。 3.5.1. 微信公众平台对接模块的设计 对接模块连接平台与微信端，包括微信授权、身份选择和信息审核等功能。微信授权即基于微信公众平台获取用户基本信息。用户扫码关注公众号后，自动进入微信用户授权界面，待用户同意且选择身份后，平台自动获取保存该用户的微信信息。微信授权登录流程设计如图5所示。 图5. 微信授权流程 1、类与接口设计 主要用到的类和接口有实体类User、接口类UserDao、用户业务逻辑类、用户信息控制类。 1) 微信对接控制类(UserController)：获取保存已关注公众号的微信用户信息； 2) 微信对接Service类(UserService)：处理微信对接的相关业务逻辑并调用UserDao层的方法； 3) 微信对接Dao类(UserDao)：负责数据库中微信用户信息的操作。 其他模块的Service类、Dao类功能与此模块类似，后面不再描述，只描述控制类的设计。 2、微信授权功能设计 1) 用户关注公众号进入微信授权页，平台返回授权地址，用户确认授权登录后，数据传到服务端请求UseController类。在控制层中调用UseService中的getCode()方法，此方法调用接口UseDao中的getCode()方法，平台根据该用户的appId和secret获取授权码code。平台根据获取的授权code请求UseController。在控制层中调用UsrService中的getToken(String code)方法，调用接口UsrDao中的getToken(String code)方法，获得授权登录token。 2) 通过上步骤获得的token请求UsrController，调用UseService类中的getUserInfo(String token)方法，此方法调用接口UsrDao类中的getUserInfo(String token)方法得到用户微信信息。 3) UseController控制类调用UserDao接口类中的insertUsers(Users us)方法自动保存用户信息。 具体设计过程如图6所示。其他模块功能设计过程交互类似，不再图示。 图6. 微信授权设计 3.5.2. 课堂考勤子模块的设计 该模块包含生成签到二维码和分配教学任务功能。教师进入个人中心，跳转到生成二维码界面，手动选择上课班级、地点和课程，平台依据选择信息生成具有时效性的二维码。生成签到二维码的流程设计如图7所示。 1) 类与接口设计 该模块设计的实体类主要有课程course、班级class、教师teacher和二维码code；接口类有教师接口类TeacherDao、教学安排实体类ArrangeDao类；业务处理类有TeacherServiceImpl和CodeServiceImpl；控制类有TeacherController类和CodeController类。课堂考勤的控制类(CodeController)：生成签到二维码并调用CodeService中的方法。该类中定义findTeacherByUserId()方法获取教师信息；findTask()方法查询教师的教学任务信息；GetCode()方法根据课程Id、班级Id、教师Id、教学安排Id等生成签到二维码。 图7. 生成签到二维码流程 课程实体类(Course)：数据库表结构对应的实体类，封装课程自增Id、课程名称(name)、课时(courseCount)、状态(status)、加入时间(createTime)、更新时间(createTime)等其属性。 2) 生成签到二维码设计 教师进入个人中心，选择生成课堂签到二维码，数据传到服务端请求TechersController。在控制类中调用TechersService类中的findTeacherByUserId()方法，此方法中调用TechersDao类中的findTeacherByUserId()方法，获取教师用户信息。 教师选择课程，数据传到服务端请求TecherController类。在控制层中调用TecherService类中的findTask()方法，此方法中调用接TecherDao类中的findTask()方法，显示课程相关数据以及课程对应的班级和教室地点，点击确定菜单生成具有时效性的签到二维码。 3.5.3. 扫码签到子模块的设计 学生在课堂扫描带有时效性的二维码签到，包括微信扫一扫签到和查看签到记录功能。学生进入个人中心，完善信息后扫描签到二维码，扫码成功后保存本次签到信息。扫码签到流程设计见图8。 1) 类与接口设计 该模块设计的类与接口有签到实体类Sign、接口类SignDao、业务类SignServiceImpl和控制类SignController。扫码签到控制类(SignController)：扫码签到，并调用SignService中的方法。该类定义Scan()方法，调用微信扫一扫接口；定义SignAndAdd()方法，获取学生扫码签到信息，并分析入库；定义的findAllMySign()方法查询学生签到记录。扫码签到实体类(Sign)：数据库表结构对应的实体类，封装教室关联Id(croomId)、班级关联Id(classId)、学生关联Id(userStuId)、教师关联Id(userTeachId)、课程关联Id(courseId)、教学安排关联Id(arrangeId)、签到时间(signtime)、加入时间(createTime)、更新时间(updateTime)等属性。 图8. 扫码签到流程 2) 扫码签到功能设计 学生进入个人中心，选择扫一扫签到选择。数据传到服务端请求StudentController。在控制类中调用StudentService中的scan()方法，该方法中调用StudentDao中的scan()方法，系统调用微信扫一扫接口扫描签到二维码。扫码成功后，系统提示签到成功。签到成功后，数据传到服务端请求StudentController。在控制类中调用StudentService中的signAndAdd(Sign sign)方法，此方法调用接StudentDao中的signAndAdd(Sign sign)方法，学生签到后自动保存信息。学生点击签到记录，请求数据传到服务端请求StudentController。在控制类中调用StudentService中的findAllMySign()方法，该方法调用接StudentDao中的findAllMySign()方法，查看签到记录。 图9. 随机抽查流程 3.5.4. 随机抽查子模块的设计 教师随机抽查核实班级学生签到。教师进入平台，选择随机抽查后，随机显示学生姓名，当停止抽查时教师可看到该学生签到情况。随机抽查流程设计见图9。 1) 类与接口设计 该模块涉及Student类、Teacher类和Sign类。随机抽查控制类(SignController)：统计签到记录，并调用SignService中的方法。SignService类中findAllStudents()方法查看本班所有的学生信息；findRandom()方法随机核实学生签到信息；findTeacherByUserId()方法查看教师信息。 2) 随机抽查功能设计 教师选择随机抽查，选择班级，数据信息传到服务端请求StudetController类。在控制类中调用StudetService类中的findAllStudents()方法，该方法调用接StudetDao类中的findAllStudents()方法，随机显示该班所有学生信息。教师随机选择停止，将选择学生数据传到服务端请求StudetController。在控制类中调用StudetService中的findSignByRandom()方法，该方法中调用StudetDao类中的findSignByRandom()方法，显示该学生签到情况。教师通过口头喊到方式对抽查到的学生进行核实，并记录是否旷课。 3.5.5. 统计签到子模块的设计 教师进入个人中心，可查看本节课、每日、周、学期签到统计和缺勤统计等。 1) 类与接口设计 该模块设计了Sign类、Student类和Teacher类等实体类。设计了页面请求类SignController，在Service层设计SignServiceImpl类处理统计签到信息，数据查询设计SignDao接口类。SignServiceImpl类依赖SignDao接口类进行业务逻辑处理。统计签到控制类(SignController)：定义findCurrent()方法，查看本节课签到记录；findDaySign()方法查看日签到信息；findTermSign()方法用查看学期签到记录；findAbsent()方法查看本节课缺勤学生信息；findWeekSign()方法查看周签到信息；findClasses()方法查看班级列表。 2) 统计签到功能的设计 教师依据不同的签到统计，选择不同的参数，将数据传到服务端请求SignController。在控制类中调用SignService中的不同方法(findCurrent()、findDaySign()、findTermSign()、findAbsent())方法，该方法调用SignDao中的对应方法，平台根据教师Id、课程Id、开始和结束时间等查询并分别显示、日签到、周签到、学期签到、本节未签到等统计信息。