{"id":25939152,"url":"https://github.com/enderwolf006/xbt","last_synced_at":"2025-03-04T04:15:51.844Z","repository":{"id":280432937,"uuid":"941840363","full_name":"EnderWolf006/XBT","owner":"EnderWolf006","description":"一个学习通代签到Flutter应用，支持Android\u0026Web","archived":false,"fork":false,"pushed_at":"2025-03-03T12:19:32.000Z","size":3439,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-03T12:27:56.121Z","etag":null,"topics":["flask","flutter","python","xuexitong"],"latest_commit_sha":null,"homepage":"https://t.me/XueBT","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EnderWolf006.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-03T06:20:16.000Z","updated_at":"2025-03-03T12:19:36.000Z","dependencies_parsed_at":"2025-03-03T12:38:35.556Z","dependency_job_id":null,"html_url":"https://github.com/EnderWolf006/XBT","commit_stats":null,"previous_names":["enderwolf006/xbt"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EnderWolf006%2FXBT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EnderWolf006%2FXBT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EnderWolf006%2FXBT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EnderWolf006%2FXBT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EnderWolf006","download_url":"https://codeload.github.com/EnderWolf006/XBT/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241780495,"owners_count":20019061,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flask","flutter","python","xuexitong"],"created_at":"2025-03-04T04:15:51.167Z","updated_at":"2025-03-04T04:15:51.810Z","avatar_url":"https://github.com/EnderWolf006.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003ccenter\u003e\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"Images/Icons/icon.png\" width = 300 height = 300 /\u003e\u003c/img\u003e\n# 学不通\n### 一人签到，全寝睡觉\n\u003c/div\u003e\u003c/center\u003e\n\n## 软件功能\n- 自动识别同班同学\n- 可选的代签生效课程\n- 用户白名单机制(需手动在UserPerm添加)\n- 帮助同使用本软件的同班同学签到\n- 支持签到码/二维码/手势/位置(可自选)/普通签到\n- 支持安卓客户端以及web网页端\n\n## 技术栈\n- 大前端: Flutter(Dart)\n- 后端: Python(Flask, Pymysql)\n- 数据库: Mysql\n\n## 交流反馈\n- [QQ群: 250369908](https://qm.qq.com/cgi-bin/qm/qr?k=yxbcu6vNZm3JvJElnCRHGbMgmNOADF6H\u0026jump_from=webapi\u0026authKey=+4fa+h7XTvKdeECaauj7wEFLOhVAkrtFNUh0VMcC3bP8eAeUqiXwctprZJOFHfkh)\n- [Telegram: XueBT](https://t.me/XueBT)\n\u003cbr\u003e\n喜欢本项目的话，求点亮Star🙏\n\n\n## 实机截屏\n| **签到主页** | **选课配置页** | **用户设置页** | **登录页** |\n|:---:|:---:|:---:|:---:|\n|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/1.jpg\"\u003e|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/2.jpg\"\u003e|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/3.jpg\"\u003e|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/10.jpg\"\u003e|\n| **普通签到** | **手势签到** | **位置签到** | **签到码签到** |\n|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/4.jpg\"\u003e|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/5.jpg\"\u003e|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/6.jpg\"\u003e|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/7.jpg\"\u003e|\n| **二维码签到** | **签到结果页** |\n|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/9.jpg\"\u003e|\u003cdiv align=\"center\"\u003e \u003cimg src=\"Images/8.jpg\"\u003e|\n\n## 食用教程\n\u003e 本教程稍有难度，需一定的计算机基础，如抱着“下载直接用”, “网上找个资源圈钱”的心态阅读此说明，可以洗洗睡了。\n\n本教程分为四部分: 通用配置, 大前端部分, 数据库部分 和 后端部分。\n开始前需先准备：\n- 有公网IP的云服务器（Linux系统）\n- 解析向服务器的域名（中国大陆需先备案）\n- SSL证书(一般云服务商都会有免费证书)\n\n\n### 教程内容总览\n\n- 通用配置: 1. IDE 集成开发环境, 2. Python 开发环境, 3. 公私钥生成\n- 大前端: 1. Flutter 开发环境, 2. 安装依赖, 3. 修改配置, 4. 测试, 5. 打包\n- 数据库: 1. Mysql 安装, 2. Mysql 初始化\n- 后端: 1. 安装依赖, 2. 修改配置, 3. 测试运行\n\n### 通用配置\n\n#### IDE 集成开发环境\n\n鉴于你能看到本页面，本教程默认你已掌握科学上网能力（需开Tun模式）。\n\n开始前还需安装git, [下载传送门](https://git-scm.com/downloads)\n安装好后，找个你喜欢的文件夹打开终端，运行 `git clone https://github.com/EnderWolf006/XBT.git`\n\nIDE使用 `vscode` 作为示例，[下载传送门](https://code.visualstudio.com/)。\n\u003cbr\u003e\n安装vscode后，需要下载几个必要插件\n- Python\n- Dart\n- Flutter\n\n#### Python 开发环境\n本项目使用python3，[下载传送门](\"https://www.python.org/downloads/\")，建议下载3.13版本。需确保安装时勾选添加python到环境变量或安装后手动设置。\n\n#### 公私钥生成\n之所以Python开发环境没有放到后端部分，是因为在开始之前需要先使用python作为工具生成项目的公私钥。下面为生成方法\n\n- 在项目根目录中打开终端\n- 命令行输入 `pip install Crypto`\n- 安装好后继续输入 `python ./Tools/genKey.py` 生成你独一无二的密钥对\n- 生成好的公钥位于 `/Client/assets/keys/public.pem` 和 `Server/keys/public.pem` 中\n- 生成好的私钥位于 `/Server/keys/private.pem` 中\n- 检查它们是否成功生成，并妥善保管私钥，以防泄漏\n\n### 大前端\n\n#### Flutter 开发环境\n先用vscode打开`/Client`, 然后参考官方文档配置即可`https://docs.flutter.dev/get-started/install/windows/mobile`\n\n#### 安装依赖\nvscode中打开`/Client/pubspec.yaml`文件，然后点击右上角下载图标与刷新图标等待完成即可\n\n#### 修改配置\n客户端配置在 `/Client/lib/config.example.dart` 中，使用vscode打开它，按照注释与预设的格式修改即可。修改完成后，先保存，然后重命名该文件为 `config.dart`\n\n#### 测试\n在vscode中打开 `/Client/lib/main.dart` ，在右下角选择设备浏览器或者安卓,然后点击右上角小箭头即可运行\n\n#### 打包\n- 在`/Client/`文件夹终端输入 `flutter build apk --release` 打包安卓客户端\n- `flutter build web --debug` 打包Web端\n注：Web端打包release会玄学报错，有大佬知道如何修复欢迎PR\n\n### 数据库\n\n#### Mysql 安装\n你需要在你的云服务器上安装mysql，\n参考链接[传送门](https://blog.csdn.net/weixin_45626288/article/details/133220238)\n\n#### Mysql 初始化\nMysql 初始化文件在 `Server/xbt.sql` 中，在你的Mysql中创建一个名为xbt(你自己命名也可以，等下需要这个名字配置后端)的库并运行此文件。\n\n数据库可视化工具推荐：Navicat Lite[传送门](https://www.navicat.com/en/products/navicat-premium-lite)，现在已经可以免费用正版基础功能了\n\n### 后端\n接下来的操作均需要将`/Server`上传到服务器上运行, 推荐使用vscode远程连接可视化操作\n\n#### 安装依赖\n在 `/Server` 中打开终端，运行 `pip install -r requirements.txt` 安装后端依赖\n\n#### 修改配置\n打开 `/Server/mysql.example.json`, 修改其内容为你的数据库配置。保存后将文件名重命名为 `mysql.json`\n\n#### 测试运行\n在 `/Server` 打开终端，运行 `python ./index.py` 即可运行，服务将开放于3030端口，此时就可使用flutter端进行测试了。\n\n测试无误后，就可以部署上线了，推荐使用以下步骤及工具\n- 终端运行 `screen -S server` 开启一个窗口\n- 在新 `server` 窗口中cd进`/Server`\n- 运行 `python ./index.py`\n- 使用 `ctrl` + `a` + `d` 退出\n- 配置 `Nginx` 反向代理\n```conf\n# HTTP 到 HTTPS 重定向\nserver {\n    listen 80;\n    # 替换为你的域名\n    server_name xbt.example.com api.xbt.example.com;\n    return 301 https://$host$request_uri;\n}\n\n# Web 静态文件服务\nserver {\n    listen 443 ssl;\n    # 替换为你的域名\n    server_name xbt.example.com;\n\n    # SSL 证书路径（需替换为实际路径）\n    ssl_certificate /home/ubuntu/Nginx/keys/xbt.crt;\n    ssl_certificate_key /home/ubuntu/Nginx/keys/xbt.key;\n\n    # 可选的 SSL 配置优化\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_prefer_server_ciphers on;\n    ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;\n\n    # 静态文件根目录（需替换为你的实际路径）\n    root /home/ubuntu/web;\n    index index.html index.htm;\n    \n    location / {\n        try_files $uri $uri/ /index.html; # 支持 SPA（单页应用），可选\n    }\n}\n\n# API 后端配置\nserver {\n    listen 443 ssl;\n    # 替换为你的域名\n    server_name api.xbt.example.com;\n\n    # SSL 证书路径（需替换为实际路径）\n    ssl_certificate /home/ubuntu/Nginx/keys/api.crt;\n    ssl_certificate_key /home/ubuntu/Nginx/keys/api.key;\n\n    # 可选的 SSL 配置优化\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_prefer_server_ciphers on;\n    ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;\n\n    location / {\n        proxy_pass http://localhost:3030;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        fastcgi_buffers 256 128k;\n        chunked_transfer_encoding off;\n        # python没有处理跨域问题，这里反代处理, 添加 CORS 头\n        add_header 'Access-Control-Allow-Origin' '*' always;\n        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;\n        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Token' always;\n\n        # 处理 OPTIONS 预检请求\n        if ($request_method = 'OPTIONS') {\n            add_header 'Access-Control-Allow-Origin' '*' always;\n            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;\n            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Token' always;\n            add_header 'Content-Length' 0;\n            return 204;\n        }\n    }\n}\n```\n\n## 免责声明\n本项目仅作为交流学习使用，通过本项目加深网络通信、接口编写、交互设计等方面知识的理解，请勿用作商业用途，任何人或组织使用项目中代码进行的任何违法行为与本人无关。如有触及相关平台规定或者权益，烦请联系我删除。         \n\n## 开源协议\n\n本软件遵循 `GPLv3` 开源协议，以下为该协议内容解读摘要:\n\n* 可自由复制 你可以将软件复制到你的电脑，你客户的电脑，或者任何地方。复制份数没有任何限制\n* 可自由分发 在你的网站提供下载，拷贝到U盘送人，或者将源代码打印出来从窗户扔出去（环保起见，请别这样做）。\n* 可以用来盈利 你可以在分发软件的时候收费，但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议，以便让他们知道，他们可以从别的渠道免费得到这份软件，以及你收费的理由。\n* 可自由修改 如果你想添加或删除某个功能，没问题，如果你想在别的项目中使用部分代码，也没问题，唯一的要求是，使用了这段代码的项目也必须使用 GPL 协议。\n* 如果有人和接收者签了合同性质的东西，并提供责任承诺，则授权人和作者不受此责任连带。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenderwolf006%2Fxbt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fenderwolf006%2Fxbt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenderwolf006%2Fxbt/lists"}