-
Notifications
You must be signed in to change notification settings - Fork 0
cherryMonth/BWC
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
微信考勤系统项目规划 1 系统采用分层架构 1 界面层 2 业务逻辑层 3 数据逻辑层 4 数据层 数据层 提供对原始文件的读写和追加 对外提供一个接口 负责对数据的继承操作 不负责数据的逻辑处理 接口类 操作对象 操作类型 操作参数 DataLayerInterface(filename,’type’,{key:item…}) 接口类的成员函数 read(); Write(); Add(); 接口类的成员类 Read类 Read函数 参数1为文件名 字符串类型 原子操作要么成功 要么失败 参数2 为字典 键值为表中的键值 字典的值为选项 一个选项对应表中的一行 如找到名字为张三的人的所有信息 那么名字就是键 而张三就是选项 返回该表中张三所在行的信息 该字典可有多个键返回多个满足选项的信息 实现了通配符功能 当键值为空时返回文件所有信息 若文件名不存在则返回None 调用成功返回一个字典 Write类 Write函数 参数1为文件名 字符串类型 参数2为字典 每一个键对应表中的一行信息 先读取文件的所有信息到一个字典中 再把参数字典加入到该字典中 覆盖掉主键相同的一行 然后写入到文本 该函数一般用来创建新文件,但是当外部内容与内部内容有重复时调用该函数可以达到覆盖的目的。若某一项的键值全部为空则表示删除该行。 该函数返回值操作成功为真操作失败返回假 Add类 Add函数 参数1文件名 字符串类型 参数2为字典 把字典中的内容追加到文本最后 该函数用于向已存在的文本添加信息,该函数无法覆盖掉主键相同的两行,不能去重。若某一行为空则表示操作失败无法添加。 若文本不存在则返回False 否则返回True 数据逻辑层 该层对用户指令的有效性进行验证和处理 接口函数: 去重 就是设定一个一个或者主键 把这些主键的值作为一个键 利用二层循环判断外部数据的键和内部数据的键是否有相同的 若相同则覆盖 若不相同则吧计 数器置1 并打断循环 把该键对应的数据加入内部数据 参数1 是内部数据 参数2是外部数据 参数3 是主键的列表 数据检查函数 参数1 被检查的数据 参数2 检查的格式 字典可以为缺省值 参数3为错误信息字典 默认数据检查函数 检查每一行是否有缺省值或者有多余的数据 正则数据检查函数 利用正则表达式对数据进行核对 Update 参数 1 文件名 参数 2 操作类型1可以是 覆盖重复内容 也可以删除重复的内容 判断两个参数是否相同的标准就是对应key值是否全部相等 参数 3 外部数据 参数4 给出的主键 查询类Query构造参数 参数1 用户ID 提供该操作的用户的用户ID 用来验证是否有权限对该文件进行读取 字符串类型 参数2参数 表明对文件的查询参数 参数为字典代表从某一文件中查找与该字典匹配的信息 改参数为空代表验证文件是否存在 参数3 表示查询的文件名 文件名为空但是参数不为空代表查询该参数出现在哪个文件中。当参数中有多于的键时若该键的值为*代表不用管该键 当为?代表只能匹配一次 当该键指定值但是文件中不存在该键则不匹配 Get_keys 参数1 文件名 操作过程 函数返回文件的所有键 GetObjectInfo 参数1 键值 返回对应键的所有信息查询项目根目录下所有文件返回满足信息的列表 GetObjectFilename参数1 键-值1 返回满足对应键值组合的文件名 增加了数据逻辑层的借口 模仿着创建线程的方法 有一个调用函数和调用参数 有唯一一个函数run获取结果 业务层 导入模块 普通文件是文件 创建者拥有rw 组用户拥有r 其他的r— 用户也是文件拥有三种权限 向用户写入 读取用户 写入用户就是修改用户的信息 比如修改个人信息 管理员的组为 0 ID为0 拥有对任何文件的rwx 但是对关键文件的修改会记入到日志 导入 源文件 目标文件 标准格式 源文件的操作函数 有时间源文件不合法 就是格式与目标文件不对应 我们就可以通过操作函数实现对目标文件的格式化 考勤逻辑如下: 为了简化考勤的操作 对考勤进行简化 不对数据的有效性进行分析 假设数据全是有效的 不对时间进行分析假设时间全是有效的 具体的验证放到业务校验模块 业务校验模块是与界面层的接口 要考勤就要有载体单独存储考勤信息 每当有用户开始考勤或者考勤截止就要独立于主程序之外进行操作 老师开始考勤时 首先输入教师ID判断该教师是否存在 若存在则输入课程和教授的班级ID若两者任意一环失败则表示操作失败 然后记录该次的考勤时间 判断当前是否可以考勤 在判断该课头是否已经被考勤 若两者任意一环失败该用例结束 若操作成功追加seq表 该教师的此次考勤信息 并把该次的考勤记录追加到考勤队列中 该考勤队列的信息如下 以老师ID为键 以班级和课程ID为键组成的字典为 值 作为结点元素 创建一个线程 先让他挂起 挂起时间取决于距离下课时间的范围 当到达结束时间时 对指定文件进行操作 计算结果写入文本 线程需要的参数为 需要写入的文件名 以及需要挂起的时间 2个参数 手动考勤 自动考勤 随机考勤 自动考勤和随机考勤都会自动持续到下课 自动考勤时可以进行随机考勤 自动考勤 和 手动考勤会生成考勤文件 两者不同同时出现手动考勤必须在非上课时间内进行 所以随机考勤的内容直接加入到自动考勤的文件里面 就不用单独给随机考勤新的文件名 自动考勤在最后59秒内无法开启 这是由于在最后1分钟内学生很难进行有效的验证 由于时间紧迫出错的可能性很大 但是在下课后到下节课的上课前可以进行手动考勤 手动考勤不需要添加时间窗口 对于自动考勤需要设置窗口关闭时间 默认是到下课 所以对于每一个开始的窗口都要记录他的开始时间当做参考点才能进行计算 对于随机考勤来说是可以重复开启的 但是必须在自动考勤开始之后 可以在开一一个随机窗口之后再次开启一个随机窗口 为了保存之前考勤窗口的信息的同时打开新的随机窗口 需要设置一个变量 首先创建一个线程 把初始的变量赋值给他后开始挂起 之后若有新的随机窗口出现 那么变量加1 这样之前的线程终止休眠之后 发现已有的变量和之前的变量不一样 就会直接退出而不用写入数据 这是因为每当开启新新的随机窗口都会判断此时随机窗口的状态 若不存在或者为假时直接创建 但是若存在一个随机窗口则需要保存此时的数据 并修改变量的值 但是可以使用手动考勤 判断一个学生迟不迟到的关键因素在于判断他在验证有效期的行为 老师开始考勤时判断此时是否可以考勤 判断的依据就是 必须在上课十分钟之后和下课之前的一分钟内 也就是给定时间 判断该时间是否在有效的时间内 因为对时分秒比对起来很麻烦 统一使用秒制 对于满足要求的时间段进行筛选 通过循环判断 当前哪个时间段符合 此时的考勤时间 若符合 写出此时是第几节课 距离下课的时间 距离上课的时间 把这些信息作为字典返回 创建一个老师日志 专门记录该老师的各种设置信息 老师可自定义考勤规则 开启微信后,“考勤”默认为关闭的状态,需要老师登录微信后台,在“开启考勤”项目中设置启用。 按天查询,可查看学生签到和签退的时间,上课时长以及上课心情,并根据签到和签退的时间判断上课是否迟到或早退。 ⑵.按月查询,可查看一个班全体员工在这一个月内的考勤记录,理论工作日和实际工作日,签到,迟到、早退次数。 创建一个日志 专门记录每个老师的括考勤规则 事假应在前一日下午10点前申请,经老师查实认可并核准后方为有效 当然可按照老师指定的规则 由老师自行决断 详细设计如下: 考勤的关键在于确定学生提交信息和提交时间并对信息和时间的有效性进行检验 对信息的检验由于硬件或者技术问题暂用产生随机数的方法判断信息是否有效 能做的就是对时间的把握 如何对时间进行把握 对时间进行处理就需要相应的规则 没有对应的规则作为依靠 就没有判断的基础 判断规则 凡是在开启自动考勤配置信息指定的分钟以后不到者记为缺勤 在开始考勤之后的限定时间没到可记为迟到 未事先办理请假手续而无故缺勤;或请假未经批准私自休假者;各种假期愈期不归,又无续假手续者;或采取不正当手段,涂改、骗取、伪造休假证明者;或违纪、违规行为造成的缺勤;或未办完离职手续而擅自离职的,视为缺勤。 请假者请自行插入假条到某一具体考勤细节表中 系统记录提交时间 无法考勤者需向老师当场汇报 老师在考勤后手动维护该学生的记录 否则按缺勤处理 若要修改则使用不同的考勤规则 对应的考勤细节表可以表现为 学生WechatID 考勤类型(响应的考勤类型 自动 随机 手动 请假) 考勤开始时间 考勤记录时间 证据是否有效 考勤证据 考勤认证结果 关于老师自定义规则流程如下: 规定开始考勤后A分钟定义为 迟到 B分钟后定义为缺勤 并附带上教师的wechatID 创建csv文件 形式如下 默认是自动存在第一条记录 wechatid autolate AutoNone randomlate randomnone 在老师开始考勤后显示 当前考勤类型 考勤规则 当前被考勤的人数 被考勤的班级 课的类型 考勤有效截止时间 以及考勤的结束时间 挂起一秒刷新状态 知道老师确定为止 这是为了让教师明确他此举的意义所在避免教师盲目考勤 考勤信息的显示 出勤情况随堂(实时)统计:教师可以在上课中、课间、课后统计本次上课的出勤率、请假人数,以及缺勤的学生信息。 出勤情况历史统计:教师可以在任意时间统计某门课某次上课的出勤率和该门课程的平均出勤率,生成某次上课的出勤情况统计表。 出勤成绩输出:输出表格的样式参考学生平时成绩表的样式,计算方法由用户在输出前指定。 权限管理:系统提供权限管理功能,对于教师角色的用户可以使用管理功能维护自己课程内的学生姓名,学生学号。 请假认定:教师在课下集中认定所授课程中,学生提交的假条,并将相应的学生请假状态从[已经提交假条]标记为[请假]或者[缺勤]。后补的假条可以充抵某学生某次课程的早退、迟到、缺勤记 学生请假有三种情况 1 在上课时提交 2 在下课后生成汇总表之前提交 3 在 生成汇总表之后提交 出现第一种情况和第二种情况对于生成汇总表时的反应是一样的 都是提醒老师让老师批准 把状态从unknown 修改为 True 或者False 把结果修改为 请假或者缺勤 第三种情况就是汇总表生成之后学生再次向detail表添加信息 这个时间老师是不知道的 所以此时需要向教师打电话 同一个学生向同一个一个考勤细节表提交请假只能提交一次 老师了解到情况后重新计算该次考勤结果也可忽略学生的请求 全局计算时 若一个学生已经被认定为是缺勤或者迟到 那么除了请假之后的认证是无效的 所以不用对该学生重复计算 若一个学生已经被认证为请假那么该学生的考勤信息已被认定为无效之后的考勤会被跳过 所以学生考勤时要判断当前的学生是否是已经请假过的 若一个学生的考勤状态覆盖权限以其请假为最高 若一个学生考勤过但是若提交请假则覆盖掉并修改为请假 具体流程如下 学生打开学学生请假页面 出现 向正在进行的课请假 向历史课程请假 第一种情况需要向当前的考勤队列中寻找 第二种向目标文件追加信息 教师生成汇总表 就是指定考勤的次数 对指定的细节表进行计算 向考勤队列和向文本写入的区别是什么 向文本写入需要指定各种键值 而向考勤队列则只需要三个键值 所以向脚本写入就需要指定键值 学生辅助类的请假函数只需要提供最基础的信息 其他由系统自动补全 学生请假类的各种信息的认定规则 StuID,IsSucc,checkTime,ProofPath,checkinType,checkinResult,checkstartTime 首先学生在考勤窗口下才能在线考勤 也就是说学生要往考勤细节表添加信息 只能进行在线考勤 才能把自己的信息往细节表写入 然后才是请假 两者的区别是 在线考勤时 一个学生的考勤状况要是不成功可以在考勤的有效时间内提交五次 五次都不行就无法考勤 IsSucc为False 结果为缺勤 就把IsSucc修改成True 当一个学生的IsSucc为True时就不能在提交考勤 若学生提交成绩失败时修改成False 此时学生可继续考勤直到五次完成之后 修改IsSucc为True 所以说当一个学生的IsSucc为True时 就不能接受学生的考勤信息 每次失败就修改成缺勤 若成功后在计算此时的状态并把状态赋值给学生的checkinResult 否则每次失败时不变 学生考勤时若非请假考勤初始时把所有的学生的IsSucc修改成False 并把checkinResult修改成缺勤 每个学生考勤前都是IsSucc为假 且 考勤结果为缺勤 不管该堂课该学生被抽点了多少次 只要该学生请假成功 查看考勤状态就不为缺勤 若该学生浪费完了所有的机会他就无法在线进行请假 只能下课后插入假条到某一考勤细节表 出勤情况随堂统计流程如下 先从考勤队列中寻找有没有与该老师有关的考勤对象 若当前存在正在考勤的窗口 则显示此时正在考勤的窗口 若当前没有 则通过seq表找到此次最近的考勤细节表 打印出勤率 请假人数 和缺勤学生信息 随堂统计与历史统计通用同一个计算函数 所以一个学生的状态有五种 正常 迟到 早退 缺勤 请假已提交 请假已批准 明确正常和迟到是必须在这早退和缺勤就是不在这这是两者本质的区别 首先正常的优先级最低 谁都可以覆盖他 迟到是之前的状态都为正常或者迟到但是某次抽点出现迟到那么就是迟到 只能有优先级比他高的才能覆盖 早退就是之前是正常或者迟到但是某次出现缺勤就是早退 缺勤就是最高某次缺勤就一直是缺勤 特例 请假已提交和请假已批准 这两者优先级比前四种要高 一个学生只能向同一历史细节表插入一次假条若该细节表该学生已经存在请假记录则无法进行请假 所以一旦出现优先级高的就会覆盖掉然后该学生的状态就被定下来了 考勤细节表只是详细的记录每一次的考勤结果 内部没有逻辑性 但是考勤汇总表有逻辑性 他只记录优先级最高的状态 所以考勤细节表就相当于外部状态 首先假设每个学生的状态都是空 0 权限最低 学生的考勤状态 正常 1 迟到 2 早退 3 缺勤 4 请假已提交 5 请假已批准 6 外部的优先级只能为1 2 4 5 6 也就是说早退没法直接判断 初始化时若一个学生的任意一次考勤置为null 若当前状态大于外部权限 若当前为空 状态直接修改为外部状态 若当前为正常或者迟到 若外部是缺勤 则修改为早退 否则覆盖 若当前为早退 除了 5,6 其他的都不能修改‘ 若当前为缺勤 遇见5,6就修改为请假 其他若大于直接覆盖 否则 若当前为缺勤 存在正常或者迟到就修改为迟到 不会存在一个学生的请假既是已提交又含有已批准的状况 因为一个学生只能向同一文件提交一次请假 打开一次考勤窗口同一学生只能考勤一次 之后的数据对与之前的覆盖或者比较 学生向历史记录插入假条必须判断当前细节表是否已经存在该学生的请假记录若存在则无法插入 以上是给定数据返回结果 随堂查看和历史统计都会用得到的函数 若要进行历史统计那么经过老师认定之后所有的未被批准的请假已提交都会被认证为缺勤 也就是说历史统计结果只能是 正常 迟到 早退 缺勤 请假批准 随堂结果可以是 正常 迟到 早退 缺勤 请假已提交 请假已批准 两个用例共用同一个计算函数但是 有各自的显示函数 所以可以定义一个学生的考勤状态要有个当前的信息 并与之后的考勤结果进行比较若高于则覆盖掉 关于各种情况都只能有一次这种设定是为了保持数据的干净 但是老师可以手动维护这些文件 但是维护记录会在系统内部留下日志 考勤细节表除了上课考勤会进行写入和学生添加假条会进行写入之外无法写入其他信息 也就是说老师无法通过请假认定和手动维护来修改考勤细节表 请假认定是老师间接修改考勤汇总表的记录 手动维护只能修改考勤汇总表和学生信息 出勤情况历史统计流程如下 读取该老师的seq表信息 依次统计该老师所有的考勤细节表 若在计算时出现了学生的请假信息记录该次的信息 存入一个列表中 待完成所有的非请假信息后 此时向老师显示 待老师修改过后进行计算后写入考勤结果 考勤窗口 方案如下 课程开启需要两种约束 定义以下四种假设: 假设1:若一节课不能开启考勤那么该课下的老师或者学生至少有一个不能考勤 假设2:若对象是不存在的那么对象的时间是无效的(有效指仍然在该因素该上课的时间内) 假设3: 若对象存在且时间仍然是有效的那么该对象就是不能考勤的 否则就是考勤的 假设4: 对象的个人信息是存在且有效的 推论1: 判断一个对象能否可以考勤就是判断当前对象的存在性和时间有效性 推论2: 对象不存在于考勤队列之中那么该对象就是可以考勤的 推论3: 对象时间的有效性和课程的有效性一致 推论4: 对象存在于队列之中但是时间无效就是可以被考勤的 根据推论得到以下三种结论: 判断老师或者学生信息存在且当前不存在于考勤队列之中那么就是可以直接考勤的 若存在与队列之中 但是时间是无效的那么也是可以考勤的 考勤队列除了第一个可能已经下课之外其他的都是正在进行的 其他情况都是不能被考勤的 当第一个时间窗口开启时 第二个对象是可以所以替换的 因为只有当剔除第一个时才计算与第二个的关系 所以第二个可以随意替换 当替换第一个时在计算与第二个的关系 第一个与第二个的最大时间跨度是100分钟 所以每个课程开启的时间窗口都是有交集的因为若第一个与第二个之间没交集就说明第二个进来之前第一个就已经被踢出 界面设置 老师登录时输入微信号 进入老师功能页面 有开启考勤 开启抽点 维护信息(考勤汇总表 学生信息表) 手动考勤 出勤状况随堂统计 出勤历史统计 出勤成绩输出 设置默认考勤规则 学生有在线请假 响应自动考勤 抽点考勤 查看当前考勤结果 查看历史考勤结果 管理员导入信息 日志维护 接口统一规则 学生登录接口 输入微信号 老师登录接口 输入微信号 出勤成绩输出 自动缺省的所有的汇总表 请假最多的人 早退最多的人 缺勤最多的人 迟到最多的人 该老师上课的所有课程的出勤率 和某一门课的出勤率 可以指定 输出的样式 比如显示出勤率最高的班级 出勤率最高的课程 出勤率最低的课程 出勤率最低的课程 显示全部班级的考勤信息 出勤情况历史统计 :生成某次上课的出勤情况统计表。 出勤成绩输出:输出表格的样式参考学生平时成绩表的样式,计算方法由用户在输出前指定 教师可以在任意时间统计某门课某次上课的出勤率和该门课程的平均出勤率。 需要一个函数测量细节表的考勤结果 根据教师ID和课程号返回班级集合 根据教师ID和课程号获得班级号再结合次序号找到指定的detail文件名返回指定文件的出勤率 根据seq获得该课出现了多少次 再进行计算 得到平均出勤率 因为请假无论成功与否他对出勤率无影响都是没有出勤 概要信息就是显示教了几门课 然后挨个显示出勤率 总的信息就是显示所有的学生信息 所以需要一个函数自动创建该老师所有的sum表 当前已有函数可以自动从seq表读取该老师所有的考勤记录 然后创建考勤汇总表 最后一个汇总函数就是统计每个班的每一位学生的出勤状况统计
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published