From 3cb4053ab5eb046f1bea883d46aa779e94108865 Mon Sep 17 00:00:00 2001 From: shenlei Date: Wed, 29 Jul 2026 17:12:09 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20=E8=BF=90=E8=A1=8C=E6=97=B6=20config.j?= =?UTF-8?q?son=20=E4=B8=8D=E5=86=8D=E7=BA=B3=E5=85=A5=20git=20=E8=B7=9F?= =?UTF-8?q?=E8=B8=AA=EF=BC=8C=E6=94=B9=E7=94=A8=20config.example.json=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit config.json 是运行时高频写入的数据文件(网页改配置、每次 App_Store 打包递增 构建号都会写盘),纳入版本控制会导致服务器每次 git pull 与本地生产配置冲突。 - git rm --cached backend/data/config.json(保留磁盘文件,仅移出索引) - .gitignore 显式忽略 backend/data/config.json 并补充说明 - 新增 config.example.json 作为结构模板(不含真实密钥/生产数据) - README 说明其为运行时文件、pull 不覆盖,及从模板初始化的方式 首次部署仍可通过根目录 config.json 自动导入为 backend/data/config.json。 Co-Authored-By: Claude Opus 4.8 --- .gitignore | 3 + README.md | 12 +- backend/data/config.json | 457 --------------------------------------- config.example.json | 76 +++++++ 4 files changed, 89 insertions(+), 459 deletions(-) delete mode 100644 backend/data/config.json create mode 100644 config.example.json diff --git a/.gitignore b/.gitignore index f718dd9..c9494ea 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,10 @@ __pycache__/ # 运行时数据 backend/data/*.bak +# 运行时配置:网页 UI 改配置、每次 App_Store 打包都会写盘,不纳入版本控制。 +# 结构参见仓库根目录的 config.example.json;首次部署可 cp 一份作为初始种子。 config.json +backend/data/config.json ReadoorBranches/ build/ diff --git a/README.md b/README.md index 3d65c63..13cf4ce 100644 --- a/README.md +++ b/README.md @@ -170,9 +170,17 @@ GIT_PASSWORD=<仅 read_repository 权限的 Personal Access Token> ### Web 管理配置 -以下配置通过管理后台 Web 界面管理(存储在 `config.json`): +以下配置通过管理后台 Web 界面管理(存储在 `backend/data/config.json`): -首次部署时,如果项目根目录下存在 `config.json`,系统会自动导入其中的 `apps` 和 `schemes` 作为初始配置;导入后即可继续在后台增删改。 +> ⚠️ `config.json` 是**运行时数据文件**(网页改配置、每次 App_Store 打包写入构建号都会改写它),**不纳入版本控制**,`git pull` 不会覆盖它。仓库仅提供结构模板 `config.example.json`。 +> +> 首次部署时,若项目根目录下存在 `config.json`,系统会自动将其复制为 `backend/data/config.json` 作为初始配置。可从模板起步: +> +> ```bash +> cp config.example.json config.json # 按需填入真实的 apps / servers / upload 等,再启动 +> ``` +> +> 导入后即可继续在后台增删改。 | 配置项 | 说明 | |--------|------| diff --git a/backend/data/config.json b/backend/data/config.json deleted file mode 100644 index a5873d5..0000000 --- a/backend/data/config.json +++ /dev/null @@ -1,457 +0,0 @@ -{ - "apps": { - "100": { - "name": "阅门户测试App", - "server": "测试环境", - "AppGuid": "647372741900537856", - "API": "https://api3-dev.readoor.cn", - "AssDom": "applinks:dev-data1.readoor.cn", - "UniversalLink": "https://dev-data1.readoor.cn", - "weixinlogin": "wx30847bd529fe856c", - "weixinpay": "wx30847bd529fe856c", - "tencent": "tencent1105839866", - "certificates": { - "Ad_Hoc": { - "name": "cn.touchv.a4YX061", - "pro": "a4YX061_adHoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "ymh" - } - }, - "upload_key": "0e6b269a", - "skins": [ - "ymh.zip" - ] - }, - "101": { - "name": "申学", - "server": "测试环境", - "AppGuid": "571681541265068032", - "API": "https://api3-dev.readoor.cn", - "AssDom": "applinks:dev-data1.readoor.cn", - "UniversalLink": "https://dev-data1.readoor.cn", - "AlivcLicenseKey": "", - "weixinlogin": "wx30847bd529fe856c", - "weixinpay": "wx30847bd529fe856c", - "tencent": "tencent1105839866", - "certificates": { - "Ad_Hoc": { - "name": "com.kingsunsoft.CollectionBooks.Xinhua", - "pro": "TouchLinked_adHoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "ymh" - } - }, - "upload_key": "c843d672", - "skins": [ - "ymh.zip" - ] - }, - "102": { - "name": "英汉大词典测试", - "server": "测试环境", - "AppGuid": "1593413622", - "API": "https://api3-dev.readoor.cn", - "certificates": { - "Ad_Hoc": { - "name": "com.yiwen.ecdstandalone", - "pro": "TouchLinked_adHoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "weread" - } - }, - "upload_key": "9b470281", - "skins": [ - "weread.zip" - ] - }, - "103": { - "name": "英汉大词典", - "server": "正式环境", - "AppGuid": "1607584582", - "API": "https://api3.readoor.cn", - "certificates": { - "Ad_Hoc": { - "name": "com.yiwen.ecdstandalone", - "pro": "ecdstandalone_Adhoc", - "cer": "iPhone Distribution: Shanghai Translation Publishing House (8S29652W62)", - "theme": "" - }, - "App_Store": { - "name": "com.yiwen.ecdstandalone", - "pro": "ecdstandalone_provisioning_profiles", - "cer": "iPhone Distribution: Shanghai Translation Publishing House (8S29652W62)", - "theme": "" - } - }, - "upload_key": "2e743ca9" - }, - "201": { - "name": "3.1版测试", - "server": "正式环境", - "AppGuid": "447445078487633920", - "API": "https://api3.readoor.cn", - "AssDom": "applinks:data1.readoor.cn", - "UniversalLink": "https://data1.readoor.cn", - "AlivcLicenseKey": "", - "weixinlogin": "", - "weixinpay": "", - "tencent": "", - "certificates": { - "Ad_Hoc1": { - "name": "cn.touchv.a0yny24", - "pro": "a0yny24_adhoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "ymh" - }, - "Ad_Hoc": { - "name": "cn.touchv.a4YX061", - "pro": "a4YX061_adHoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "ymh" - } - }, - "upload_key": "2522c9bb", - "skins": [ - "ymh.zip" - ] - }, - "202": { - "name": "北教辅学", - "server": "正式环境", - "AppGuid": "416182063440367616", - "API": "https://api3.readoor.cn", - "AssDom": "applinks:data1.readoor.cn", - "UniversalLink": "https://data1.readoor.cn", - "AlivcLicenseKey": "", - "weixinlogin": "wx1416817fa79df772", - "weixinpay": "wx1416817fa79df772", - "tencent": "", - "certificates": { - "App_Store": { - "name": "cn.touchv.adsATM4", - "pro": "beijiaofuxue", - "cer": "iPhone Distribution: Jingban Beijing Education Culture Media Corporation Limited (343SD396U6)", - "theme": "bj" - } - }, - "upload_key": "ca03a41b", - "skins": [ - "bj.zip" - ] - }, - "203": { - "name": "智慧云学", - "server": "正式环境", - "AppGuid": "576814720200249344", - "API": "https://api3.readoor.cn", - "AssDom": "applinks:data1.readoor.cn", - "UniversalLink": "https://data1.readoor.cn", - "AlivcLicenseKey": "", - "weixinlogin": "", - "weixinpay": "", - "tencent": "", - "certificates": { - "Ad_Hoc": { - "name": "cn.touchv.a4YX061", - "pro": "a4YX061_adHoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "ymh" - } - }, - "upload_key": "689c69a2", - "skins": [ - "ymh.zip" - ] - }, - "204": { - "name": "北洋学堂", - "server": "正式环境", - "AppGuid": "559336679295455232", - "API": "https://api3.readoor.cn", - "AssDom": "applinks:data1.readoor.cn", - "UniversalLink": "https://data1.readoor.cn", - "AlivcLicenseKey": "", - "weixinlogin": "wx1df85bf317e35171", - "weixinpay": "wx1df85bf317e35171", - "tencent": "", - "certificates": { - "App_Store": { - "name": "cn.tjdxcbs.aBEM0B3", - "pro": "beiyangxuetang", - "cer": "iPhone Distribution: Tianjin University Press Co., Ltd.. (D3NDDP8CZU)", - "theme": "byxt" - } - }, - "upload_key": "27fb0395", - "skins": [ - "byxt.zip" - ] - }, - "205": { - "name": "交我学", - "server": "正式环境", - "AppGuid": "119822865246760960", - "API": "https://api3.readoor.cn", - "AssDom": "applinks:data1.readoor.cn", - "UniversalLink": "https://data1.readoor.cn", - "AlivcLicenseKey": "", - "weixinlogin": "", - "weixinpay": "", - "tencent": "", - "certificates": { - "Ad_Hoc": { - "name": "cn.touchv.a4YX061", - "pro": "a4YX061_adHoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "ymh" - } - }, - "upload_key": "0718cd13", - "skins": [ - "ymh.zip" - ] - }, - "206": { - "name": "上财云津", - "server": "正式环境", - "AppGuid": "389000208056356864", - "API": "https://api3.readoor.cn", - "AssDom": "applinks:data1.readoor.cn", - "UniversalLink": "https://data1.readoor.cn", - "AlivcLicenseKey": "", - "weixinlogin": "wx6f1163efcb202265", - "weixinpay": "wx6f1163efcb202265", - "tencent": "", - "certificates": { - "Ad_Hoc": { - "name": "cn.shcj.aGh0UB2", - "pro": "aGh0UB2_adhoc", - "cer": "iPhone Distribution: Shanghai University of Finance and Economics Press Co., Ltd. (8S29L934WG)", - "theme": "shangcai" - }, - "App_Store": { - "name": "cn.shcj.aGh0UB2", - "pro": "aGh0UB2_dis", - "cer": "iPhone Distribution: Shanghai University of Finance and Economics Press Co., Ltd. (8S29L934WG)", - "theme": "shangcai" - } - }, - "upload_key": "8e326070", - "skins": [ - "shangcai.zip" - ] - }, - "301": { - "name": "教育汇", - "server": "华师大环境", - "AppGuid": "152115765687226368", - "API": "https://api3.ecnupress.com.cn", - "AssDom": "applinks:data1.ecnupress.com.cn", - "UniversalLink": "https://data1.ecnupress.com.cn", - "AlivcLicenseKey": "jPtBO1QJzkkHLu3F896a0569e78de46979050fb2605a6a2a5", - "weixinlogin": "wx9e23021f7f4313c0", - "weixinpay": "wx9e23021f7f4313c0", - "tencent": "tencent1105919518", - "certificates": { - "Ad_Hoc": { - "name": "com.ecnup.aSCLdl2", - "pro": "aSCLdl2_adhoc", - "cer": "iPhone Distribution: East China Normal University Press Ltd (Q659D4XU6T)", - "theme": "hsd" - }, - "App_Store": { - "name": "com.ecnup.aSCLdl2", - "pro": "com-ecnup-aSCLdl2_Distribution", - "cer": "iPhone Distribution: East China Normal University Press Ltd (Q659D4XU6T)", - "theme": "hsd" - } - }, - "upload_key": "f6fe827d", - "skins": [ - "hsd.zip" - ] - }, - "302": { - "name": "教育汇测试", - "server": "华师大环境", - "AppGuid": "335068450529882112", - "API": "https://api3.ecnupress.com.cn", - "AssDom": "applinks:data1.ecnupress.com.cn", - "UniversalLink": "https://data1.ecnupress.com.cn", - "AlivcLicenseKey": "", - "weixinlogin": "wx9e23021f7f4313c0", - "weixinpay": "wx9e23021f7f4313c0", - "tencent": "tencent1105919518", - "certificates": { - "Ad_Hoc": { - "name": "com.ecnup.a4PBPk", - "pro": "a4PBPk_adhoc", - "cer": "iPhone Distribution: East China Normal University Press Ltd (Q659D4XU6T)", - "theme": "hsd" - } - }, - "upload_key": "4f9c7953", - "skins": [ - "hsd.zip" - ] - }, - "303": { - "name": "大夏书系", - "server": "华师大环境", - "AppGuid": "639419713965142016", - "API": "https://api3.ecnupress.com.cn", - "AssDom": "applinks:data1.ecnupress.com.cn", - "UniversalLink": "https://data1.ecnupress.com.cn", - "AlivcLicenseKey": "jPtBO1QJzkkHLu3F896a0569e78de46979050fb2605a6a2a5", - "weixinlogin": "wx1d95492fee2ce298", - "weixinpay": "wx1d95492fee2ce298", - "tencent": "", - "certificates": { - "Ad_Hoc": { - "name": "com.ecnup.aaS16d3", - "pro": "aaS16d3_adhoc", - "cer": "iPhone Distribution: East China Normal University Press Ltd (Q659D4XU6T)", - "theme": "dxsx" - }, - "App_Store": { - "name": "com.ecnup.aaS16d3", - "pro": "aaS16d3_dis", - "cer": "iPhone Distribution: East China Normal University Press Ltd (Q659D4XU6T)", - "theme": "dxsx" - } - }, - "upload_key": "a29091d9", - "skins": [ - "dxsx.zip" - ] - }, - "304": { - "name": "HSD测试App", - "server": "华师大环境", - "AppGuid": "470235916070694912", - "API": "https://api3.ecnupress.com.cn", - "AssDom": "applinks:data1.ecnupress.com.cn", - "UniversalLink": "https://data1.ecnupress.com.cn", - "AlivcLicenseKey": "", - "weixinlogin": "wx9e23021f7f4313c0", - "weixinpay": "wx9e23021f7f4313c0", - "tencent": "tencent1105919518", - "certificates": { - "Ad_Hoc": { - "name": "cn.touchv.aO3pOM", - "pro": "aO3pOM_adhoc", - "cer": "iPhone Distribution: Shanghai TouchLinked Info & Tech Co.,Ltd. (MG4Z7FU83W)", - "theme": "ymh" - } - }, - "upload_key": "86bfb114", - "skins": [ - "ymh.zip" - ] - }, - "401": { - "name": "WE Read", - "server": "外教环境", - "AppGuid": "631907986336071680", - "API": "https://weread-api3.sflep.com/api3", - "AssDom": "applinks:wereadossda.sflep.com", - "UniversalLink": "https://wereadossda.sflep.com", - "AlivcLicenseKey": "", - "weixinlogin": "wx6d6c63f4df7e5720", - "weixinpay": "", - "tencent": "", - "certificates": { - "Ad_Hoc": { - "name": "cn.sflep.aSiLjn", - "pro": "cn_sflep_aSiLjn_adhoc", - "cer": "iPhone Distribution: Shanghai Foreign Language Education Press Co.,Ltd. (G4X56AY2VB)", - "theme": "weread" - }, - "App_Store": { - "name": "cn.sflep.aSiLjn", - "pro": "cn-sflep-aSiLjn", - "cer": "iPhone Distribution: Shanghai Foreign Language Education Press Co.,Ltd. (G4X56AY2VB)", - "theme": "weread" - } - }, - "upload_key": "87e7656f", - "skins": [ - "weread.zip" - ] - } - }, - "schemes": { - "1": { - "name": "readoor31", - "ossFloder": "readoor" - }, - "2": { - "name": "readoor31OtherPay", - "ossFloder": "readoor" - }, - "3": { - "name": "readoorShenXue", - "ossFloder": "readoor" - }, - "4": { - "name": "readoorDict", - "ossFloder": "ecdict" - } - }, - "servers": { - "测试环境": { - "api": "https://api3-dev.readoor.cn", - "assDom": "applinks:dev-data1.readoor.cn", - "universalLink": "https://dev-data1.readoor.cn" - }, - "正式环境": { - "api": "https://api3.readoor.cn", - "assDom": "applinks:data1.readoor.cn", - "universalLink": "https://data1.readoor.cn" - }, - "华师大环境": { - "api": "https://api3.ecnupress.com.cn", - "assDom": "applinks:data1.ecnupress.com.cn", - "universalLink": "https://data1.ecnupress.com.cn" - }, - "外教环境": { - "api": "https://weread-api3.sflep.com/api3", - "assDom": "applinks:wereadossda.sflep.com", - "universalLink": "https://wereadossda.sflep.com" - } - }, - "branches": [ - "master", - "develop", - "feature" - ], - "upload": { - "mode": "webdav", - "oss": { - "access_key_id": "", - "access_key_secret": "", - "endpoint": "oss-cn-beijing.aliyuncs.com", - "bucket_name": "", - "base_url": "" - }, - "webdav": { - "server_url": "http://192.168.21.200:5005", - "username": "slcydia", - "password": "S9rr9359p:4o)nfel?W", - "base_path": "/APPBuildInfo", - "public_url": "http://192.168.21.200:5005/APPBuildInfo" - }, - "dingtalk": { - "enabled": false, - "webhook_url": "", - "secret": "" - } - }, - "versions": { - "app_ver": "2.195.0", - "build_map": { - "2.195.0": 0 - } - } -} \ No newline at end of file diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..5dd80cf --- /dev/null +++ b/config.example.json @@ -0,0 +1,76 @@ +{ + "apps": { + "1": { + "name": "示例应用", + "server": "测试环境", + "API": "https://api3-dev.example.com", + "AppGuid": "00000000-0000-0000-0000-000000000000", + "AssDom": "applinks:dev-data1.example.com", + "UniversalLink": "https://dev-data1.example.com", + "upload_key": "example_app", + "tencent": "", + "weixinlogin": "", + "weixinpay": "", + "skins": ["default.zip"], + "certificates": { + "Ad_Hoc": { + "name": "com.example.app", + "cer": "证书名称或标识", + "pro": "描述文件名称", + "theme": "default" + }, + "App_Store": { + "name": "com.example.app", + "cer": "证书名称或标识", + "pro": "描述文件名称", + "theme": "default" + } + } + } + }, + "schemes": { + "1": { "name": "readoor31", "ossFloder": "readoor" } + }, + "servers": { + "测试环境": { + "api": "https://api3-dev.example.com", + "assDom": "applinks:dev-data1.example.com", + "universalLink": "https://dev-data1.example.com", + "app_id_prefix": 1 + }, + "正式环境": { + "api": "https://api3.example.com", + "assDom": "applinks:data1.example.com", + "universalLink": "https://data1.example.com", + "app_id_prefix": 2 + } + }, + "next_app_id_prefix": 3, + "branches": ["master", "develop"], + "upload": { + "mode": "webdav", + "oss": { + "access_key_id": "", + "access_key_secret": "", + "endpoint": "", + "bucket_name": "", + "base_url": "" + }, + "webdav": { + "server_url": "", + "username": "", + "password": "", + "base_path": "", + "public_url": "" + }, + "dingtalk": { + "enabled": false, + "webhook_url": "", + "secret": "" + } + }, + "versions": { + "app_ver": "2.180.0", + "build_map": {} + } +}