Giter Club home page Giter Club logo

wakeupschedule_kotlin's Introduction

WakeUp课程表 3.612

Google Play 下载 | 酷安下载

声明

开源旨在可以降低后来者的门槛,借鉴可以,但是希望在相关 App 中能有所声明。

教务网页解析的部分单独抽出了一个库,见 CourseAdapter

近期要忙于毕设,欢迎大佬们 PR

上架情况

截至2020.02.10

  • 酷安[√] 19万
  • 应用宝[√] 12674
  • 魅族应用商店[√] 21590
  • 小米应用商店[√] 61799
  • OPPO应用商店[√] 19.3万
  • VIVO应用商店[√] 23万
  • 华为应用商店[√] 51.9万

开源相关

集成的开源库

参考项目

苏大的正方教务模拟登录和课程解析部分参考了另一个课程表项目,不过我对课程解析部分改动非常大,导入更为准确。

TODO

  • 集成“咩咩”
  • 支持课程笔记
  • 直接写入系统日历
  • 完善对方正教务课程的解析
  • 适配已经提交数据的学校
  • 数据备份和恢复(用课程文件导出导入实现了,还支持分享)
  • 课程分享
  • 增加对夏冬令时的支持(可以设置任意数量的时间表)
  • 注册登录,小范围的社交,主要是为社团的活动服务
  • 完全迁移至AndroidX
  • 国际化

License

Copyright 2019 YZune. https://github.com/YZune

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
 limitations under the License.

wakeupschedule_kotlin's People

Contributors

ludoux avatar lyt99 avatar yousiki avatar yzune avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

wakeupschedule_kotlin's Issues

English Version

Great Job, but i don't really understand the follow of app, can you add english version for this application, i think it's very useful 👍

请求删除暨南大学的课程导入

学校近期使用了新的教务系统(还是定制的o(╥﹏╥)o),旧教务系统已经不再更新,因此原有的课程导入无法导入最新的课程,新课程导入有些复杂,这两天研究研究_(:з」∠)_

清华大学课程导入支持

懒得提PR了qwq,在ImportView里面加一个如下函数。参数username是用户名而非学号所以输入框需要是text类型的。

suspend fun loginTsinghua(username: String, password: String): String {
    //login
    val LEARN_PREFIX = "https://learn2018.tsinghua.edu.cn";
    baseList.clear()
    detailList.clear()
    val course = ArrayList<String>()
    var cookies: Map<String, String>?
    val ticket = Jsoup.connect("https://id.tsinghua.edu.cn/do/off/ui/auth/login/post/bb5df85216504820be7bba2b0ae1535b/0?/login.do")
            .data("i_user", username).data("i_pass", password).data("atOnce", true.toString())
            .timeout(10000).post()
            .body().select("a").attr("href").split('=').last()
    val loginResponse = Jsoup.connect("$LEARN_PREFIX/b/j_spring_security_thauth_roaming_entry?ticket=$ticket")
            .execute().let {
              cookies = it.cookies()
              it.statusCode() in 200..299
            }
    if (!loginResponse) throw Exception("Incorrect username or password.")
    //getSemesterIdList
    val semesterIdArray = JSONArray(Jsoup.connect("$LEARN_PREFIX/b/wlxt/kc/v_wlkc_xs_xktjb_coassb/queryxnxq")
            .cookies(cookies).execute().body()).let {
      Array<String>(it.length()) { i: Int -> it.getString(i) }
    }
    //getCurrentSemester
    var currentSemester = JSONObject(Jsoup.connect("$LEARN_PREFIX/b/kc/zhjw_v_code_xnxq/getCurrentAndNextSemester")
            .cookies(cookies).execute().body())
            .getJSONObject("result").getString("id")
    if (currentSemester.split("-").last() == "3" && semesterIdArray.indexOf(currentSemester) > 0)
      currentSemester = semesterIdArray[semesterIdArray.indexOf(currentSemester) - 1]
    //getCourseList
    val courseList = JSONObject(Jsoup.connect("$LEARN_PREFIX/b/wlxt/kc/v_wlkc_xs_xkb_kcb_extend/student/loadCourseBySemesterId/$currentSemester")
            .cookies(cookies).execute().body())
            .getJSONArray("resultList")
    val courseDetailList = Array<Array<String>>(courseList.length()) { i ->
      JSONArray(Jsoup.connect("$LEARN_PREFIX/b/kc/v_wlkc_xk_sjddb/detail?id=${courseList.getJSONObject(i).getString("wlkcid")}")
              .cookies(cookies).execute().body()).let {
        Array(it.length()) { idx ->
          it.getString(idx)
        }
      }
    }
    for (i in 0 until courseList.length()) {
      baseList.add(CourseBaseBean(i,
              courseName = courseList.getJSONObject(i).getString("kcm"),
              color = "#${Integer.toHexString(ViewUtils.getCustomizedColor(getApplication(), i % 9))}",
              tableId = importId
      ))
      for (j in 0 until courseDetailList[i].size) {
        val matcher = Pattern.compile("星期([一二三四五六七日])第([1-6])节\\((.*?)\\),(.*)")
                .matcher(courseDetailList[i][j])
        if (matcher.find()) {
          val matchRs = matcher.toMatchResult()

          detailList.add(CourseDetailBean(i,
                  day = "一二三四五六七日".indexOf(matchRs.group(1)) + 1,
                  room = matchRs.group(4),
                  teacher = courseList.getJSONObject(i).getString("jsm"),
                  tableId = importId,
                  startNode = when (matchRs.group(2).toInt()) {
                    1 -> 1; 2 -> 3;3 -> 6;4 -> 8;5 -> 10;6 -> 12
                    else -> 0
                  },
                  step = when (matchRs.group(2).toInt()) {
                    2, 6 -> 3
                    else -> 2
                  },
                  startWeek = if (matchRs.group(3).contains("")) 9 else 1,
                  endWeek = if (matchRs.group(3).contains("")) 8 else 16,
                  type = 0
          ))
        }
      }
    }
    return write2DB()
  }

以及想知道如何在导入课程的时候自动设置该课表的节数、上课时间等,免去手动设置的麻烦。

关于导入导出

能否对导入导出的文件写一个简单说明,我校是青果教务系统,教务系统直接查询课表是图片,但我有其他接口可以使用,通过对导入导出文件的了解,我可以自行适配。

有调休功能吗

比如国庆假之类的, 放假的时候可能要调休, 可不可以加一个 把某天的课全部移动到另一天去 的功能, (或者说已经有这样的功能了只是我不知道?)

请问项目还在维护吗?

注意到此仓库已经很久没有新提交了,但是各应用商店依然在更新新版本,是转移了项目地址还是不再开源了?
谢谢。

F-Droid

请问是否可以将应用发布到 F-Droid?

提供双指缩放

手机上由于未知原因,无法输入缩放比例,提供双指缩放可以作为一个解决方式

适配南大课表导入

您好, 我自己已经适配了南大课表导入.
https://github.com/lyc8503/nju2wakeup

因为只会 Java 不会 Kotlin 的缘故, 没有使用 CourseAdapter. 而且要获取的也不是一个页面, 处理相对复杂, 就自己写成 Python 了.

是否能请您在软件中加入一个跳转链接提示跳转到这个项目?

加入周数及日期显示

希望在APP中左右翻页时显示当前页面是第X周,X月X日。
该功能有助于对照课表查看未来某活动是否撞课等。

SCUT教务系统登录地址调整 & 小建议

http://xsjw2018.scuteo.com/driotlogin
↓ ↓ ↓
http://xsjw2018.scuteo.com

http://xsjw2018.scuteo.com/sso/driotlogin 也可。

另外的小建议

  1. 加入隐藏过期(已过该课程所在的最后一周)课程选项,某些情况下可能比当前的隐藏非本周课程更为实用。
  2. 可选当天课程全部完成后小部件即显示下一天课程。
  3. 非本周可以细化为「下周」「上周」「*周前/后」。
  4. 批量匹配删除地址内的给定字段,如校区名称。

Feedback collection (Webview, AppWidget and so on )

错误 & 缺陷

    • 1、Webview 不能模拟 UX,某些手机版网页不能导入。返回键整个 Activity 销毁。
    • 2、设置内,所有 GitHub 转跳失效。
    • 3、右&左 滑抽屉和主页面是一个 Activity,返回键直接返回 Launcher 。
    • 4、部分情景下 Launcher 和 AppWidget 的滑动冲突。
    • 5、大佬不卖萌。

建议 & 解决方法

    • 1、尝试使用系统原生 Webview (Android Webview)定制,解决模拟 UX (自带)等问题。
    • 2、希望使用 FCM 推送通知(其它家的 push ,可选:-))。
    • 3、AppWidget 添加上下滚动按钮,左右切换周数查看。
    • 4、希望能支持Wear(与手机配套使用)
    • 5、上架 Google play store(我可以提供支持)
    • 6、大佬卖萌。

同一时间段非本周课程的显示和设置问题

同一时间段非本周课程在app中会重叠显示。此时若点击该课程区域,只能点开一个。需要切换为不现实非本周课程才能解决。不知道下一个版本能否修复一下这个问题。超级课程表的卡片切换或许是一种解决方案。

为每一节课加入独立的起讫时间

Snipaste_2019-09-01_04-27-41
如图,在敝校,课程是没有“节”这个概念的,它们可以在任何一个时间开始也可以在任何一个时间结束。如果将每一个时间段设成一节课,就会破坏时间上的先后关系;以最小单位 10min 为一节课也是做不到的。
所以,想要解决这个问题,就需要允许为每节课设定独立的起讫时间。但是这样又会涉及到需要修改 UI 的问题。
(很棒的作品,感谢作者!)

上课时间 - 每节课时长 的 UX 问题

位于「菜单 - 管理 - 课表设置 - 上课时间」下的「设置时间」,当勾选「每节课时长相同」后,「每节课时长」使用的 Slider 控件交互操作不便,请求增加 EditText 控件。

当课程信息的某个字段含有空格时,导入内容错误

版本号:3.25(酷安应用市场)
教务系统类型:正方

假设有这样一节课程,教师是外教(姓名中含有空格):
example
则导入的结果如下图所示:
info
空格后的内容被误判为上课地点,填入了下一栏

我认为问题可能出在这一段:ImportViewModel.kt#L179

val split = source.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()

根据教务系统的网页源码,两个字段之间是用换行符 <br> 进行分隔的
如果以换行符作为判断字段结束的标志,是否就可以避免这个问题呢?
之前使用过的课程格子没有出现这个问题,不清楚它是怎样实现的

我不懂代码,仅供参考,不当之处请指出> <

是否可以加入文字OCR的方式添加或者导入课表

看APP处处透露着可爱的风格,是位可爱的学姐开发的吗?本人是从事嵌入式方向学习的,对机器视觉等有一些了解,是不是可以通过OCR(文字识别)的方式,全局解决导入和适配的问题,这样学姐和团队就不必辛苦做导入适配了

添加对北邮新教务系统的支持

北邮今年换新教务系统了,基于强智的,不过和现有的有一点点不同,具体适配方法:
在QzWithNodeParser.kt文件中将第十行改为 val courseName = Jsoup.parse(infoStr.substringBefore("<font").substringBefore("<span").trim()).text() ,在SchoolListActivity.kt文件中第212行之后加入 add(SchoolInfo("B", "北京邮电大学新教务", "http://jwgl.bupt.edu.cn/jsxsd", TYPE_QZ_WITH_NODE)) 即可完美适配。基于3.612版本源代码。

课程信息里未显示整个课程的上课周

如下图,显示的起始周和结束周是该老师的上课周,看不见整个课什么时候开始及什么时候结课

这是某一门课,从13周到16周,每一周老师都不一样:

the_13_week
the_14_week

希望能够显示结课周、剩余课数或者剩余周数。此外如果还有空间,可以显示开课周、已上课数或者一开课多少周等

课表设置中学期开始时间,设置的时间被显示到了上课时间

版本:Google play 3.576

Screenshot_2019-12-16-13-56-07-156_com suda yzune wakeupschedule pro

可以看到上课时间是2019-2-4,但是实际上是刚刚点击学期开始时间设置的日期。只是显示问题,退出后再进入可以看到修改是成功的。


然后我校长沙理工大学的课表解析有问题。
Screenshot_2019-12-16-13-56-15-943_com suda yzune wakeupschedule pro

除去HTML的问题,第五节实际应为5-6节,往后顺延。(没发现长理的解析相关代码,是没有push上来吗)

导出ics的时区问题

默认导出的ics没有带时区,在导入一些日历程序的时候会被默认为UTC时间,表现为时间差8小时,是否可以加入时区选项

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.