├── .AutoConfig ├── Env.js └── README.MD ├── .github ├── ISSUE_TEMPLATE │ ├── New_Funtion.md │ └── bug_report.md ├── textbook │ └── Panel1.png └── workflows │ ├── Built_JS_Tool_To_Docker.yml │ ├── Sync_JD_Shell_To_Gitee.yml.bak │ ├── Sync_JD_Shell_v3_From_Gitee.yml.bak │ ├── Sync_JD_Shell_v3_To_Gitee.yml.bak │ └── Sync_Js_Tool_A1_From_Gitee.yml ├── AutoFix.sh ├── README.md ├── bot ├── bot.py └── requirements.txt ├── docker ├── docker-bot │ ├── Dockerfile │ └── docker-entrypoint.sh ├── docker-entrypoint.sh └── docker │ ├── Dockerfile │ └── docker-entrypoint.sh ├── jd.sh ├── notify.js ├── panel ├── ecosystem.config.js ├── package.json ├── public │ ├── BeanChange.html │ ├── crontab.html │ ├── css │ │ ├── animate.min.css │ │ ├── codemirror.min.css │ │ ├── css.css │ │ ├── dracula.css │ │ ├── font-awesome.min.css │ │ ├── index_style.css │ │ ├── layui.css │ │ ├── main.css │ │ ├── merge.css │ │ ├── normalize.min.css │ │ ├── other.css │ │ ├── style.css │ │ └── twilight.css │ ├── data │ │ └── README.MD │ ├── diff.html │ ├── diy.html │ ├── helpcode.html │ ├── home.html │ ├── img │ │ ├── banner.jpg │ │ └── sky.jpg │ ├── index1.html │ ├── js │ │ ├── codemirror.min.js │ │ ├── comment.js │ │ ├── diff_match_patch.js │ │ ├── javascript.js │ │ ├── jquery.base64.js │ │ ├── jquery.csv.js │ │ ├── jquery.min.js │ │ ├── jschardet.js │ │ ├── merge.js │ │ ├── papaparse.js │ │ ├── prefixfree.min.js │ │ ├── qrcode.min.js │ │ ├── shell.js │ │ ├── skel.min.js │ │ ├── sublime.js │ │ └── sweetalert2.js │ ├── login.html │ ├── pwd.html │ ├── robots.txt │ ├── run.html │ ├── tasklog.html │ ├── terminal.html │ ├── usrconfig.html │ └── viewScripts.html └── server.js ├── repair.sh ├── resource ├── encrypto │ ├── JD_PIN copy.key │ ├── JD_PIN.key │ └── JD_PIN_HASH.key ├── install_scripts │ ├── Qunhui_docker_install_jd.sh │ ├── docker_install_jd.sh │ └── linux_install_jd.sh └── webshellbinary │ ├── ttyd.aarch64 │ ├── ttyd.arm │ ├── ttyd.armhf │ ├── ttyd.i686 │ ├── ttyd.mips │ ├── ttyd.mips64 │ ├── ttyd.mips64el │ ├── ttyd.mipsel │ └── ttyd.x86_64 └── sample ├── Env.js ├── auth.json.sample ├── bot.json.sample ├── config.sh.sample ├── cookie.sh.sample ├── crontab.list.sample └── sharecode.sh.sample /.AutoConfig/README.MD: -------------------------------------------------------------------------------- 1 | ## 此文件夹的内容自动生成,由于软件读取和存储数据 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/New_Funtion.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 功能需求 3 | about: 想要增加什么样的功能? 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | 10 | ### 想要增加什么样的功能或者哪里存在不足之处呢? 11 | 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: BUG 反馈 3 | about: 出现bug 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | ## 1.关于你要提交的问题 27 | 28 | Q:是否搜索了issue(包括已关闭的issue) 29 | - [ ] 没有类似的issue 30 | 31 | Q:是否阅读了常见问题 32 | - [ ] 已阅读常见问题,未找到相关说明 33 | 34 | Q:是否仔细阅读了教程 35 | 36 | - [ ] 已仔细阅读教程 37 | 38 | 39 | ## 2. 使用什么平台? 40 | 41 | - [ ] Linux 42 | - [ ] Docker 43 | 44 | ## 3. 是否用一键脚本部署的? 45 | 46 | - [ ] Yes 47 | - [ ] No 48 | 49 | ## 4. 有没有试过用修复脚本来修复过? 50 | 51 | - [ ] Yes 52 | - [ ] No 53 | 54 | 55 | ## 5. 详细叙述 56 | ### (1) 具体问题 57 | A: 58 | 59 | 60 | ### (2) 详细日志 61 | A: 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /.github/textbook/Panel1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/.github/textbook/Panel1.png -------------------------------------------------------------------------------- /.github/workflows/Built_JS_Tool_To_Docker.yml: -------------------------------------------------------------------------------- 1 | name: Built_JS_Tool_To_Docker 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '30 */4 * * *' 6 | 7 | jobs: 8 | docker: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 15 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v2 14 | 15 | - name: Set up QEMU 16 | uses: docker/setup-qemu-action@v1 17 | 18 | - name: Set up Docker Buildx 19 | uses: docker/setup-buildx-action@v1 20 | 21 | - name: Login to DockerHub 22 | uses: docker/login-action@v1 23 | with: 24 | username: ${{ secrets.DockerHub_ID }} 25 | password: ${{ secrets.DockerHub_PASSWORD }} 26 | 27 | - name: Build & Push 28 | uses: docker/build-push-action@v2 29 | with: 30 | context: ./docker/docker/ 31 | platforms: linux/amd64,linux/arm64/v8,linux/arm/v7,linux/arm/v6,linux/ppc64le 32 | push: true 33 | tags: lantianxiang1/js_tool:A1 34 | - name: Delete Workflow Runs 35 | uses: Mattraks/delete-workflow-runs@main 36 | with: 37 | token: ${{ github.token }} 38 | repository: ${{ github.repository }} 39 | retain_days: 1 40 | keep_minimum_runs: 0 41 | -------------------------------------------------------------------------------- /.github/workflows/Sync_JD_Shell_To_Gitee.yml.bak: -------------------------------------------------------------------------------- 1 | name: Sync_JD_Shell_To_Gitee 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '1,6,11,16,21,26,31,36,41,46,51,55 * * * *' 6 | jobs: 7 | sync: 8 | runs-on: ubuntu-latest 9 | timeout-minutes: 3 10 | steps: 11 | - name: Sync to Gitee 12 | uses: wearerequired/git-mirror-action@master 13 | env: 14 | # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY 15 | SSH_PRIVATE_KEY: ${{ secrets.RSA_PRIVATE_KEY }} 16 | with: 17 | # 注意替换为你的 GitHub 源仓库地址 18 | source-repo: git@github.com:lan-tianxiang/js_tool.git 19 | # 注意替换为你的 Gitee 目标仓库地址 20 | destination-repo: git@gitee.com:highdimen/js_tool.git 21 | 22 | - name: Delete Workflow Runs 23 | uses: Mattraks/delete-workflow-runs@main 24 | with: 25 | token: ${{ github.token }} 26 | repository: ${{ github.repository }} 27 | retain_days: 1 28 | keep_minimum_runs: 0 29 | 30 | -------------------------------------------------------------------------------- /.github/workflows/Sync_JD_Shell_v3_From_Gitee.yml.bak: -------------------------------------------------------------------------------- 1 | name: Sync_JD_Shell_v3_From_Gitee 2 | on: 3 | push: 4 | branches: 5 | - v3 6 | workflow_dispatch: 7 | schedule: 8 | - cron: '*/8 * * * *' 9 | jobs: 10 | sync: 11 | runs-on: ubuntu-18.04 12 | if: github.repository == 'lan-tianxiang/js_tool' 13 | timeout-minutes: 3 14 | steps: 15 | - name: Init Build Dependencies 16 | env: 17 | DEBIAN_FRONTEND: noninteractive 18 | run: | 19 | sudo -E rm -rf /etc/apt/sources.list.d 20 | sudo -E apt-get update -y 21 | sudo -E apt-get install -y build-essential git git-core curl wget 22 | sudo -E apt-get clean -y 23 | git config --global user.name 'lan-tianxiang' && git config --global user.email 'highdimen@github.com' 24 | - name: Prepare Key 25 | run: | 26 | mkdir -p ~/.ssh 27 | echo -e "${{ secrets.RSA_PRIVATE_KEY }}" > ~/.ssh/id_rsa 28 | chmod 600 ~/.ssh/id_rsa 29 | ssh-keyscan gitee.com > ~/.ssh/known_hosts 30 | - name: Clone Master 31 | run: | 32 | git clone -b v3 git@gitee.com:highdimen/js_tool.git v3 33 | - name: Push Master 34 | uses: ad-m/github-push-action@master 35 | with: 36 | directory: v3 37 | github_token: ${{ secrets.HUB_TOKEN }} 38 | branch: v3 39 | force : true 40 | - name: Delete Workflow Runs 41 | uses: Mattraks/delete-workflow-runs@main 42 | with: 43 | token: ${{ github.token }} 44 | repository: ${{ github.repository }} 45 | retain_days: 1 46 | keep_minimum_runs: 0 47 | -------------------------------------------------------------------------------- /.github/workflows/Sync_JD_Shell_v3_To_Gitee.yml.bak: -------------------------------------------------------------------------------- 1 | name: Sync_JD_Shell_v3_To_Gitee 2 | on: 3 | push: 4 | branches: 5 | - v3 6 | workflow_dispatch: 7 | jobs: 8 | sync: 9 | runs-on: ubuntu-18.04 10 | if: github.repository == 'lan-tianxiang/js_tool' 11 | timeout-minutes: 3 12 | steps: 13 | - name: Init Build Dependencies 14 | env: 15 | DEBIAN_FRONTEND: noninteractive 16 | run: | 17 | sudo -E rm -rf /etc/apt/sources.list.d 18 | sudo -E apt-get update -y 19 | sudo -E apt-get install -y build-essential git git-core curl wget 20 | sudo -E apt-get clean -y 21 | git config --global user.name 'lan-tianxiang' && git config --global user.email 'highdimen@gitee.com' 22 | - name: Prepare Key 23 | run: | 24 | mkdir -p ~/.ssh 25 | echo -e "${{ secrets.RSA_PRIVATE_KEY }}" > ~/.ssh/id_rsa 26 | chmod 600 ~/.ssh/id_rsa 27 | ssh-keyscan github.com > ~/.ssh/known_hosts 28 | - name: Clone Master 29 | run: | 30 | git clone -b v3 git@github.com:lan-tianxiang/js_tool.git v3 31 | - name: Prepare Key 32 | run: | 33 | mkdir -p ~/.ssh 34 | echo -e "${{ secrets.RSA_PRIVATE_KEY }}" > ~/.ssh/id_rsa 35 | chmod 600 ~/.ssh/id_rsa 36 | ssh-keyscan gitee.com > ~/.ssh/known_hosts 37 | - name: push Master 38 | run: | 39 | cd v3 40 | perl -i -pe "s|url \= git\@github.com:lan-tianxiang\/jd_shell.git|url \= git\@gitee.com:highdimen\/jd_shell.git|g" .git/config 41 | cat .git/config 42 | echo "## UpdateTime: "$(date) >> jd.sh 43 | git add . 44 | git commit -m "update" 45 | git push -f 46 | - name: Delete Workflow Runs 47 | uses: Mattraks/delete-workflow-runs@main 48 | with: 49 | token: ${{ github.token }} 50 | repository: ${{ github.repository }} 51 | retain_days: 1 52 | keep_minimum_runs: 0 53 | -------------------------------------------------------------------------------- /.github/workflows/Sync_Js_Tool_A1_From_Gitee.yml: -------------------------------------------------------------------------------- 1 | name: Sync_Js_Tool_From_Gitee 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '*/10 * * * *' 6 | jobs: 7 | sync: 8 | runs-on: ubuntu-18.04 9 | timeout-minutes: 5 10 | steps: 11 | - name: Init Build Dependencies 12 | env: 13 | DEBIAN_FRONTEND: noninteractive 14 | run: | 15 | sudo -E rm -rf /etc/apt/sources.list.d 16 | sudo -E apt-get update -y 17 | sudo -E apt-get install -y build-essential git git-core curl wget 18 | sudo -E apt-get clean -y 19 | git config --global user.name 'lan-tianxiang' && git config --global user.email 'highdimen@github.com' 20 | - name: Prepare Key 21 | run: | 22 | mkdir -p ~/.ssh 23 | echo -e "${{ secrets.RSA_PRIVATE_KEY }}" > ~/.ssh/id_rsa 24 | chmod 600 ~/.ssh/id_rsa 25 | ssh-keyscan gitee.com > ~/.ssh/known_hosts 26 | - name: Clone A1 From js_tool 27 | run: | 28 | git clone -b A1 git@gitee.com:highdimen/js_tool.git A1 29 | - name: Push A1 30 | uses: ad-m/github-push-action@master 31 | with: 32 | directory: A1 33 | github_token: ${{ secrets.HUB_TOKEN }} 34 | branch: A1 35 | force : true 36 | - name: Delete Workflow Runs 37 | uses: Mattraks/delete-workflow-runs@main 38 | with: 39 | token: ${{ github.token }} 40 | repository: ${{ github.repository }} 41 | retain_days: 1 42 | keep_minimum_runs: 0 43 | -------------------------------------------------------------------------------- /AutoFix.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | dir_shell=$(dirname $(readlink -f "$0")) 4 | dir_root=$dir_shell 5 | 6 | cd $dir_root 7 | git fetch --all 8 | git reset --hard origin/A1 9 | echo "自动修复完毕,无异常" 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | ### 旧版暂停更新,忙不过来 答疑交流QQ群967451175 6 | A1版(新版) https://github.com/lan-tianxiang/js_tool 7 | 8 | 9 |

10 | GitHub Readme Stats 11 |

JS SHELL

12 |

自动化一键完成JS库管理

13 |

14 |

15 | GitHub 16 | Issues 17 | GitHub 18 |
19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |

27 | 28 |

29 | 查看 Demo 30 | · 31 | 报告 Bug 32 | · 33 | 请求增加功能 34 |

35 |

36 |

喜欢这个项目?请考虑捐赠❤来帮助它完善! 37 |
38 |

当然,觉得默默关注也是鼓励的话,也可以在右上角给颗⭐!你的支持是我最大的动力😎!

39 |

40 |
41 |
42 |
43 |
44 |
45 |

46 | 47 | ## 必要声明: 48 | * 本仓库发布的SHELL项目,是用于对第三方js库进行自动更新,管理和运行的一体化软件. 49 | * 本项目内所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。 50 | * 本仓库发布的SHELL项目中涉及的任何脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断. 51 | * 所有使用者在使用SHELL项目的任何部分时,需先遵守法律法规。对于一切使用不当所造成的后果,需自行承担.对任何脚本问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害. 52 | * 间接使用SHELL项目的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 本人对于由此引起的任何隐私泄漏或其他后果概不负责. 53 | * 如果任何单位或个人认为该项目可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关文件. 54 | * 任何以任何方式查看此项目的人或直接或间接使用该SHELL项目的任何脚本的使用者都应仔细阅读此声明。本人保留随时更改或补充此免责声明的权利。一旦使用并复制了任何相关脚本或SHELL项目的规则,则视为您已接受此免责声明. 55 | 56 | **您必须在下载后的24小时内从计算机或手机中完全删除以上内容.**
57 | > ***您使用或者复制了本仓库且本人制作的任何脚本,则视为`已接受`此声明,请仔细阅读*** 58 | 59 | ##### ☣请各位不要传播!!☣ 60 | 61 | ### 通知 62 | - __2021/4/12 24:00 `ALL重要通知`__ 63 | 新版本A1发布,修复所有重大问题,Docker无异常,定时正常。 64 | 65 | 66 | - __2021/3/30 9:00 `长期`__ 67 | ㅤ有好用的第三方脚本欢迎提交到https://github.com/lan-tianxiang/jd_scripts 68 | 69 | ## 开发行程 70 | 71 | - __2021/4/5 12:00 `完成多账户并发运行任务功能(完成)`__ 72 | - __2021/4/10 12:00 `对结构优化,减少执行文件(完成)`__ 73 | - __2021/4/15 12:00 `不知道要更什么功能,你们来提!!!`__ 74 | - __2021/4/14 12:00 `提前运行功能`__ 75 | 76 | ## 适用于以下系统 77 | 78 | ### 如何部署? 79 | 80 | ## `Linux` 81 | 82 | - [Debian/Ubuntu/Armbian/OpenMediaVault等Debian系](https://github.com/lan-tianxiang/js_tool/wiki/Linux) 🔻 83 | 84 | - [CentOS/RedHat/Fedora等红帽系](https://github.com/lan-tianxiang/js_tool/wiki/Linux) 🔻 85 | 86 | - [Android等使用Termux模拟Linux的系统](https://github.com/lan-tianxiang/js_tool/wiki/Android) 🔻 87 | 88 | - [OpenWRT、MacOs等类UNIX系统](https://github.com/lan-tianxiang/js_tool/wiki/Unix) 🔻 89 | 90 | ## `Docker` Docker Built 91 | 92 | - [Docker](https://github.com/lan-tianxiang/js_tool/wiki/Docker) 🔻 93 | 94 | ## `Windows10` 95 | 96 | - [Win10安装 WSL Ubuntu](https://github.com/lan-tianxiang/js_tool/wiki/Win10) 🔻 97 | 98 | 99 | *** 100 | 101 | ### [WIKI](https://github.com/lan-tianxiang/js_tool/wiki/Instruction) 和各文件注释都含有大量教程,请自行翻阅❗❗ 102 | 103 |
104 | 105 | 106 | ##### 小彩蛋 107 | 108 | ##### 默认隐藏,欢迎加入交流 109 | 114 |
115 | 116 | 117 | ## 更新日志 118 |
119 | 120 | 121 | > 只记录大的更新,小修小改不记录。 122 | 123 | 2021-04-12, 新版本A1发布,修复所有重大问题,Docker无异常,定时正常。 124 | 125 | 2021-03-30, 修复Docker遗留的隐藏BUG,保持docker和linux修复脚本的一致 126 | 127 | 2021-03-29, 增加超时关闭,以防因网络等未知原因卡住而不断消耗系统资源(默认关闭) 128 | 129 | 2021-03-28, 自动配置并填写助力码,在config最后的专区内,无需人工干预(默认关闭) 130 | 131 | 2021-02-19,面板功能集成至jd.sh内,运行jd.sh会出现操作提示 132 | 133 | 2021-01-23,控制面板增加日志查看功能,Docker重启容器后可以使用`docker restart jd`,非Docker如果是pm2方式的请重启pm2进程`pm2 resatrt server.js`。 134 | 135 | 2020-01-21,增加shylocks/Loon脚本。 136 | 137 | 2021-01-15,如果本机上安装了pm2,则挂机程序以pm2启动,否则以nohup启动。 138 |
139 | -------------------------------------------------------------------------------- /bot/requirements.txt: -------------------------------------------------------------------------------- 1 | qrcode==6.1 2 | Telethon==1.21.1 3 | requests==2.25.1 4 | Pillow==8.1.2 5 | python-socks==1.2.4 6 | async_timeout==3.0.1 7 | -------------------------------------------------------------------------------- /docker/docker-bot/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | ARG REPO=gitee 3 | ARG REPO_URL=$REPO.com 4 | ARG JD_SHELL=jd_shell 5 | ARG JD_SHELL_BRANCH=master 6 | ARG JD_SHELL_HOST=jd_shell_$REPO 7 | ARG JD_SCRIPTS=jd_scripts 8 | ARG JD_SCRIPTS_BRANCH=master 9 | ARG JD_SCRIPTS_HOST=jd_scripts_$REPO 10 | ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ 11 | LANG=zh_CN.UTF-8 \ 12 | SHELL=/bin/bash \ 13 | PS1='\u@\h:\w $ ' \ 14 | JD_DIR=/jd \ 15 | ENABLE_TG_BOT=false \ 16 | ENABLE_HANGUP=false \ 17 | ENABLE_RESET_REPO_URL=true \ 18 | JD_SHELL_URL=git@$JD_SHELL_HOST:highdimen/$JD_SHELL.git \ 19 | JD_SCRIPTS_URL=git@$JD_SCRIPTS_HOST:highdimen/$JD_SCRIPTS.git 20 | WORKDIR $JD_DIR 21 | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ 22 | && apk update -f \ 23 | && apk upgrade \ 24 | && apk --no-cache add -f bash \ 25 | coreutils \ 26 | git \ 27 | wget \ 28 | curl \ 29 | nano \ 30 | tzdata \ 31 | perl \ 32 | openssh-client \ 33 | python3 \ 34 | zlib-dev \ 35 | gcc \ 36 | jpeg-dev \ 37 | python3-dev \ 38 | musl-dev \ 39 | && rm -rf /var/cache/apk/* \ 40 | && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ 41 | && echo "Asia/Shanghai" > /etc/timezone \ 42 | && mkdir -p /root/.ssh \ 43 | && echo -e $JD_SHELL_KEY > /root/.ssh/$JD_SHELL \ 44 | && echo -e $JD_SCRIPTS_KEY > /root/.ssh/$JD_SCRIPTS \ 45 | && chmod 600 /root/.ssh/$JD_SHELL /root/.ssh/$JD_SCRIPTS \ 46 | && echo -e "Host $JD_SHELL_HOST\n\tHostname $REPO_URL\n\tIdentityFile=/root/.ssh/$JD_SHELL\n\nHost $JD_SCRIPTS_HOST\n\tHostname $REPO_URL\n\tIdentityFile=/root/.ssh/$JD_SCRIPTS" > /root/.ssh/config \ 47 | && echo -e "\n\nHost *\n StrictHostKeyChecking no\n" >> /etc/ssh/ssh_config \ 48 | && chmod 644 /root/.ssh/config \ 49 | && ssh-keyscan $REPO_URL > /root/.ssh/known_hosts \ 50 | && git clone -b $JD_SHELL_BRANCH $JD_SHELL_URL $JD_DIR \ 51 | && git clone -b $JD_SCRIPTS_BRANCH $JD_SCRIPTS_URL $JD_DIR/scripts \ 52 | && cd $JD_DIR/scripts \ 53 | && npm install \ 54 | && npm install -g pm2 \ 55 | && ln -sf $JD_DIR/jd.sh /usr/local/bin/jd \ 56 | && cp -f $JD_DIR/docker/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh \ 57 | && chmod 777 /usr/local/bin/docker-entrypoint.sh \ 58 | && chmod 777 $JD_DIR/*.sh \ 59 | && rm -rf /root/.npm \ 60 | && ln -sf /usr/bin/python3 /usr/bin/python \ 61 | && cd $JD_DIR/bot \ 62 | && pip3 install -r requirements.txt 63 | ENTRYPOINT bash $JD_DIR/docker/docker-bot/docker-entrypoint.sh -------------------------------------------------------------------------------- /docker/docker-bot/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | echo -e "\n======================== 1. 检测文件夹 ========================\n" 5 | if [ ! -d $JD_DIR/config ]; then 6 | echo -e "没有映射config配置目录给本容器,在容器内创建该文件夹\n" 7 | mkdir -p /jd/config 8 | fi 9 | if [ ! -d $JD_DIR/log ]; then 10 | echo -e "没有映射log日志目录给本容器,在容器内创建该文件夹\n" 11 | mkdir -p /jd/log 12 | fi 13 | if [ ! -d $JD_DIR/thirdpard ]; then 14 | echo -e "没有映射thirdpard脚本目录给本容器,在容器内创建该文件夹\n" 15 | mkdir -p /jd/thirdpard 16 | fi 17 | 18 | echo -e "\n======================== 2. 更新源代码 ========================\n" 19 | jd update 20 | echo 21 | 22 | echo -e "======================== 3. 检测配置文件 ========================\n" 23 | 24 | crontab $JD_DIR/config/crontab.list 25 | echo -e "成功添加定时任务...\n" 26 | 27 | echo -e "======================== 4. 启动挂机程序 ========================\n" 28 | rm -rf /root/.pm2/logs/* >/dev/null 2>&1 29 | 30 | if [[ $ENABLE_HANGUP == true ]]; then 31 | if [ -f $JD_DIR/config/cookie.sh ]; then 32 | . $JD_DIR/config/cookie.sh 33 | fi 34 | . $JD_DIR/config/config.sh 35 | if [[ $Cookie1 ]]; then 36 | jd hangup 2>/dev/null 37 | echo -e "挂机程序启动成功...\n" 38 | else 39 | echo -e "config.sh中还未填入有效的Cookie,可能是首次部署容器,因此不启动挂机程序...\n" 40 | fi 41 | elif [[ ${ENABLE_HANGUP} == false ]]; then 42 | echo -e "已设置为不自动启动挂机程序,跳过...\n" 43 | fi 44 | 45 | if type python3 &>/dev/null; then 46 | echo -e "======================== 5. 启动Telegram Bot ========================\n" 47 | if [[ $ENABLE_TG_BOT == true ]]; then 48 | cp -f $JD_DIR/bot/bot.py $JD_DIR/config/bot.py 49 | if [[ -z $(grep -E "你的USERID" $JD_DIR/config/bot.json) ]]; then 50 | cd $JD_DIR/config 51 | pm2 start bot.py --watch "$JD_DIR/config/bot.py" --watch-delay 10 --name=bot 52 | else 53 | echo -e "似乎 $JD_DIR/config/bot.json 还未修改为你自己的信息,可能是首次部署容器,因此不启动Telegram Bot...\n" 54 | fi 55 | else 56 | echo -e "已设置为不自动启动Telegram Bot,跳过...\n" 57 | fi 58 | fi 59 | 60 | echo -e "容器启动成功...\n" 61 | 62 | crond -f 63 | 64 | exec "$@" 65 | -------------------------------------------------------------------------------- /docker/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | crond 5 | 6 | echo -e "\n======================== 2. 更新源代码 ========================\n" 7 | jd update 8 | echo 9 | 10 | crontab /root/jd/config/crontab.list 11 | 12 | jd panelon 13 | jd panelon 14 | 15 | echo -e "容器启动成功...\n" 16 | 17 | if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ]; then 18 | set -- node "$@" 19 | fi 20 | 21 | exec "$@" 22 | -------------------------------------------------------------------------------- /docker/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | LABEL maintainer="Highdimen" 3 | ARG REPO=gitee 4 | ARG REPO_URL=$REPO.com 5 | ARG JS_TOOL_URL=https://gitee.com/highdimen/js_tool.git 6 | ARG JS_TOOL_BRANCH=A1 7 | ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ 8 | LANG=zh_CN.UTF-8 \ 9 | SHELL=/bin/bash \ 10 | PS1='\u@\h:\w $ ' \ 11 | JD_DIR=/root/jd \ 12 | ENABLE_TG_BOT=false \ 13 | ENABLE_WEB_PANEL=true 14 | WORKDIR $JD_DIR 15 | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ 16 | && apk update -f \ 17 | && apk upgrade \ 18 | && apk add --no-cache bash coreutils moreutils nano git wget curl tzdata perl openssh-client python3 jq \ 19 | && rm -rf /var/cache/apk/* \ 20 | && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ 21 | && echo "Asia/Shanghai" > /etc/timezone \ 22 | && mkdir -p /root/.ssh \ 23 | && ssh-keyscan $REPO_URL > /root/.ssh/known_hosts \ 24 | && git clone -b $JS_TOOL_BRANCH $JS_TOOL_URL $JD_DIR \ 25 | && git config --global user.email "lan-tianxiang@@users.noreply.github.com" \ 26 | && git config --global user.name "lan-tianxiang" \ 27 | && git config --global pull.rebase true \ 28 | && chmod -R 777 ${JD_DIR}/ \ 29 | && cd ${JD_DIR}/ \ 30 | && npm install -g pnpm \ 31 | && pnpm config set registry http://registry.npm.taobao.org \ 32 | && pnpm install -g pm2 \ 33 | && pnpm install -g ts-node typescript tslib \ 34 | && ln -sf $JD_DIR/jd.sh /usr/local/bin/jd \ 35 | && jd update \ 36 | && jd update \ 37 | && jd panelon \ 38 | && rm -rf /root/.npm 39 | ENTRYPOINT bash $JD_DIR/docker/docker/docker-entrypoint.sh 40 | -------------------------------------------------------------------------------- /docker/docker/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | echo -e "\n======================== 2. 更新源代码 ========================\n" 5 | jd update 6 | echo 7 | 8 | crontab /root/jd/config/crontab.list 9 | 10 | jd panelon 11 | 12 | echo -e "容器启动成功...\n" 13 | 14 | crond -f 15 | 16 | exec "$@" 17 | -------------------------------------------------------------------------------- /notify.js: -------------------------------------------------------------------------------- 1 | const notify = require('./scripts/sendNotify'); 2 | const title = process.argv[2]; 3 | const content = process.argv[3]; 4 | 5 | notify.sendNotify(`${title}`, `${content}`); -------------------------------------------------------------------------------- /panel/ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [ 3 | { 4 | name: 'server', 5 | script: './server.js', 6 | watch: ['server.js'], 7 | // Delay between restart 8 | watch_delay: 2000, 9 | ignore_watch: ['node_modules', 'public'], 10 | watch_options: { 11 | followSymlinks: false, 12 | }, 13 | }, 14 | ], 15 | }; 16 | -------------------------------------------------------------------------------- /panel/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "panel", 3 | "version": "1.0.0", 4 | "description": "web panel", 5 | "main": "server.js", 6 | "dependencies": { 7 | "body-parser": "^1.19.0", 8 | "compression": "^1.7.4", 9 | "express": "^4.17.1", 10 | "express-session": "^1.17.1", 11 | "got": "^11.8.1", 12 | "http-proxy-middleware": "^1.0.6" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /panel/public/crontab.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 定时设定 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 |
28 | 44 |
45 |

在线编辑工具

46 | 48 |
49 |

定时任务清单

50 |
51 | 52 |
53 |
54 |
55 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /panel/public/css/codemirror.min.css: -------------------------------------------------------------------------------- 1 | .CodeMirror { 2 | font-family: monospace; 3 | height: 300px; 4 | color: black 5 | } 6 | 7 | .CodeMirror-lines { 8 | padding: 4px 0 9 | } 10 | 11 | .CodeMirror pre { 12 | padding: 0 4px 13 | } 14 | 15 | .CodeMirror-scrollbar-filler, 16 | .CodeMirror-gutter-filler { 17 | background-color: white 18 | } 19 | 20 | .CodeMirror-gutters { 21 | border-right: 1px solid #ddd; 22 | background-color: #f7f7f7; 23 | white-space: nowrap 24 | } 25 | 26 | .CodeMirror-linenumber { 27 | padding: 0 3px 0 5px; 28 | min-width: 20px; 29 | text-align: right; 30 | color: #999; 31 | white-space: nowrap 32 | } 33 | 34 | .CodeMirror-guttermarker { 35 | color: black 36 | } 37 | 38 | .CodeMirror-guttermarker-subtle { 39 | color: #999 40 | } 41 | 42 | .CodeMirror-cursor { 43 | border-left: 1px solid black; 44 | border-right: 0; 45 | width: 0 46 | } 47 | 48 | .CodeMirror div.CodeMirror-secondarycursor { 49 | border-left: 1px solid silver 50 | } 51 | 52 | .cm-fat-cursor .CodeMirror-cursor { 53 | width: auto; 54 | border: 0; 55 | background: #7e7 56 | } 57 | 58 | .cm-fat-cursor div.CodeMirror-cursors { 59 | z-index: 1 60 | } 61 | 62 | .cm-animate-fat-cursor { 63 | width: auto; 64 | border: 0; 65 | -webkit-animation: blink 1.06s steps(1) infinite; 66 | -moz-animation: blink 1.06s steps(1) infinite; 67 | animation: blink 1.06s steps(1) infinite; 68 | background-color: #7e7 69 | } 70 | 71 | @-moz-keyframes blink { 72 | 50% { 73 | background-color: transparent 74 | } 75 | } 76 | 77 | @-webkit-keyframes blink { 78 | 50% { 79 | background-color: transparent 80 | } 81 | } 82 | 83 | @keyframes blink { 84 | 50% { 85 | background-color: transparent 86 | } 87 | } 88 | 89 | .cm-tab { 90 | display: inline-block; 91 | text-decoration: inherit 92 | } 93 | 94 | .CodeMirror-ruler { 95 | border-left: 1px solid #ccc; 96 | position: absolute 97 | } 98 | 99 | .cm-s-default .cm-header { 100 | color: blue 101 | } 102 | 103 | .cm-s-default .cm-quote { 104 | color: #090 105 | } 106 | 107 | .cm-negative { 108 | color: #d44 109 | } 110 | 111 | .cm-positive { 112 | color: #292 113 | } 114 | 115 | .cm-header, 116 | .cm-strong { 117 | font-weight: bold 118 | } 119 | 120 | .cm-em { 121 | font-style: italic 122 | } 123 | 124 | .cm-link { 125 | text-decoration: underline 126 | } 127 | 128 | .cm-strikethrough { 129 | text-decoration: line-through 130 | } 131 | 132 | .cm-s-default .cm-keyword { 133 | color: #708 134 | } 135 | 136 | .cm-s-default .cm-atom { 137 | color: #219 138 | } 139 | 140 | .cm-s-default .cm-number { 141 | color: #164 142 | } 143 | 144 | .cm-s-default .cm-def { 145 | color: #00f 146 | } 147 | 148 | .cm-s-default .cm-variable-2 { 149 | color: #05a 150 | } 151 | 152 | .cm-s-default .cm-variable-3 { 153 | color: #085 154 | } 155 | 156 | .cm-s-default .cm-comment { 157 | color: #a50 158 | } 159 | 160 | .cm-s-default .cm-string { 161 | color: #a11 162 | } 163 | 164 | .cm-s-default .cm-string-2 { 165 | color: #f50 166 | } 167 | 168 | .cm-s-default .cm-meta { 169 | color: #555 170 | } 171 | 172 | .cm-s-default .cm-qualifier { 173 | color: #555 174 | } 175 | 176 | .cm-s-default .cm-builtin { 177 | color: #30a 178 | } 179 | 180 | .cm-s-default .cm-bracket { 181 | color: #997 182 | } 183 | 184 | .cm-s-default .cm-tag { 185 | color: #170 186 | } 187 | 188 | .cm-s-default .cm-attribute { 189 | color: #00c 190 | } 191 | 192 | .cm-s-default .cm-hr { 193 | color: #999 194 | } 195 | 196 | .cm-s-default .cm-link { 197 | color: #00c 198 | } 199 | 200 | .cm-s-default .cm-error { 201 | color: red 202 | } 203 | 204 | .cm-invalidchar { 205 | color: red 206 | } 207 | 208 | .CodeMirror-composing { 209 | border-bottom: 2px solid 210 | } 211 | 212 | div.CodeMirror span.CodeMirror-matchingbracket { 213 | color: #0f0 214 | } 215 | 216 | div.CodeMirror span.CodeMirror-nonmatchingbracket { 217 | color: #f22 218 | } 219 | 220 | .CodeMirror-matchingtag { 221 | background: rgba(255, 150, 0, .3) 222 | } 223 | 224 | .CodeMirror-activeline-background { 225 | background: #e8f2ff 226 | } 227 | 228 | .CodeMirror { 229 | position: relative; 230 | overflow: hidden; 231 | background: white 232 | } 233 | 234 | .CodeMirror-scroll { 235 | overflow: scroll !important; 236 | margin-bottom: -30px; 237 | margin-right: -30px; 238 | padding-bottom: 30px; 239 | height: 100%; 240 | outline: 0; 241 | position: relative 242 | } 243 | 244 | .CodeMirror-sizer { 245 | position: relative; 246 | border-right: 30px solid transparent 247 | } 248 | 249 | .CodeMirror-vscrollbar, 250 | .CodeMirror-hscrollbar, 251 | .CodeMirror-scrollbar-filler, 252 | .CodeMirror-gutter-filler { 253 | position: absolute; 254 | z-index: 6; 255 | display: none 256 | } 257 | 258 | .CodeMirror-vscrollbar { 259 | right: 0; 260 | top: 0; 261 | overflow-x: hidden; 262 | overflow-y: scroll 263 | } 264 | 265 | .CodeMirror-hscrollbar { 266 | bottom: 0; 267 | left: 0; 268 | overflow-y: hidden; 269 | overflow-x: scroll 270 | } 271 | 272 | .CodeMirror-scrollbar-filler { 273 | right: 0; 274 | bottom: 0 275 | } 276 | 277 | .CodeMirror-gutter-filler { 278 | left: 0; 279 | bottom: 0 280 | } 281 | 282 | .CodeMirror-gutters { 283 | position: absolute; 284 | left: 0; 285 | top: 0; 286 | z-index: 3 287 | } 288 | 289 | .CodeMirror-gutter { 290 | white-space: normal; 291 | height: 100%; 292 | display: inline-block; 293 | margin-bottom: -30px; 294 | *zoom: 1; 295 | *display: inline 296 | } 297 | 298 | .CodeMirror-gutter-wrapper { 299 | position: absolute; 300 | z-index: 4; 301 | background: none !important; 302 | border: none !important 303 | } 304 | 305 | .CodeMirror-gutter-background { 306 | position: absolute; 307 | top: 0; 308 | bottom: 0; 309 | z-index: 4 310 | } 311 | 312 | .CodeMirror-gutter-elt { 313 | position: absolute; 314 | cursor: default; 315 | z-index: 4 316 | } 317 | 318 | .CodeMirror-gutter-wrapper { 319 | -webkit-user-select: none; 320 | -moz-user-select: none; 321 | user-select: none 322 | } 323 | 324 | .CodeMirror-lines { 325 | cursor: text; 326 | min-height: 1px 327 | } 328 | 329 | .CodeMirror pre { 330 | -moz-border-radius: 0; 331 | -webkit-border-radius: 0; 332 | border-radius: 0; 333 | border-width: 0; 334 | background: transparent; 335 | font-family: inherit; 336 | font-size: inherit; 337 | margin: 0; 338 | white-space: pre; 339 | word-wrap: normal; 340 | line-height: inherit; 341 | color: inherit; 342 | z-index: 2; 343 | position: relative; 344 | overflow: visible; 345 | -webkit-tap-highlight-color: transparent 346 | } 347 | 348 | .CodeMirror-wrap pre { 349 | word-wrap: break-word; 350 | white-space: pre-wrap; 351 | word-break: normal 352 | } 353 | 354 | .CodeMirror-linebackground { 355 | position: absolute; 356 | left: 0; 357 | right: 0; 358 | top: 0; 359 | bottom: 0; 360 | z-index: 0 361 | } 362 | 363 | .CodeMirror-linewidget { 364 | position: relative; 365 | z-index: 2; 366 | overflow: auto 367 | } 368 | 369 | .CodeMirror-code { 370 | outline: 0 371 | } 372 | 373 | .CodeMirror-scroll, 374 | .CodeMirror-sizer, 375 | .CodeMirror-gutter, 376 | .CodeMirror-gutters, 377 | .CodeMirror-linenumber { 378 | -moz-box-sizing: content-box; 379 | box-sizing: content-box 380 | } 381 | 382 | .CodeMirror-measure { 383 | position: absolute; 384 | width: 100%; 385 | height: 0; 386 | overflow: hidden; 387 | visibility: hidden 388 | } 389 | 390 | .CodeMirror-cursor { 391 | position: absolute 392 | } 393 | 394 | .CodeMirror-measure pre { 395 | position: static 396 | } 397 | 398 | div.CodeMirror-cursors { 399 | visibility: hidden; 400 | position: relative; 401 | z-index: 3 402 | } 403 | 404 | div.CodeMirror-dragcursors { 405 | visibility: visible 406 | } 407 | 408 | .CodeMirror-focused div.CodeMirror-cursors { 409 | visibility: visible 410 | } 411 | 412 | .CodeMirror-selected { 413 | background: #d9d9d9 414 | } 415 | 416 | .CodeMirror-focused .CodeMirror-selected { 417 | background: #d7d4f0 418 | } 419 | 420 | .CodeMirror-crosshair { 421 | cursor: crosshair 422 | } 423 | 424 | .CodeMirror-line::selection, 425 | .CodeMirror-line>span::selection, 426 | .CodeMirror-line>span>span::selection { 427 | background: #d7d4f0 428 | } 429 | 430 | .CodeMirror-line::-moz-selection, 431 | .CodeMirror-line>span::-moz-selection, 432 | .CodeMirror-line>span>span::-moz-selection { 433 | background: #d7d4f0 434 | } 435 | 436 | .cm-searching { 437 | background: #ffa; 438 | background: rgba(255, 255, 0, .4) 439 | } 440 | 441 | .CodeMirror span { 442 | *vertical-align: text-bottom 443 | } 444 | 445 | .cm-force-border { 446 | padding-right: .1px 447 | } 448 | 449 | @media print { 450 | .CodeMirror div.CodeMirror-cursors { 451 | visibility: hidden 452 | } 453 | } 454 | 455 | .cm-tab-wrap-hack:after { 456 | content: '' 457 | } 458 | 459 | span.CodeMirror-selectedtext { 460 | background: 0 461 | } 462 | -------------------------------------------------------------------------------- /panel/public/css/dracula.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Name: dracula 4 | Author: Michael Kaminsky (http://github.com/mkaminsky11) 5 | 6 | Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme) 7 | 8 | */ 9 | 10 | 11 | .cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters { 12 | background-color: #202020 !important; 13 | color: #f8f8f2 !important; 14 | border: none; 15 | } 16 | .cm-s-dracula .CodeMirror-gutters { color: #282a36; } 17 | .cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; } 18 | .cm-s-dracula .CodeMirror-linenumber { color: white; } 19 | .cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } 20 | .cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } 21 | .cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } 22 | .cm-s-dracula span.cm-comment { color: #cccccc; } 23 | .cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; } 24 | .cm-s-dracula span.cm-number { color: #bd93f9; } 25 | .cm-s-dracula span.cm-variable { color: #50fa7b; } 26 | .cm-s-dracula span.cm-variable-2 { color: white; } 27 | .cm-s-dracula span.cm-def { color: #50fa7b; } 28 | .cm-s-dracula span.cm-operator { color: #ff79c6; } 29 | .cm-s-dracula span.cm-keyword { color: #0099ff; } 30 | .cm-s-dracula span.cm-atom { color: #bd93f9; } 31 | .cm-s-dracula span.cm-meta { color: #f8f8f2; } 32 | .cm-s-dracula span.cm-tag { color: #ff79c6; } 33 | .cm-s-dracula span.cm-attribute { color: #50fa7b; } 34 | .cm-s-dracula span.cm-qualifier { color: #50fa7b; } 35 | .cm-s-dracula span.cm-property { color: #66d9ef; } 36 | .cm-s-dracula span.cm-builtin { color: #50fa7b; } 37 | .cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; } 38 | 39 | .cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); } 40 | .cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } 41 | -------------------------------------------------------------------------------- /panel/public/css/index_style.css: -------------------------------------------------------------------------------- 1 | *{padding:0;margin:0;} 2 | ul li{list-style:none;} 3 | a,img{text-decoration:none;border:none;} 4 | /*导航栏 */ 5 | .menu_close,.menu_open{position:fixed;z-index:1;width:40px;height:40px;border-radius:50%;right:55px;top:40px;cursor:pointer;background-color:rgba(0,0,0,.1);overflow:hidden;z-index:102} 6 | .menu_close:hover,.menu_open:hover{background:#6bc30d} 7 | .menu_close span,.menu_open span{display:block;background:#FFF;width:26px;height:2px;line-height:10px;margin:0 auto;margin-top:5px} 8 | .menu_open span:first-child,.menu_open span:last-child,.menu_open span:nth-last-of-type(2){-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s} 9 | .menu_close span:first-child{margin-top:18px} 10 | .menu_close span{margin-top:0} 11 | .menu_open span:first-child{margin-top:12px} 12 | .menu_close span:last-child{display:none} 13 | .menu_close span:first-child{-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s} 14 | .menu_close span:nth-of-type(2){-webkit-transform:rotate(-45deg);transform:rotate(-45deg);margin-top:-2px;-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s} 15 | .hover_animation{-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s} 16 | .navgation,.navgation_close,.navgation_open{width:100%;height:100%;position:fixed;z-index:101} 17 | .navgation_close{height:0} 18 | .navgation_open{background:rgba(0,0,0,.6)} 19 | .navgation:before,.navgation_close:before,.navgation_open:before{content:'';width:60%;height:100%;background:#fff;position:fixed;-webkit-transition:all .5s cubic-bezier(.19,1,.22,1);-moz-transition:all .5s cubic-bezier(.19,1,.22,1);-o-transition:all .5s cubic-bezier(.19,1,.22,1);transition:all .5s cubic-bezier(.19,1,.22,1);-webkit-transform:translateZ(0) translateX(45%) skew(-12deg);-moz-transform:translateZ(0) translateX(45%) skew(-12deg);-ms-transform:translateZ(0) translateX(45%) skew(-12deg);-o-transform:translateZ(0) translateX(45%) skew(-12deg);transform:translateZ(0) translateX(45%) skew(-12deg);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;content:'';top:0;z-index:11;background-color:#fff;background-image:-webkit-linear-gradient(46deg,#fff,#f1f2f0);background-image:-moz-linear-gradient(46deg,#fff,#f1f2f0);background-image:-o-linear-gradient(46deg,#fff,#f1f2f0);background-image:linear-gradient(46deg,#fff,#f1f2f0)} 20 | .navgation_open:before{right:0} 21 | .navgation_close:before{right:-60%} 22 | .point{position:absolute;right:0;top:200px;z-index:101;font-size:20px} 23 | .point li{display:block;text-align:right;line-height:80px} 24 | .point li a{font-family:"Microsoft YaHei";color:#686967;display:inline-block;line-height:46px;padding:10px 50px;font-size:20px;color:#686967;text-decoration:none;-webkit-transition:color .6s linear;transition:color .6s linear;position:relative} 25 | .point li a:before{-webkit-transition:all .3s linear;transition:all .3s linear;content:'';height:1px;background-color:transparent;position:absolute;top:50%;left:15px;right:105px} 26 | .point li a:hover{color:#6bc30d} 27 | .point li a:hover:before{background-color:#6bc30d;right:15px} 28 | .navgation_open .point{display:block} 29 | .navgation_close .point{display:none} 30 | .logo{font-size:50px;position:absolute;right:0;bottom:0;z-index:101;padding:10px 50px} 31 | .logo a{font-family:BarbaraHand;color:#686967;text-decoration:none} 32 | .navgation_open .logo{display:block} 33 | .navgation_close .logo{display:none} 34 | /*导航栏样式end*/ 35 | .section{overflow:hidden;display:table;table-layout:fixed;width:100%;position:relative;padding:100px 0} 36 | .fp-tablecell{display:table-cell;vertical-align:middle;width:100%;height:100%;position:relative;z-index:1} 37 | #section1{height:100vh;padding:0;background-color:transparent;background-image:url(https://cdn.jsdelivr.net/gh/lan-tianxiang/JS_TOOL@A1/panel/public/img/sky.jpg);background-position:center;background-attachment:fixed;background-repeat:no-repeat} 38 | #section3{background-image:url(https://yssimage.oss-cn-hangzhou.aliyuncs.com/22.jpg);background-position:center;background-attachment:fixed;background-repeat:no-repeat} 39 | #section4{background-color:#FAF9F9} 40 | #section1:after,#section3:after{content:"";position:absolute;top:0;left:0;z-index:0;width:100%;height:100%;/*background-color:rgba(0,0,0,.5)*/} 41 | #section1,#section2,#section3,#section4{background-size:cover} 42 | /*第一屏 开始*/ 43 | .page1 .nav{text-align:center;color:#FFF} 44 | .page1 p{letter-spacing:10px;margin:20px 0} 45 | .page1 .nav .btn{padding:10px 40px;background:0 0;border-radius:4px;border:2px solid #FFF;color:#FFF;cursor:pointer;margin-top:20px;font-family:'Microsoft YaHei';display:inline-block} 46 | .page1 .next{display:block;width:50px;height:50px;border-radius:50%;position:absolute;bottom:30px;left:50%;margin-left:-25px !important;z-index:0;-webkit-transition:all .5s ease-out;transition:all .5s ease-out;cursor:pointer} 47 | .page1 .next:hover{-webkit-animation:nextanimation 1s linear;animation:nextanimation 1s linear;background-color:#6bc30d} 48 | .page1 .next:after{font-family:FontAwesome;content:"\f107";color:#fff;font-size:3rem;display:table;margin:0 auto} 49 | /*第一屏 结束*/ 50 | /*第二屏 开始*/ 51 | .page2,.page3,.page4,.page5{width:90%;position:relative;margin:0 auto;padding-top:.1px;font-family:"Microsoft YaHei"} 52 | .warp-box{width:100%;height:100%;position:relative} 53 | .warp{display:table;margin:0 auto;height:100%;position:relative} 54 | .page2 .single-news{margin-top:50px;background:#faf9f9} 55 | .page2 .single-news:hover .news-head img{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);transform:scale(1.2)} 56 | .page2 .single-news:hover .news-head:before{opacity:1;visibility:visible;-webkit-transform:translateY(0);-moz-transform:translateY(0);transform:translateY(0)} 57 | .page2 .single-news:hover .link{top:50%;opacity:1;visibility:visible} 58 | .page2 .news-head{position:relative;overflow:hidden} 59 | .page2 .news-head::before{position:absolute;width:100%;height:100%;left:0;top:0;background:rgba(255,255,255,.51);content:"";opacity:0;visibility:hidden;-webkit-transition:all .4s ease;-moz-transition:all .4s ease;transition:all .4s ease;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);transform:translateY(-100%);z-index:8} 60 | .page2 .news-head img{width:100%;height:244px;-webkit-transition:all .4s ease;-moz-transition:all .4s ease;transition:all .4s ease} 61 | .page2 .link{position:absolute;left:0;top:0;width:40px;height:40px;background:#333;color:#fff;opacity:0;visibility:hidden;text-align:center;left:50%;margin:-20px 0 0 -20px;line-height:40px;z-index:9;-webkit-transition:all .4s ease;-moz-transition:all .4s ease;transition:all .4s ease} 62 | .page2 .news-content{padding:30px 15px} 63 | .page2 .news-content h4{margin-bottom:10px} 64 | .page2 .news-content .date{color:#bbb;font-size:12px;margin-bottom:15px} 65 | .page2 .news-content p{color:#999;height:55px;overflow:hidden} 66 | .page2 .news-content .btn{display:inline-block;margin-top:15px;padding:0;background:0 0;border:none;color:#29B6F6;-webkit-transition:all .4s ease;-moz-transition:all .4s ease;transition:all .4s ease} 67 | .page2 .news-content .btn:hover{color:#333} 68 | .page2 .new-article{text-align:center} 69 | .page2 .inner{display:inline-block;vertical-align:middle} 70 | .page2 .new-article h1{font-size:32px;padding-bottom:30px;position:relative;font-weight:500} 71 | .page2 .new-article h1:after{position:absolute;width:50px;height:2px;content:"";left:50%;margin-left:-25px;bottom:-1px;background:#00C2FF} 72 | .page2 .new-article p{margin-top:20px;line-height:22px;color:#888} 73 | /*第二屏 结束*/ 74 | /*第三屏 开始*/ 75 | .page3 .inner{text-align:center;} 76 | .page3 .links li{display:inline-block;width:200px;height:46px;margin:10px;border:1px solid #b4b4b4;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:all .6s linear;transition:all .6s linear;position:relative;text-align:center;overflow:hidden;} 77 | .page3 .links li a{display:block;line-height:26px;padding:10px;text-align:center;color:#FFF;text-decoration:none;font-size:14px;-webkit-transition:all .6s linear;transition:all .6s linear;position:relative;z-index:1;} 78 | .page3 .links li:after{content:'';width:0;background-color:#6bc30d;height:46px;position:absolute;left:0;top:0;z-index:0;-webkit-transition:all .6s linear;transition:all .6s linear;} 79 | .page3 .links li:hover{border-color:#fff;color:#fff;} 80 | .page3 .links li:hover:after{width:100%;} 81 | /*第三屏结束*/ 82 | /*第四屏开始*/ 83 | .page4 .about{text-align: center;} 84 | .page4 .about h1{margin-bottom:20px;} 85 | /*第四屏结束*/ 86 | @media screen and (min-width: 768px){ 87 | .page2 {width: 750px;} 88 | } 89 | @media screen and (min-width: 992px){ 90 | .page2 {width: 970px;} 91 | } 92 | @media screen and (min-width: 1200px){ 93 | .page2 {width: 1170px;} 94 | } 95 | @media screen and (max-width:768px){ 96 | .navgation:before,.navgation_open:before,.navgation_close:before{width:50%;transform: none;-webkit-transform:none;} 97 | .logo{width: 50%;padding: 0;text-align: center;} 98 | } 99 | /*底部*/ 100 | .footer .container{width:90%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto} 101 | .footer .footer-top{background:#232328;padding:60px 0 90px} 102 | .footer .single-widget{margin-top:30px} 103 | .footer .footer-logo{margin-bottom:20px} 104 | .footer .single-widget h2{color:#fff;font-size:18px;margin-bottom:20px;text-transform:uppercase} 105 | .footer .about p{color:#eee} 106 | .footer .button .btn{margin-top:20px} 107 | .footer .button .btn:hover{border-color:#fff} 108 | .footer .contact ul li{color:#eee;position:relative;padding-left:40px;font-family:Roboto,sans-serif;margin-bottom:10px} 109 | .footer .contact ul li:last-child{margin:0} 110 | .footer .contact ul li i{position:absolute;top:50%;width:30px;height:30px;text-align:center;line-height:30px;left:0;margin-top:-15px;font-size:16px} 111 | .footer .contact ul li a{color:#fff} 112 | .footer .social-icon li{float:left;width:50%;margin-bottom:10px} 113 | .footer .social-icon li:last-child{margin:0} 114 | .footer .social-icon li a{color:#eee} 115 | .footer .social-icon li a:hover{color:#82B440} 116 | .footer .social-icon li a i{margin-right:10px;width:20px;font-size:16px} 117 | .footer .copyright{padding:12px 0;background:#1D1D21} 118 | .footer .copyright .text-center{text-align:center} 119 | .footer .copyright p{color:#bbb;font-size:14px} 120 | /*底部*/ 121 | @font-face{font-family:'BarbaraHand';src:url('../font/barbarahand-webfont.eot');src:url('../font/barbarahand-webfont.eot?#iefix') format('embedded-opentype'),url('../font/barbarahand-webfont.woff2') format('woff2'),url('../font/barbarahand-webfont.woff') format('woff'),url('../font/barbarahand-webfont.ttf') format('truetype'),url('../font/barbarahand-webfont.svg#BarbaraHand') format('svg');font-weight:normal;font-style:normal;} 122 | #loading {background-color:#374140;height:100%;width:100%;position:fixed;z-index:1;margin-top:0px;top:0px;} 123 | #loading-center {width:100%;height:100%;position:relative;} 124 | #loading-center-absolute {position:absolute;left:50%;top:50%;height:150px;width:150px;margin-top:-75px;margin-left:-75px;} 125 | .object {width:20px;height:20px;background-color:#FFF;float:left;margin-right:15px;margin-left:15px;margin-top:65px;-moz-border-radius:50% 50% 50% 50%;-webkit-border-radius:50% 50% 50% 50%;border-radius:50% 50% 50% 50%;} 126 | #object_one {-webkit-animation:object_one 1.5s infinite;animation:object_one 1.5s infinite;} 127 | #object_two {-webkit-animation:object_two 1.5s infinite;animation:object_two 1.5s infinite;-webkit-animation-delay:0.25s;animation-delay:0.25s;} 128 | #object_three {-webkit-animation:object_three 1.5s infinite;animation:object_three 1.5s infinite;-webkit-animation-delay:0.5s;animation-delay:0.5s;} 129 | @-webkit-keyframes object_one {75% {-webkit-transform:scale(0);} 130 | } 131 | @keyframes object_one {75% {transform:scale(0);-webkit-transform:scale(0);} 132 | } 133 | @-webkit-keyframes object_two {75% {-webkit-transform:scale(0);} 134 | } 135 | @keyframes object_two {75% {transform:scale(0);-webkit-transform:scale(0);} 136 | } 137 | @-webkit-keyframes object_three {75% {-webkit-transform:scale(0);} 138 | } 139 | @keyframes object_three {75% {transform:scale(0);-webkit-transform:scale(0);} 140 | } -------------------------------------------------------------------------------- /panel/public/css/main.css: -------------------------------------------------------------------------------- 1 | body, 2 | html { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | h1, 8 | ul { 9 | color: #000000; 10 | margin: 0.2em 0 0.4em 0; 11 | margin-left: 0.5em; 12 | font-size: 1.5rem; 13 | padding-right: 1rem; 14 | } 15 | 16 | h4 { 17 | margin-top: 0.5em; 18 | margin-left: 0.8em; 19 | margin-bottom: 0.5em; 20 | color: rgb(0, 0, 0); 21 | } 22 | 23 | nav ul { 24 | margin: 0; 25 | padding: 0; 26 | } 27 | 28 | nav ul li { 29 | display: inline; 30 | } 31 | 32 | nav ul li a:link, 33 | nav ul li a:visited, 34 | nav ul li a:active { 35 | font-size: 0.875rem; 36 | padding: 0.5rem 1.4rem; 37 | color: white; 38 | text-decoration: none; 39 | background-color: #1A3D22; 40 | transition: background-color 200ms; 41 | } 42 | 43 | nav ul li a:hover { 44 | background-color: #000000; 45 | } 46 | 47 | nav .active a { 48 | background-color: #1A3D22 !important; 49 | } 50 | 51 | .footer { 52 | color: rgb(185, 185, 185); 53 | left: 0px; 54 | bottom: 0px; 55 | width: 100%; 56 | height: 100px; 57 | position: absolute; 58 | z-index: 9999; 59 | width: 100%; 60 | margin: 0 auto; 61 | text-align: center; 62 | } 63 | 64 | 65 | .container { 66 | display: flex; 67 | flex-direction: column; 68 | height: 100vh; 69 | width: 100%; 70 | height: 100%; 71 | top: 0px; 72 | left: 0px; 73 | position: absolute; 74 | 75 | } 76 | 77 | .container p { 78 | font-size: 0.875rem; 79 | margin: 0; 80 | line-height: 1.5em; 81 | } 82 | 83 | .container .right { 84 | top: 0px; 85 | left: 0px; 86 | position: absolute; 87 | float: left; 88 | width: 250px; 89 | height: 50px; 90 | border: 1px solid #F00; 91 | } 92 | 93 | .diffs { 94 | flex: 1 1 auto; 95 | display: flex; 96 | flex-direction: column; 97 | } 98 | 99 | .diffs header { 100 | margin-top: 1rem; 101 | } 102 | 103 | .diffs header * { 104 | display: inline-block; 105 | vertical-align: middle; 106 | } 107 | 108 | .diffs .compare-wrapper, 109 | .diffs .wrapper { 110 | flex: 1 1 auto; 111 | position: relative; 112 | } 113 | 114 | .diffs .compare-wrapper #compare { 115 | display: flex; 116 | flex-direction: column; 117 | position: absolute; 118 | top: 0; 119 | left: 0; 120 | bottom: 0; 121 | right: 0; 122 | } 123 | 124 | /* Auto-height fix */ 125 | 126 | .wrapper .CodeMirror { 127 | position: absolute; 128 | height: calc(100% - 0.5em); 129 | width: 100% 130 | } 131 | 132 | .mergely-column .CodeMirror { 133 | height: 100%; 134 | } 135 | 136 | .sources a { 137 | font-size: 1rem; 138 | } 139 | 140 | /* Login page */ 141 | .login-form { 142 | width: 300px; 143 | height: 450px; 144 | position: absolute; 145 | top: 0; 146 | left: 0; 147 | right: 0; 148 | bottom: 0; 149 | margin: auto; 150 | font-family: Tahoma, Geneva, sans-serif; 151 | } 152 | 153 | .login-form h1 { 154 | text-align: center; 155 | color: #000000; 156 | font-size: 24px; 157 | padding: 20px 0 20px 0; 158 | } 159 | 160 | .login-form input[type="password"], 161 | .login-form input[type="text"] { 162 | width: 100%; 163 | padding: 15px; 164 | border: 1px solid #dddddd; 165 | margin-bottom: 15px; 166 | box-sizing: border-box; 167 | border-radius: 11px 11px 11px 11px; 168 | -moz-border-radius: 11px 11px 11px 11px; 169 | -webkit-border-radius: 11px 11px 11px 11px; 170 | } 171 | 172 | .login-form input[type="submit"] { 173 | width: 100%; 174 | padding: 15px; 175 | background-color: #6D8A88; 176 | border: 0; 177 | box-sizing: border-box; 178 | cursor: pointer; 179 | font-weight: bold; 180 | color: #ffffff; 181 | border-radius: 11px 11px 11px 11px; 182 | -moz-border-radius: 11px 11px 11px 11px; 183 | -webkit-border-radius: 11px 11px 11px 11px; 184 | } 185 | 186 | #qrcontainer { 187 | position: fixed; 188 | width: 100%; 189 | height: 100%; 190 | left: 0; 191 | top: 0; 192 | z-index: 1000; 193 | display: flex; 194 | align-items: center; 195 | justify-content: center; 196 | background: rgba(255, 255, 255, .8); 197 | text-align: center; 198 | transition: all 0.3s; 199 | } 200 | 201 | #qrcontainer.hidden { 202 | opacity: 0; 203 | visibility: hidden; 204 | } 205 | 206 | #qrcontainer .qframe { 207 | background-color: #ffffff; 208 | padding: 1rem; 209 | border-radius: 0.5rem; 210 | border: #6D8A88 1px solid; 211 | -webkit-box-shadow: 0px 0px 7px 3px rgba(0, 0, 0, 0.2); 212 | box-shadow: 0px 0px 7px 3px rgba(0, 0, 0, 0.2); 213 | position: relative; 214 | } 215 | 216 | #qrcontainer .qframe #refresh_qrcode { 217 | width: 256px; 218 | height: 256px; 219 | position: absolute; 220 | background-color: rgba(0, 0, 0, 0.5); 221 | left: 1rem; 222 | top: 1rem; 223 | color: #ffffff; 224 | display: flex; 225 | justify-content: center; 226 | align-items: center; 227 | } 228 | 229 | #qrcontainer .qframe #refresh_qrcode.hidden { 230 | opacity: 0; 231 | visibility: hidden; 232 | } 233 | 234 | #qrcontainer .qframe #refresh_qrcode h3 { 235 | font-weight: normal; 236 | } 237 | 238 | #qrcontainer .qframe #refresh_qrcode .refresh { 239 | display: block; 240 | background: #e4393c; 241 | width: 80px; 242 | height: 30px; 243 | margin: 0 auto; 244 | line-height: 30px; 245 | opacity: 1; 246 | z-index: 19; 247 | color: #fbfbfb; 248 | text-decoration: none; 249 | cursor: pointer; 250 | } 251 | 252 | #qrcontainer .qframe .info { 253 | padding: 1rem 0 0 0; 254 | } 255 | 256 | #qrcontainer .qframe .qframe-close { 257 | font-size: 20px; 258 | color: #f00; 259 | cursor: pointer; 260 | } 261 | 262 | @media screen and (max-width: 480px) { 263 | 264 | nav ul li a:link, 265 | nav ul li a:visited, 266 | nav ul li a:active { 267 | font-size: 0.75rem; 268 | padding: 0.5rem 0.5rem; 269 | margin: 0; 270 | 271 | } 272 | 273 | .container p { 274 | font-size: 0.75rem; 275 | margin: 0; 276 | line-height: 1.5em; 277 | } 278 | } 279 | 280 | .log-container { 281 | display: flex; 282 | flex-direction: column; 283 | height: 100vh; 284 | margin: 0 .5em; 285 | } 286 | 287 | @media (min-width: 992px) { 288 | .elk-app { 289 | height: 100%; 290 | } 291 | 292 | .elk-side { 293 | width: 20rem; 294 | } 295 | 296 | .elk-container, 297 | .elk-main, 298 | .elk-side { 299 | overflow-y: auto; 300 | } 301 | } 302 | 303 | .bg-light { 304 | background-color: #f8f9fa !important; 305 | } 306 | 307 | .left-list { 308 | overflow: auto; 309 | z-index: 100; 310 | } 311 | 312 | .text-dark { 313 | color: #343a40 !important; 314 | } 315 | 316 | .nav-link { 317 | font-size: 18px; 318 | color: #007bff; 319 | text-decoration: none; 320 | background-color: transparent; 321 | } 322 | 323 | /* diff页面 */ 324 | .CodeMirror-merge { 325 | flex: 1; 326 | width: 100%; 327 | height: auto; 328 | display: flex; 329 | overflow: hidden; 330 | } 331 | 332 | .CodeMirror-merge .CodeMirror { 333 | height: 100%; 334 | } 335 | 336 | .CodeMirror-merge-2pane .CodeMirror-merge-pane { 337 | width: calc(50% - 15px); 338 | } 339 | 340 | .CodeMirror-merge-2pane .CodeMirror-merge-gap { 341 | width: 30px; 342 | background: #1E411F 343 | } 344 | 345 | .CodeMirror-merge-2pane .CodeMirror-merge-scrolllock { 346 | display: none; 347 | } 348 | 349 | .CodeMirror-merge-pane-rightmost { 350 | position: static; 351 | } 352 | 353 | /* 更新工具差异处颜色 */ 354 | .CodeMirror-merge-r-chunk { 355 | background: #1E411F 356 | } 357 | 358 | .CodeMirror-merge-r-chunk-start { 359 | border-top: 1px solid #1E411F; 360 | } 361 | 362 | .CodeMirror-merge-r-chunk-end { 363 | border-bottom: 1px solid #1E411F; 364 | } 365 | 366 | .CodeMirror-merge-r-connect { 367 | fill: #ebdc5c; 368 | stroke: rgb(148, 238, 136); 369 | stroke-width: 1px; 370 | } 371 | 372 | /* 手动执行脚本页面 */ 373 | .run-cmd-form { 374 | margin-top: 6px; 375 | } 376 | 377 | .cmd-section { 378 | border-color: #1e90ff; 379 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px #1e90ff; 380 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px #1e90ff; 381 | 382 | } 383 | 384 | .cmd-section input { 385 | width: 150px; 386 | height: 20px; 387 | -moz-animation: glow 800ms ease-out infinite alternate; 388 | -o-animation: glow 800ms ease-out infinite alternate; 389 | -ms-animation: glow 800ms ease-out infinite alternate; 390 | animation: glow 800ms ease-out infinite alternate; 391 | background: #222922; 392 | background: -webkit-linear-gradient(#333933, #222922); 393 | background: -moz-linear-gradient(#333933, #222922); 394 | background: -o-linear-gradient(#333933, #222922); 395 | background: -ms-linear-gradient(#333933, #222922); 396 | background: linear-gradient(#333933, #222922); 397 | color: #efe; 398 | outline: none; 399 | } 400 | 401 | 402 | /* 按钮配置 */ 403 | button { 404 | /* 静态背景颜色 */ 405 | background: #000000; 406 | /* 静态字体颜色 */ 407 | color: rgb(255, 255, 255); 408 | border: none; 409 | position: relative; 410 | height: 30px; 411 | font-size: 0.6em; 412 | padding: 0 1em; 413 | cursor: pointer; 414 | transition: 200ms ease all; 415 | outline: none; 416 | } 417 | 418 | button:hover { 419 | /* 静态字体颜色 */ 420 | color: #000000; 421 | /* 点击背景颜色 */ 422 | background: rgb(255, 255, 255); 423 | 424 | } 425 | 426 | button:before, 427 | button:after { 428 | content: ''; 429 | position: absolute; 430 | top: 0; 431 | right: 0; 432 | height: 0px; 433 | width: 0; 434 | /* 线条动画颜色 */ 435 | background: #535252; 436 | transition: 400ms ease all; 437 | } 438 | 439 | button:after { 440 | right: inherit; 441 | top: inherit; 442 | left: 0; 443 | bottom: 0; 444 | } 445 | 446 | button:hover:before, 447 | button:hover:after { 448 | width: 100%; 449 | transition: 500ms ease all; 450 | } 451 | 452 | .ant-btn { 453 | line-height: 1.499; 454 | position: relative; 455 | display: inline-block; 456 | font-weight: 400; 457 | white-space: nowrap; 458 | text-align: center; 459 | background-image: none; 460 | border: 1px solid transparent; 461 | -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); 462 | box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); 463 | cursor: pointer; 464 | -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1); 465 | transition: all .3s cubic-bezier(.645, .045, .355, 1); 466 | -webkit-user-select: none; 467 | -moz-user-select: none; 468 | -ms-user-select: none; 469 | user-select: none; 470 | -ms-touch-action: manipulation; 471 | touch-action: manipulation; 472 | height: 32px; 473 | padding: 0 15px; 474 | font-size: 14px; 475 | border-radius: 4px; 476 | color: rgba(0, 0, 0, 0.65); 477 | background-color: #fff; 478 | border-color: #d9d9d9; 479 | } 480 | 481 | .ant-btn-primary { 482 | color: #fff; 483 | background-color: #1890ff; 484 | border-color: #1890ff; 485 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); 486 | -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); 487 | box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); 488 | } 489 | 490 | .ant-btn-red { 491 | color: #fff; 492 | background-color: #FF5A44; 493 | border-color: #FF5A44; 494 | border-radius: 6px 6px 6px 6px; 495 | -moz-border-radius: 6px 6px 6px 6px; 496 | -webkit-border-radius: 6px 6px 6px 6px; 497 | } 498 | -------------------------------------------------------------------------------- /panel/public/css/merge.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-merge { 2 | position: relative; 3 | border: 1px solid #ddd; 4 | white-space: pre; 5 | } 6 | 7 | .CodeMirror-merge, .CodeMirror-merge .CodeMirror { 8 | height: 350px; 9 | } 10 | 11 | .CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } 12 | .CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } 13 | .CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } 14 | .CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } 15 | 16 | .CodeMirror-merge-pane { 17 | display: inline-block; 18 | white-space: normal; 19 | vertical-align: top; 20 | } 21 | .CodeMirror-merge-pane-rightmost { 22 | position: absolute; 23 | right: 0px; 24 | z-index: 1; 25 | } 26 | 27 | .CodeMirror-merge-gap { 28 | z-index: 2; 29 | display: inline-block; 30 | height: 100%; 31 | -moz-box-sizing: border-box; 32 | box-sizing: border-box; 33 | overflow: hidden; 34 | border-left: 1px solid #ddd; 35 | border-right: 1px solid #ddd; 36 | position: relative; 37 | background: #f8f8f8; 38 | } 39 | 40 | .CodeMirror-merge-scrolllock-wrap { 41 | position: absolute; 42 | bottom: 0; left: 50%; 43 | } 44 | .CodeMirror-merge-scrolllock { 45 | position: relative; 46 | left: -50%; 47 | cursor: pointer; 48 | color: #555; 49 | line-height: 1; 50 | } 51 | .CodeMirror-merge-scrolllock:after { 52 | content: "\21db\00a0\00a0\21da"; 53 | } 54 | .CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after { 55 | content: "\21db\21da"; 56 | } 57 | 58 | .CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { 59 | position: absolute; 60 | left: 0; top: 0; 61 | right: 0; bottom: 0; 62 | line-height: 1; 63 | } 64 | 65 | .CodeMirror-merge-copy { 66 | position: absolute; 67 | cursor: pointer; 68 | color: #44c; 69 | z-index: 3; 70 | } 71 | 72 | .CodeMirror-merge-copy-reverse { 73 | position: absolute; 74 | cursor: pointer; 75 | color: #44c; 76 | } 77 | 78 | .CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } 79 | .CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } 80 | 81 | .CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { 82 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); 83 | background-position: bottom left; 84 | background-repeat: repeat-x; 85 | } 86 | 87 | .CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { 88 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); 89 | background-position: bottom left; 90 | background-repeat: repeat-x; 91 | } 92 | 93 | .CodeMirror-merge-r-chunk { background: #ffffe0; } 94 | .CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } 95 | .CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } 96 | .CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } 97 | 98 | .CodeMirror-merge-l-chunk { background: #eef; } 99 | .CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } 100 | .CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } 101 | .CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } 102 | 103 | .CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } 104 | .CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } 105 | .CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } 106 | 107 | .CodeMirror-merge-collapsed-widget:before { 108 | content: "(...)"; 109 | } 110 | .CodeMirror-merge-collapsed-widget { 111 | cursor: pointer; 112 | color: #88b; 113 | background: #eef; 114 | border: 1px solid #ddf; 115 | font-size: 90%; 116 | padding: 0 3px; 117 | border-radius: 4px; 118 | } 119 | .CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } 120 | -------------------------------------------------------------------------------- /panel/public/css/normalize.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Render the `main` element consistently in IE. 29 | */ 30 | 31 | main { 32 | display: block; 33 | } 34 | 35 | /** 36 | * Correct the font size and margin on `h1` elements within `section` and 37 | * `article` contexts in Chrome, Firefox, and Safari. 38 | */ 39 | 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; 43 | } 44 | 45 | /* Grouping content 46 | ========================================================================== */ 47 | 48 | /** 49 | * 1. Add the correct box sizing in Firefox. 50 | * 2. Show the overflow in Edge and IE. 51 | */ 52 | 53 | hr { 54 | box-sizing: content-box; /* 1 */ 55 | height: 0; /* 1 */ 56 | overflow: visible; /* 2 */ 57 | } 58 | 59 | /** 60 | * 1. Correct the inheritance and scaling of font size in all browsers. 61 | * 2. Correct the odd `em` font sizing in all browsers. 62 | */ 63 | 64 | pre { 65 | font-family: monospace, monospace; /* 1 */ 66 | font-size: 1em; /* 2 */ 67 | } 68 | 69 | /* Text-level semantics 70 | ========================================================================== */ 71 | 72 | /** 73 | * Remove the gray background on active links in IE 10. 74 | */ 75 | 76 | a { 77 | background-color: transparent; 78 | } 79 | 80 | /** 81 | * 1. Remove the bottom border in Chrome 57- 82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 83 | */ 84 | 85 | abbr[title] { 86 | border-bottom: none; /* 1 */ 87 | text-decoration: underline; /* 2 */ 88 | text-decoration: underline dotted; /* 2 */ 89 | } 90 | 91 | /** 92 | * Add the correct font weight in Chrome, Edge, and Safari. 93 | */ 94 | 95 | b, 96 | strong { 97 | font-weight: bolder; 98 | } 99 | 100 | /** 101 | * 1. Correct the inheritance and scaling of font size in all browsers. 102 | * 2. Correct the odd `em` font sizing in all browsers. 103 | */ 104 | 105 | code, 106 | kbd, 107 | samp { 108 | font-family: monospace, monospace; /* 1 */ 109 | font-size: 1em; /* 2 */ 110 | } 111 | 112 | /** 113 | * Add the correct font size in all browsers. 114 | */ 115 | 116 | small { 117 | font-size: 80%; 118 | } 119 | 120 | /** 121 | * Prevent `sub` and `sup` elements from affecting the line height in 122 | * all browsers. 123 | */ 124 | 125 | sub, 126 | sup { 127 | font-size: 75%; 128 | line-height: 0; 129 | position: relative; 130 | vertical-align: baseline; 131 | } 132 | 133 | sub { 134 | bottom: -0.25em; 135 | } 136 | 137 | sup { 138 | top: -0.5em; 139 | } 140 | 141 | /* Embedded content 142 | ========================================================================== */ 143 | 144 | /** 145 | * Remove the border on images inside links in IE 10. 146 | */ 147 | 148 | img { 149 | border-style: none; 150 | } 151 | 152 | /* Forms 153 | ========================================================================== */ 154 | 155 | /** 156 | * 1. Change the font styles in all browsers. 157 | * 2. Remove the margin in Firefox and Safari. 158 | */ 159 | 160 | button, 161 | input, 162 | optgroup, 163 | select, 164 | textarea { 165 | font-family: inherit; /* 1 */ 166 | font-size: 100%; /* 1 */ 167 | line-height: 1.15; /* 1 */ 168 | margin: 0; /* 2 */ 169 | } 170 | 171 | /** 172 | * Show the overflow in IE. 173 | * 1. Show the overflow in Edge. 174 | */ 175 | 176 | button, 177 | input { /* 1 */ 178 | overflow: visible; 179 | } 180 | 181 | /** 182 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 183 | * 1. Remove the inheritance of text transform in Firefox. 184 | */ 185 | 186 | button, 187 | select { /* 1 */ 188 | text-transform: none; 189 | } 190 | 191 | /** 192 | * Correct the inability to style clickable types in iOS and Safari. 193 | */ 194 | 195 | button, 196 | [type="button"], 197 | [type="reset"], 198 | [type="submit"] { 199 | -webkit-appearance: button; 200 | } 201 | 202 | /** 203 | * Remove the inner border and padding in Firefox. 204 | */ 205 | 206 | button::-moz-focus-inner, 207 | [type="button"]::-moz-focus-inner, 208 | [type="reset"]::-moz-focus-inner, 209 | [type="submit"]::-moz-focus-inner { 210 | border-style: none; 211 | padding: 0; 212 | } 213 | 214 | /** 215 | * Restore the focus styles unset by the previous rule. 216 | */ 217 | 218 | button:-moz-focusring, 219 | [type="button"]:-moz-focusring, 220 | [type="reset"]:-moz-focusring, 221 | [type="submit"]:-moz-focusring { 222 | outline: 1px dotted ButtonText; 223 | } 224 | 225 | /** 226 | * Correct the padding in Firefox. 227 | */ 228 | 229 | fieldset { 230 | padding: 0.35em 0.75em 0.625em; 231 | } 232 | 233 | /** 234 | * 1. Correct the text wrapping in Edge and IE. 235 | * 2. Correct the color inheritance from `fieldset` elements in IE. 236 | * 3. Remove the padding so developers are not caught out when they zero out 237 | * `fieldset` elements in all browsers. 238 | */ 239 | 240 | legend { 241 | box-sizing: border-box; /* 1 */ 242 | color: inherit; /* 2 */ 243 | display: table; /* 1 */ 244 | max-width: 100%; /* 1 */ 245 | padding: 0; /* 3 */ 246 | white-space: normal; /* 1 */ 247 | } 248 | 249 | /** 250 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 251 | */ 252 | 253 | progress { 254 | vertical-align: baseline; 255 | } 256 | 257 | /** 258 | * Remove the default vertical scrollbar in IE 10+. 259 | */ 260 | 261 | textarea { 262 | overflow: auto; 263 | } 264 | 265 | /** 266 | * 1. Add the correct box sizing in IE 10. 267 | * 2. Remove the padding in IE 10. 268 | */ 269 | 270 | [type="checkbox"], 271 | [type="radio"] { 272 | box-sizing: border-box; /* 1 */ 273 | padding: 0; /* 2 */ 274 | } 275 | 276 | /** 277 | * Correct the cursor style of increment and decrement buttons in Chrome. 278 | */ 279 | 280 | [type="number"]::-webkit-inner-spin-button, 281 | [type="number"]::-webkit-outer-spin-button { 282 | height: auto; 283 | } 284 | 285 | /** 286 | * 1. Correct the odd appearance in Chrome and Safari. 287 | * 2. Correct the outline style in Safari. 288 | */ 289 | 290 | [type="search"] { 291 | -webkit-appearance: textfield; /* 1 */ 292 | outline-offset: -2px; /* 2 */ 293 | } 294 | 295 | /** 296 | * Remove the inner padding in Chrome and Safari on macOS. 297 | */ 298 | 299 | [type="search"]::-webkit-search-decoration { 300 | -webkit-appearance: none; 301 | } 302 | 303 | /** 304 | * 1. Correct the inability to style clickable types in iOS and Safari. 305 | * 2. Change font properties to `inherit` in Safari. 306 | */ 307 | 308 | ::-webkit-file-upload-button { 309 | -webkit-appearance: button; /* 1 */ 310 | font: inherit; /* 2 */ 311 | } 312 | 313 | /* Interactive 314 | ========================================================================== */ 315 | 316 | /* 317 | * Add the correct display in Edge, IE 10+, and Firefox. 318 | */ 319 | 320 | details { 321 | display: block; 322 | } 323 | 324 | /* 325 | * Add the correct display in all browsers. 326 | */ 327 | 328 | summary { 329 | display: list-item; 330 | } 331 | 332 | /* Misc 333 | ========================================================================== */ 334 | 335 | /** 336 | * Add the correct display in IE 10+. 337 | */ 338 | 339 | template { 340 | display: none; 341 | } 342 | 343 | /** 344 | * Add the correct display in IE 10. 345 | */ 346 | 347 | [hidden] { 348 | display: none; 349 | } -------------------------------------------------------------------------------- /panel/public/css/style.css: -------------------------------------------------------------------------------- 1 | /*Sakura animation using WebGL. No images are used. The framerate might be slow or the demo might not play at all in some older systems so you can watch this video: http://www.screenr.com/BFZ8. Let me make it clear that I did not make this and just thought is was very cool and wanted to share it. 2 | */ 3 | 4 | body { 5 | padding: 0; 6 | margin: 0; 7 | overflow: hidden; 8 | height: 600px; 9 | } 10 | 11 | canvas { 12 | padding: 0; 13 | margin: 0; 14 | } -------------------------------------------------------------------------------- /panel/public/css/twilight.css: -------------------------------------------------------------------------------- 1 | .cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ 2 | .cm-s-twilight div.CodeMirror-selected { background: #323232; } /**/ 3 | .cm-s-twilight .CodeMirror-line::selection, .cm-s-twilight .CodeMirror-line > span::selection, .cm-s-twilight .CodeMirror-line > span > span::selection { background: rgba(50, 50, 50, 0.99); } 4 | .cm-s-twilight .CodeMirror-line::-moz-selection, .cm-s-twilight .CodeMirror-line > span::-moz-selection, .cm-s-twilight .CodeMirror-line > span > span::-moz-selection { background: rgba(50, 50, 50, 0.99); } 5 | 6 | .cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } 7 | .cm-s-twilight .CodeMirror-guttermarker { color: white; } 8 | .cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; } 9 | .cm-s-twilight .CodeMirror-linenumber { color: #aaa; } 10 | .cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white; } 11 | 12 | .cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ 13 | .cm-s-twilight .cm-atom { color: #FC0; } 14 | .cm-s-twilight .cm-number { color: #ca7841; } /**/ 15 | .cm-s-twilight .cm-def { color: #8DA6CE; } 16 | .cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ 17 | .cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/ 18 | .cm-s-twilight .cm-operator { color: #cda869; } /**/ 19 | .cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ 20 | .cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ 21 | .cm-s-twilight .cm-string-2 { color:#bd6b18; } /*?*/ 22 | .cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ 23 | .cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ 24 | .cm-s-twilight .cm-tag { color: #997643; } /**/ 25 | .cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ 26 | .cm-s-twilight .cm-header { color: #FF6400; } 27 | .cm-s-twilight .cm-hr { color: #AEAEAE; } 28 | .cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ 29 | .cm-s-twilight .cm-error { border-bottom: 1px solid red; } 30 | 31 | .cm-s-twilight .CodeMirror-activeline-background { background: #27282E; } 32 | .cm-s-twilight .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } 33 | -------------------------------------------------------------------------------- /panel/public/data/README.MD: -------------------------------------------------------------------------------- 1 | ###面板数据存储 -------------------------------------------------------------------------------- /panel/public/diff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 在线更新工具 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 |
25 | 41 |
42 |

在线对比合并工具

43 | 44 | 45 | 46 | 47 |
48 |

左侧为 config.sh ,右侧为 config.sh.sample

49 |
50 |
51 |
52 |
53 |
54 |

查看源文件,注意将浏览器编码切换为 UTF-8 。

55 | 59 |
60 |
61 |
62 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /panel/public/diy.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 自定义脚本 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 |
28 | 44 |
45 |

在线编辑工具

46 | 47 |
48 |
49 |

自定义脚本  温馨提示:此脚本的用途为收集并添加第三方作者编写的活动脚本,关于如何启用该功能详见配置文件中的《DIY脚本功能设置》模块。 50 |

51 |
52 | 53 |
54 |
55 |
56 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /panel/public/helpcode.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 手动互助码填写区域 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 |
25 | 41 |
42 |

在线对比合并工具

43 | 44 | 45 | 46 | 47 |
48 |

左侧为 sharecode.sh ,右侧为 sharecode.sh.sample

49 |
50 |
51 |
52 |
53 |
54 |

查看源文件,注意将浏览器编码切换为 UTF-8 。

55 | 59 |
60 |
61 |
62 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /panel/public/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 配置设定 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 | 45 |
46 |

在线编辑工具

47 | 48 |
49 |

配置文件  温馨提示:每次保存都会在 config/bak 目录下生成备份文件 50 |

51 |
52 | 53 |
54 |
55 |
56 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /panel/public/img/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/panel/public/img/banner.jpg -------------------------------------------------------------------------------- /panel/public/img/sky.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/panel/public/img/sky.jpg -------------------------------------------------------------------------------- /panel/public/index1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 在线登入 8 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 49 |
50 | 70 | 71 | 72 | 191 | -------------------------------------------------------------------------------- /panel/public/js/comment.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: https://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | var noOptions = {}; 15 | var nonWS = /[^\s\u00a0]/; 16 | var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos; 17 | 18 | function firstNonWS(str) { 19 | var found = str.search(nonWS); 20 | return found == -1 ? 0 : found; 21 | } 22 | 23 | CodeMirror.commands.toggleComment = function(cm) { 24 | cm.toggleComment(); 25 | }; 26 | 27 | CodeMirror.defineExtension("toggleComment", function(options) { 28 | if (!options) options = noOptions; 29 | var cm = this; 30 | var minLine = Infinity, ranges = this.listSelections(), mode = null; 31 | for (var i = ranges.length - 1; i >= 0; i--) { 32 | var from = ranges[i].from(), to = ranges[i].to(); 33 | if (from.line >= minLine) continue; 34 | if (to.line >= minLine) to = Pos(minLine, 0); 35 | minLine = from.line; 36 | if (mode == null) { 37 | if (cm.uncomment(from, to, options)) mode = "un"; 38 | else { cm.lineComment(from, to, options); mode = "line"; } 39 | } else if (mode == "un") { 40 | cm.uncomment(from, to, options); 41 | } else { 42 | cm.lineComment(from, to, options); 43 | } 44 | } 45 | }); 46 | 47 | // Rough heuristic to try and detect lines that are part of multi-line string 48 | function probablyInsideString(cm, pos, line) { 49 | return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line) 50 | } 51 | 52 | function getMode(cm, pos) { 53 | var mode = cm.getMode() 54 | return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos) 55 | } 56 | 57 | CodeMirror.defineExtension("lineComment", function(from, to, options) { 58 | if (!options) options = noOptions; 59 | var self = this, mode = getMode(self, from); 60 | var firstLine = self.getLine(from.line); 61 | if (firstLine == null || probablyInsideString(self, from, firstLine)) return; 62 | 63 | var commentString = options.lineComment || mode.lineComment; 64 | if (!commentString) { 65 | if (options.blockCommentStart || mode.blockCommentStart) { 66 | options.fullLines = true; 67 | self.blockComment(from, to, options); 68 | } 69 | return; 70 | } 71 | 72 | var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); 73 | var pad = options.padding == null ? " " : options.padding; 74 | var blankLines = options.commentBlankLines || from.line == to.line; 75 | 76 | self.operation(function() { 77 | if (options.indent) { 78 | var baseString = null; 79 | for (var i = from.line; i < end; ++i) { 80 | var line = self.getLine(i); 81 | var whitespace = line.slice(0, firstNonWS(line)); 82 | if (baseString == null || baseString.length > whitespace.length) { 83 | baseString = whitespace; 84 | } 85 | } 86 | for (var i = from.line; i < end; ++i) { 87 | var line = self.getLine(i), cut = baseString.length; 88 | if (!blankLines && !nonWS.test(line)) continue; 89 | if (line.slice(0, cut) != baseString) cut = firstNonWS(line); 90 | self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); 91 | } 92 | } else { 93 | for (var i = from.line; i < end; ++i) { 94 | if (blankLines || nonWS.test(self.getLine(i))) 95 | self.replaceRange(commentString + pad, Pos(i, 0)); 96 | } 97 | } 98 | }); 99 | }); 100 | 101 | CodeMirror.defineExtension("blockComment", function(from, to, options) { 102 | if (!options) options = noOptions; 103 | var self = this, mode = getMode(self, from); 104 | var startString = options.blockCommentStart || mode.blockCommentStart; 105 | var endString = options.blockCommentEnd || mode.blockCommentEnd; 106 | if (!startString || !endString) { 107 | if ((options.lineComment || mode.lineComment) && options.fullLines != false) 108 | self.lineComment(from, to, options); 109 | return; 110 | } 111 | if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return 112 | 113 | var end = Math.min(to.line, self.lastLine()); 114 | if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; 115 | 116 | var pad = options.padding == null ? " " : options.padding; 117 | if (from.line > end) return; 118 | 119 | self.operation(function() { 120 | if (options.fullLines != false) { 121 | var lastLineHasText = nonWS.test(self.getLine(end)); 122 | self.replaceRange(pad + endString, Pos(end)); 123 | self.replaceRange(startString + pad, Pos(from.line, 0)); 124 | var lead = options.blockCommentLead || mode.blockCommentLead; 125 | if (lead != null) for (var i = from.line + 1; i <= end; ++i) 126 | if (i != end || lastLineHasText) 127 | self.replaceRange(lead + pad, Pos(i, 0)); 128 | } else { 129 | var atCursor = cmp(self.getCursor("to"), to) == 0, empty = !self.somethingSelected() 130 | self.replaceRange(endString, to); 131 | if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to) 132 | self.replaceRange(startString, from); 133 | } 134 | }); 135 | }); 136 | 137 | CodeMirror.defineExtension("uncomment", function(from, to, options) { 138 | if (!options) options = noOptions; 139 | var self = this, mode = getMode(self, from); 140 | var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); 141 | 142 | // Try finding line comments 143 | var lineString = options.lineComment || mode.lineComment, lines = []; 144 | var pad = options.padding == null ? " " : options.padding, didSomething; 145 | lineComment: { 146 | if (!lineString) break lineComment; 147 | for (var i = start; i <= end; ++i) { 148 | var line = self.getLine(i); 149 | var found = line.indexOf(lineString); 150 | if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; 151 | if (found == -1 && nonWS.test(line)) break lineComment; 152 | if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; 153 | lines.push(line); 154 | } 155 | self.operation(function() { 156 | for (var i = start; i <= end; ++i) { 157 | var line = lines[i - start]; 158 | var pos = line.indexOf(lineString), endPos = pos + lineString.length; 159 | if (pos < 0) continue; 160 | if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; 161 | didSomething = true; 162 | self.replaceRange("", Pos(i, pos), Pos(i, endPos)); 163 | } 164 | }); 165 | if (didSomething) return true; 166 | } 167 | 168 | // Try block comments 169 | var startString = options.blockCommentStart || mode.blockCommentStart; 170 | var endString = options.blockCommentEnd || mode.blockCommentEnd; 171 | if (!startString || !endString) return false; 172 | var lead = options.blockCommentLead || mode.blockCommentLead; 173 | var startLine = self.getLine(start), open = startLine.indexOf(startString) 174 | if (open == -1) return false 175 | var endLine = end == start ? startLine : self.getLine(end) 176 | var close = endLine.indexOf(endString, end == start ? open + startString.length : 0); 177 | var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1) 178 | if (close == -1 || 179 | !/comment/.test(self.getTokenTypeAt(insideStart)) || 180 | !/comment/.test(self.getTokenTypeAt(insideEnd)) || 181 | self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1) 182 | return false; 183 | 184 | // Avoid killing block comments completely outside the selection. 185 | // Positions of the last startString before the start of the selection, and the first endString after it. 186 | var lastStart = startLine.lastIndexOf(startString, from.ch); 187 | var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); 188 | if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; 189 | // Positions of the first endString after the end of the selection, and the last startString before it. 190 | firstEnd = endLine.indexOf(endString, to.ch); 191 | var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); 192 | lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; 193 | if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; 194 | 195 | self.operation(function() { 196 | self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), 197 | Pos(end, close + endString.length)); 198 | var openEnd = open + startString.length; 199 | if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; 200 | self.replaceRange("", Pos(start, open), Pos(start, openEnd)); 201 | if (lead) for (var i = start + 1; i <= end; ++i) { 202 | var line = self.getLine(i), found = line.indexOf(lead); 203 | if (found == -1 || nonWS.test(line.slice(0, found))) continue; 204 | var foundEnd = found + lead.length; 205 | if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; 206 | self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); 207 | } 208 | }); 209 | return true; 210 | }); 211 | }); 212 | -------------------------------------------------------------------------------- /panel/public/js/jquery.base64.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jquery.base64.js 0.0.3 - https://github.com/yckart/jquery.base64.js 3 | * Makes Base64 en & -decoding simpler as it is. 4 | * 5 | * Based upon: https://gist.github.com/Yaffle/1284012 6 | * 7 | * Copyright (c) 2012 Yannick Albert (http://yckart.com) 8 | * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php). 9 | * 2013/02/10 10 | **/ 11 | ;(function($) { 12 | 13 | var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 14 | a256 = '', 15 | r64 = [256], 16 | r256 = [256], 17 | i = 0; 18 | 19 | var UTF8 = { 20 | 21 | /** 22 | * Encode multi-byte Unicode string into utf-8 multiple single-byte characters 23 | * (BMP / basic multilingual plane only) 24 | * 25 | * Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars 26 | * 27 | * @param {String} strUni Unicode string to be encoded as UTF-8 28 | * @returns {String} encoded string 29 | */ 30 | encode: function(strUni) { 31 | // use regular expressions & String.replace callback function for better efficiency 32 | // than procedural approaches 33 | var strUtf = strUni.replace(/[\u0080-\u07ff]/g, // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz 34 | function(c) { 35 | var cc = c.charCodeAt(0); 36 | return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f); 37 | }) 38 | .replace(/[\u0800-\uffff]/g, // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz 39 | function(c) { 40 | var cc = c.charCodeAt(0); 41 | return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f); 42 | }); 43 | return strUtf; 44 | }, 45 | 46 | /** 47 | * Decode utf-8 encoded string back into multi-byte Unicode characters 48 | * 49 | * @param {String} strUtf UTF-8 string to be decoded back to Unicode 50 | * @returns {String} decoded string 51 | */ 52 | decode: function(strUtf) { 53 | // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char! 54 | var strUni = strUtf.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, // 3-byte chars 55 | function(c) { // (note parentheses for precence) 56 | var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f); 57 | return String.fromCharCode(cc); 58 | }) 59 | .replace(/[\u00c0-\u00df][\u0080-\u00bf]/g, // 2-byte chars 60 | function(c) { // (note parentheses for precence) 61 | var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f; 62 | return String.fromCharCode(cc); 63 | }); 64 | return strUni; 65 | } 66 | }; 67 | 68 | while(i < 256) { 69 | var c = String.fromCharCode(i); 70 | a256 += c; 71 | r256[i] = i; 72 | r64[i] = b64.indexOf(c); 73 | ++i; 74 | } 75 | 76 | function code(s, discard, alpha, beta, w1, w2) { 77 | s = String(s); 78 | var buffer = 0, 79 | i = 0, 80 | length = s.length, 81 | result = '', 82 | bitsInBuffer = 0; 83 | 84 | while(i < length) { 85 | var c = s.charCodeAt(i); 86 | c = c < 256 ? alpha[c] : -1; 87 | 88 | buffer = (buffer << w1) + c; 89 | bitsInBuffer += w1; 90 | 91 | while(bitsInBuffer >= w2) { 92 | bitsInBuffer -= w2; 93 | var tmp = buffer >> bitsInBuffer; 94 | result += beta.charAt(tmp); 95 | buffer ^= tmp << bitsInBuffer; 96 | } 97 | ++i; 98 | } 99 | if(!discard && bitsInBuffer > 0) result += beta.charAt(buffer << (w2 - bitsInBuffer)); 100 | return result; 101 | } 102 | 103 | var Plugin = $.base64 = function(dir, input, encode) { 104 | return input ? Plugin[dir](input, encode) : dir ? null : this; 105 | }; 106 | 107 | Plugin.btoa = Plugin.encode = function(plain, utf8encode) { 108 | plain = Plugin.raw === false || Plugin.utf8encode || utf8encode ? UTF8.encode(plain) : plain; 109 | plain = code(plain, false, r256, b64, 8, 6); 110 | return plain + '===='.slice((plain.length % 4) || 4); 111 | }; 112 | 113 | Plugin.atob = Plugin.decode = function(coded, utf8decode) { 114 | coded = coded.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 115 | coded = String(coded).split('='); 116 | var i = coded.length; 117 | do {--i; 118 | coded[i] = code(coded[i], true, r64, a256, 6, 8); 119 | } while (i > 0); 120 | coded = coded.join(''); 121 | return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded; 122 | }; 123 | }(jQuery)); -------------------------------------------------------------------------------- /panel/public/js/prefixfree.min.js: -------------------------------------------------------------------------------- 1 | // StyleFix 1.0.1 & PrefixFree 1.0.4 / by Lea Verou / MIT license 2 | (function(){function f(a,b){return[].slice.call((b||document).querySelectorAll(a))}if(window.addEventListener){var b=window.StyleFix={link:function(a){try{if(!/\bstylesheet\b/i.test(a.rel)||!a.sheet.cssRules)return}catch(c){return}var d=a.href||a.getAttribute("data-href"),g=d.replace(/[^\/]+$/,""),e=a.parentNode,h=new XMLHttpRequest;h.open("GET",d);h.onreadystatechange=function(){if(h.readyState===4){var c=h.responseText;if(c&&a.parentNode){c=b.fix(c,true,a);g&&(c=c.replace(/url\((?:'|")?(.+?)(?:'|")?\)/gi, 3 | function(a,c){return!/^([a-z]{3,10}:|\/)/i.test(c)?'url("'+g+c+'")':a}),c=c.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+g,"gi"),"$1"));var d=document.createElement("style");d.textContent=c;d.media=a.media;d.disabled=a.disabled;d.setAttribute("data-href",a.getAttribute("href"));e.insertBefore(d,a);e.removeChild(a)}}};h.send(null);a.setAttribute("data-inprogress","")},styleElement:function(a){var c=a.disabled;a.textContent=b.fix(a.textContent,true,a);a.disabled=c},styleAttribute:function(a){var c= 4 | a.getAttribute("style"),c=b.fix(c,false,a);a.setAttribute("style",c)},process:function(){f('link[rel~="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);f("style").forEach(StyleFix.styleElement);f("[style]").forEach(StyleFix.styleAttribute)},register:function(a,c){(b.fixers=b.fixers||[]).splice(c===void 0?b.fixers.length:c,0,a)},fix:function(a,c){for(var d=0;d-1){var e=b.split("-"); 8 | if(b.charAt(0)==="-"){var b=e[1],f=++a[b]||1;a[b]=f;for(d3;)e.pop(),f=e.join("-"),StyleFix.camelCase(f)in h&&(b=g,b.indexOf(f)===-1&&b.push(f))}}};if(e.length>0)for(var i=0;i 1) stream.eat('$'); 130 | var ch = stream.next() 131 | if (/['"({]/.test(ch)) { 132 | state.tokens[0] = tokenString(ch, ch == "(" ? "quote" : ch == "{" ? "def" : "string"); 133 | return tokenize(stream, state); 134 | } 135 | if (!/\d/.test(ch)) stream.eatWhile(/\w/); 136 | state.tokens.shift(); 137 | return 'def'; 138 | }; 139 | 140 | function tokenHeredoc(delim) { 141 | return function(stream, state) { 142 | if (stream.sol() && stream.string == delim) state.tokens.shift() 143 | stream.skipToEnd() 144 | return "string-2" 145 | } 146 | } 147 | 148 | function tokenize(stream, state) { 149 | return (state.tokens[0] || tokenBase) (stream, state); 150 | }; 151 | 152 | return { 153 | startState: function() {return {tokens:[]};}, 154 | token: function(stream, state) { 155 | return tokenize(stream, state); 156 | }, 157 | closeBrackets: "()[]{}''\"\"``", 158 | lineComment: '#', 159 | fold: "brace" 160 | }; 161 | }); 162 | 163 | CodeMirror.defineMIME('text/x-sh', 'shell'); 164 | // Apache uses a slightly different Media Type for Shell scripts 165 | // http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types 166 | CodeMirror.defineMIME('application/x-sh', 'shell'); 167 | 168 | }); 169 | -------------------------------------------------------------------------------- /panel/public/js/skel.min.js: -------------------------------------------------------------------------------- 1 | /* skel.js v3.0.0-dev | (c) n33 | skel.io | MIT licensed */ 2 | var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),t.indexOf=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},t.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},t.iterate=Object.keys?function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},t.matchesMedia=window.matchMedia?function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;n=t.split(/\s+and\s+/);for(a in n)e=n[a],"("==e.charAt(0)&&(e=e.substring(1,e.length-1),i=e.split(/:\s+/),2==i.length&&(r[i[0].replace(/^\s+|\s+$/g,"")]=parseInt(i[1]),o=!0));if(!o)return!1;var s=document.documentElement.clientWidth,c=document.documentElement.clientHeight;return null!==r["min-width"]&&sr["max-width"]||null!==r["min-height"]&&cr["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML=' ",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["wp",/Windows Phone ([0-9\.]+)/,null],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel}); -------------------------------------------------------------------------------- /panel/public/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 控制面板 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 158 | 159 | 160 | 161 |
162 |
163 |
164 |
165 |

JS-TOOL面板

166 | 176 |

or, your can watch on

177 | 182 |
183 |

Copyright 2021

184 | 185 |
186 |
187 |
188 |
189 | 190 | 191 | 192 | 194 | 195 | 196 | 197 | 223 | 224 | -------------------------------------------------------------------------------- /panel/public/pwd.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 修改密码 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 | 37 | 45 |
46 |
47 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /panel/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: Baiduspider 2 | Disallow: / 3 | User-agent: Sosospider 4 | Disallow: / 5 | User-agent: sogou spider 6 | Disallow: / 7 | User-agent: YodaoBot 8 | Disallow: / 9 | User-agent: Googlebot 10 | Disallow: / 11 | User-agent: Bingbot 12 | Disallow: / 13 | User-agent: Slurp 14 | Disallow: / 15 | Disallow: / 16 | -------------------------------------------------------------------------------- /panel/public/run.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 手动执行脚本 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 | 42 |
43 |

脚本执行工具

44 |
45 | 46 | 47 | 48 | 49 | 50 |
51 |
52 |
53 |
54 | 55 |
56 | 57 |  

58 | 温馨提示:只能手动执行的活动名,执行其他请进入终端操作。若执行活动脚本期间卡住或想停止运行,刷新页面即可。 59 |

60 |
61 |
62 |
63 |   64 |
65 | 66 |
67 |
68 |
69 | 246 | 247 | 248 | 249 | 250 | -------------------------------------------------------------------------------- /panel/public/tasklog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 日志查询 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 | 44 |
45 | 47 |

日志查询

48 | 49 |
50 |
51 | 52 |
53 | 64 |
65 |
66 | 67 |
68 |
69 |
70 |
71 |
72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /panel/public/terminal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | WebSHELL · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 | 31 |
32 |
33 | 34 |
35 |
36 |
37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /panel/public/usrconfig.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 用户设定 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 | 45 |
46 |

在线编辑工具

47 | 49 | 50 | 51 | 54 | 55 |
56 |

配置文件  温馨提示:每次保存都会在 config/bak 目录下生成备份文件 57 |

58 |
59 | 60 |
61 |
62 |
63 | 76 | 237 | 238 | 239 | 240 | 241 | -------------------------------------------------------------------------------- /panel/public/viewScripts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 查看脚本 · JS-TOOL 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 | 44 |
45 | 47 |

查看脚本

48 | 49 |
50 |
51 | 52 |
53 | 64 |
65 |
66 | 67 |
68 |
69 |
70 |
71 |
72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /repair.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## Author: lan-tianxiang 4 | ## Source: https://github.com/lan-tianxiang/js_tool 5 | ## Modified: 2021-03-27 6 | ## Version: v0.0.2 7 | 8 | dir_shell=$(dirname $(readlink -f "$0")) 9 | dir_root=$dir_shell 10 | dir_config=$dir_root/config 11 | file_cookie=$dir_config/cookie.sh 12 | [ -f /proc/1/cgroup ] && [[ -n $(cat /proc/1/cgroup | grep cpuset | grep scope) ]] && echo "docker无法使用此命令,抱歉" && exit 0 13 | [ -s $file_cookie ] && cp $file_cookie $(dirname $dir_shell)/cookie.sh && echo "备份cookie成功" 14 | pkill -9 node 15 | bash $dir_shell/jd.sh paneloff 16 | crontab -r 17 | rm -rf $dir_shell 18 | cd $(dirname $dir_shell) 19 | 20 | function REINSTALLATION() { 21 | echo -e "\n1. 获取源码" 22 | 23 | git clone https://gitee.com/highdimen/js_tool.git $dir_shell 24 | 25 | echo -e "\n2. 还原配置文件" 26 | mkdir -p $dir_config 27 | [ -f $(dirname $dir_shell)/cookie.sh ] && cp -rf $(dirname $dir_shell)/cookie.sh $file_cookie && rm -rf $(dirname $dir_shell)/cookie.sh && echo "还原配置文件成功" 28 | [ ! -f $dir_shell/config/config.sh ] && cp -f $dir_shell/sample/config.sh.sample $dir_shell/config/config.sh 29 | [ ! -f $dir_shell/config/cookie.sh ] && cp -f $dir_shell/sample/cookie.sh.sample $dir_shell/config/cookie.sh 30 | [ ! -f $dir_shell/config/crontab.list ] && cp -f $$dir_shell/sample/crontab.list.sample $dir_shell/config/crontab.list 31 | [ ! -f $dir_shell/config/sharecode.sh ] && cp -f $dir_shell/sample/sharecode.sh.sample $dir_shell/config/sharecode.sh 32 | 33 | echo -e "\n3. 执行脚本更新以及定时文件更新" 34 | npm config set registry https://registry.npm.taobao.org 35 | bash $dir_shell/jd.sh update 36 | 37 | echo -e "\n修复完成!!!!" 38 | } 39 | 40 | REINSTALLATION 41 | -------------------------------------------------------------------------------- /resource/encrypto/JD_PIN_HASH.key: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resource/install_scripts/Qunhui_docker_install_jd.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # 以 Docker 容器的方式一键安装 jd-base。 4 | # 5 | clear 6 | 7 | DockerImage="lantianxiang1/js_tool:A1" 8 | ShellName=$0 9 | ShellDir=$(cd "$(dirname "$0")";pwd) 10 | ContainerName="" 11 | PanelPort="" 12 | WorkDir="${ShellDir}/jd-docker-workdir" 13 | JdDir="" 14 | ConfigDir="" 15 | LogDir="" 16 | ScriptsDir="" 17 | 18 | GetImageType="Online" 19 | HasImage=false 20 | NewImage=true 21 | DelContainer=false 22 | 23 | NeedDirConfig="" 24 | NeedDirLog="" 25 | NeedDirScripts="" 26 | 27 | log() { 28 | echo -e "\e[32m$1 \e[0m" 29 | } 30 | 31 | inp() { 32 | echo -e "\e[33m$1 \e[0m" 33 | } 34 | 35 | warn() { 36 | echo -e "\e[31m$1 \e[0m" 37 | } 38 | 39 | HasImage=true 40 | DelContainer=true 41 | ContainerName="jd" 42 | PanelPort="5678" 43 | NeedDirConfig='' 44 | NeedDirLog='' 45 | 46 | # 47 | # 配置信息收集完成,开始安装 48 | # 49 | 50 | if [ $NewImage = true ]; then 51 | log "\n正在获取新镜像..." 52 | if [ $HasImage = true ]; then 53 | docker stop jd 54 | docker rm jd 55 | docker rmi $(docker images lantianxiang1/js_tool -q) 56 | fi 57 | if [ $GetImageType = "Local" ]; then 58 | rm -rf $WorkDir 59 | mkdir -p $WorkDir 60 | wget -q https://gitee.com/highdimen/js_tool/raw/A1/docker/docker/Dockerfile -O $WorkDir/Dockerfile 61 | sed -i 's,github.com,github.com.cnpmjs.org,g' $WorkDir/Dockerfile 62 | sed -i 's,npm install,npm install --registry=https://registry.npm.taobao.org,g' $WorkDir/Dockerfile 63 | docker build -t $DockerImage $WorkDir > $ShellDir/build_jd_image.log 64 | rm -fr $WorkDir 65 | else 66 | docker pull $DockerImage 67 | fi 68 | fi 69 | 70 | if [ $DelContainer = true ]; then 71 | log "\n2.2.删除先前的容器" 72 | docker stop $ContainerName > /dev/null 73 | docker rm $ContainerName > /dev/null 74 | fi 75 | 76 | clear 77 | 78 | log "\n创建容器并运行" 79 | docker run -dit \ 80 | $NeedDirConfig \ 81 | $NeedDirLog \ 82 | $NeedDirScripts \ 83 | -p $PanelPort:5678 \ 84 | --name $ContainerName \ 85 | --hostname jd \ 86 | --restart always \ 87 | $DockerImage 88 | 89 | log "\n下面列出所有容器" 90 | docker ps 91 | 92 | log "\n安装已经完成。\n请访问 http://:${PanelPort} 进行配置\n初始用户名:admin,初始密码:adminadmin" 93 | rm -f $ShellDir/$ShellName 94 | echo "进入容器命令为########docker exec -it jd /bin/bash" 95 | -------------------------------------------------------------------------------- /resource/install_scripts/docker_install_jd.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # 以 Docker 容器的方式一键安装 jd-base。 4 | # 5 | clear 6 | 7 | DockerImage="lantianxiang1/js_tool:A1" 8 | ShellName=$0 9 | ShellDir=$(cd "$(dirname "$0")";pwd) 10 | ContainerName="" 11 | PanelPort="" 12 | WorkDir="${ShellDir}/jd-docker-workdir" 13 | JdDir="" 14 | ConfigDir="" 15 | LogDir="" 16 | ScriptsDir="" 17 | 18 | GetImageType="Online" 19 | HasImage=false 20 | NewImage=true 21 | DelContainer=false 22 | 23 | NeedDirConfig="" 24 | NeedDirLog="" 25 | NeedDirScripts="" 26 | 27 | log() { 28 | echo -e "\e[32m$1 \e[0m" 29 | } 30 | 31 | inp() { 32 | echo -e "\e[33m$1 \e[0m" 33 | } 34 | 35 | warn() { 36 | echo -e "\e[31m$1 \e[0m" 37 | } 38 | 39 | 40 | # 检查 Docker 环境 41 | Install_Docker() { 42 | if [ -x "$(command -v docker)" ]; then 43 | log "Docker 已安装!" 44 | else 45 | warn "请自行安装好 Docker !" 46 | exit 1 47 | fi 48 | } 49 | Install_Docker 50 | 51 | warn "\n注意如果你什么都不清楚,建议所有选项都直接回车,使用默认选择!!!\n" 52 | 53 | # 54 | # 收集配置信息 55 | # 56 | 57 | # 选择镜像获取方式 58 | Choose_GetImageType() { 59 | inp "\n选择镜像获取方式:\n1) 在线获取[默认]\n2 本地生成) " 60 | echo -n -e "\e[33m输入您的选择->\e[0m" 61 | read update 62 | if [ "$update" = "2" ]; then 63 | GetImageType="Local" 64 | fi 65 | } 66 | 67 | # 检测镜像是否存在 68 | Check_Image() { 69 | if [ ! -z "$(docker images -q $DockerImage 2> /dev/null)" ]; then 70 | HasImage=true 71 | inp "检测到先前已经存在的镜像,是否创建新的镜像:\n1) 是[默认]\n2) 不需要" 72 | echo -n -e "\e[33m输入您的选择->\e[0m" 73 | read update 74 | if [ "$update" = "2" ]; then 75 | NewImage=false 76 | else 77 | Choose_GetImageType 78 | fi 79 | else 80 | Choose_GetImageType 81 | fi 82 | } 83 | Check_Image 84 | 85 | # 检测容器是否存在 86 | Check_ContainerName() { 87 | if [ ! -z "$(docker ps -a --format "{{.Names}}" | grep -w $ContainerName 2> /dev/null)" ]; then 88 | inp "\n检测到先前已经存在的容器,是否删除先前的容器:\n1) 是[默认]\n2) 不要" 89 | echo -n -e "\e[33m输入您的选择->\e[0m" 90 | read update 91 | if [ "$update" = "2" ]; then 92 | log "选择了不删除先前的容器,需要重新输入容器名称" 93 | Input_ContainerName 94 | else 95 | DelContainer=true 96 | fi 97 | fi 98 | } 99 | 100 | # 输入容器名称 101 | Input_ContainerName() { 102 | echo -n -e "\n\e[33m请输入要创建的Docker容器名称[默认为:jd]->\e[0m" 103 | read container_name 104 | if [ -z "$container_name" ]; then 105 | ContainerName="jd" 106 | else 107 | ContainerName=$container_name 108 | fi 109 | Check_ContainerName 110 | } 111 | Input_ContainerName 112 | 113 | # 输入端口号 114 | Input_PanelPort() { 115 | echo -n -e "\n\e[33m请输入控制面板端口号[默认为:5678]->\e[0m" 116 | read panel_port 117 | if [ -z "$panel_port" ]; then 118 | PanelPort="5678" 119 | else 120 | PanelPort=$panel_port 121 | fi 122 | inp "如发现端口冲突,请自行检查端口占用情况!" 123 | } 124 | Input_PanelPort 125 | 126 | 127 | 128 | # 输入端口号 129 | Input_NotworkType() { 130 | inp "\ndocker网络模式\n1) brindge[默认]\n2) host" 131 | echo -n -e "\e[33m输入您的选择->\e[0m" 132 | read NotworkType 133 | if [ "$NotworkType" = "2" ]; then 134 | NotworkType="host" 135 | else 136 | NotworkType="bridge" 137 | fi 138 | } 139 | Input_NotworkType 140 | 141 | 142 | 143 | # 配置文件目录 144 | 145 | Need_ConfigDir() { 146 | inp "\n是否需要映射配置文件目录:\n1) 是[默认]\n2) 否" 147 | echo -n -e "\e[33m输入您的选择->\e[0m" 148 | read need_config_dir 149 | if [ "$need_config_dir" = "2" ]; then 150 | NeedDirConfig='' 151 | else 152 | NeedDirConfig="-v $ConfigDir:/root/jd/config" 153 | echo -e "\n\e[33m如果有用于存放配置文件的远程 Git 仓库,请输入地址,否则直接回车(看不懂也回车):\e[0m" 154 | read remote_config 155 | if [ -n "$remote_config" ]; then 156 | git clone $remote_config ${JdDir}/config 157 | else 158 | mkdir -p $ConfigDir 159 | fi 160 | fi 161 | } 162 | 163 | Need_LogDir() { 164 | inp "\n是否需要映射日志文件目录:\n1) 是[默认]\n2) 否" 165 | echo -n -e "\e[33m输入您的选择->\e[0m" 166 | read need_log_dir 167 | if [ "$need_log_dir" = "2" ]; then 168 | NeedDirLog='' 169 | else 170 | NeedDirLog="-v $LogDir:/root/jd/log" 171 | mkdir -p $LogDir 172 | fi 173 | } 174 | 175 | Need_ScriptsDir() { 176 | inp "\n是否需要映射js脚本目录:\n1) 是\n2) 否[默认]" 177 | echo -n -e "\e[33m输入您的选择->\e[0m" 178 | read need_scripts_dir 179 | if [ "$need_scripts_dir" = "1" ]; then 180 | NeedDirScripts="-v $ScriptsDir:/root/jd/scripts" 181 | mkdir -p $ScriptsDir 182 | fi 183 | } 184 | 185 | Need_Dir() { 186 | inp "\n是否需要映射文件目录:\n1) 是[默认]\n2) 否" 187 | echo -n -e "\e[33m输入您的选择->\e[0m" 188 | read need_dir 189 | if [ "$need_dir" = "2" ]; then 190 | log "选择了不映射文件目录" 191 | else 192 | echo -e "\n\e[33m请输入配置文件保存的绝对路径,直接回车为 $ShellDir/jd-docker :\e[0m" 193 | read jd_dir 194 | if [ -z "$jd_dir" ]; then 195 | JdDir=$ShellDir/jd-docker 196 | else 197 | JdDir=$jd_dir 198 | fi 199 | ConfigDir=$JdDir/config 200 | LogDir=$JdDir/log 201 | ScriptsDir=$JdDir/scripts 202 | Need_ConfigDir 203 | Need_LogDir 204 | Need_ScriptsDir 205 | fi 206 | } 207 | Need_Dir 208 | 209 | # 210 | # 配置信息收集完成,开始安装 211 | # 212 | 213 | if [ $NewImage = true ]; then 214 | log "\n正在获取新镜像..." 215 | if [ $HasImage = true ]; then 216 | docker stop jd 217 | docker rm jd 218 | docker rmi $(docker images lantianxiang1/js_tool -q) -f 219 | fi 220 | if [ $GetImageType = "Local" ]; then 221 | rm -rf $WorkDir 222 | mkdir -p $WorkDir 223 | wget -q https://gitee.com/highdimen/js_tool/raw/A1/docker/docker/Dockerfile -O $WorkDir/Dockerfile 224 | sed -i 's,github.com,github.com.cnpmjs.org,g' $WorkDir/Dockerfile 225 | sed -i 's,npm install,npm install --registry=https://registry.npm.taobao.org,g' $WorkDir/Dockerfile 226 | docker build -t $DockerImage $WorkDir > $ShellDir/build_jd_image.log 227 | rm -fr $WorkDir 228 | else 229 | docker pull $DockerImage 230 | fi 231 | fi 232 | 233 | if [ $DelContainer = true ]; then 234 | log "\n2.2.删除先前的容器" 235 | docker stop $ContainerName > /dev/null 236 | docker rm $ContainerName > /dev/null 237 | fi 238 | 239 | clear 240 | 241 | log "\n创建容器并运行" 242 | docker run -dit \ 243 | $NeedDirConfig \ 244 | $NeedDirLog \ 245 | $NeedDirScripts \ 246 | -p $PanelPort:5678 \ 247 | --name $ContainerName \ 248 | --hostname jd \ 249 | --network $NotworkType \ 250 | --restart always \ 251 | $DockerImage 252 | 253 | log "\n下面列出所有容器" 254 | docker ps 255 | 256 | log "\n安装已经完成。\n请访问 http://:${PanelPort} 进行配置\n初始用户名:admin,初始密码:adminadmin" 257 | rm -f $ShellDir/$ShellName 258 | echo "进入容器命令为########docker exec -it jd /bin/bash" 259 | -------------------------------------------------------------------------------- /resource/install_scripts/linux_install_jd.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | clear 3 | echo -e "\n" 4 | echo -e "\n开始部署jd_shell\n" 5 | 6 | ShellName=$0 7 | dir_shell=$(dirname $(readlink -f "$0")) 8 | JdDir=$dir_shell/jd 9 | 10 | ## 判断使用系统 11 | detect_system() { 12 | SYSTEM=UnKnow 13 | [[ -n $(uname -a | grep Android) ]] && SYSTEM=Android 14 | [[ -n $(uname -s | grep Darwin) ]] && SYSTEM=Macos 15 | [[ -n $(ls /etc | grep lsb-release) ]] && SYSTEM=Ubuntu 16 | [[ -n $(ls /etc | grep debian_version) ]] && SYSTEM=Debian 17 | [[ -n $(ls /etc | grep redhat-release) ]] && SYSTEM=Centos 18 | [ -s /proc/1/cgroup ] && [[ -n $(cat /proc/1/cgroup | grep cpuset | grep scope) ]] && SYSTEM=Docker 19 | [ -s /proc/version ] && [[ -n $(cat /proc/version | grep Openwar) ]] && SYSTEM=Openwar 20 | } 21 | 22 | Welcome() { 23 | echo -e '#####################################################' 24 | echo -e "\n正在为您安装环境(依赖):\ngit wget curl perl moreutils node.js yarn/npm\n" 25 | echo -e '#####################################################' 26 | echo -e "除了安卓,由于其它系统安装软件可能需要使用sudo,本脚本除安装环境外不会调用再次任何root的执行权限\n" 27 | echo -e "若担心安全风险,可选择自行安装环境!!\n" 28 | echo -e '#####################################################' 29 | echo -e "检测到系统似乎为 $SYSTEM ,请输入你的系统对应序号 :\n" 30 | echo -e "1 debian/ubuntu/armbian/OpenMediaVault,以及其他debian系\n" 31 | echo -e "2 CentOS/RedHat/Fedora等红帽系\n" 32 | echo -e "3 Termux为主的安卓系\n" 33 | echo -e "4 环境已安装,直接开始部署脚本\n" 34 | echo -e "5 自己手动安装环境(退出)\n" 35 | echo -e "时间$(date +%Y-%m-%d) $(date +%H:%M)" 36 | echo -e '' 37 | echo -e '#####################################################' 38 | echo -e '' 39 | read -n1 LINUX_TYPE 40 | case $LINUX_TYPE in 41 | 1) 42 | echo " debian/ubuntu/armbian/OpenMediaVault,以及其他debian系" 43 | curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - 44 | echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list 45 | sudo apt update && sudo apt install -y git wget curl perl yarn npm 46 | if [ ! -x "$(command -v node)" ] || [ ! -x "$(command -v npm)" ] || [ ! -x "$(command -v git)" ] || [ ! -x "$(command -v curl)" ] || [ ! -x "$(command -v wget)" ] || [ ! -x "$(command -v perl)" ]; then 47 | echo -e "\n依赖未安装完整,请重新运行该脚本且切换良好的网络环境!\n" 48 | exit 1 49 | else 50 | echo -e "\n依赖安装完成,开始部署脚本,否则按 Ctrl + C 退出!\n" 51 | INSTALLATION_CLONE 52 | TG_BOT 53 | fi 54 | ;; 55 | 2) 56 | echo " CentOS/RedHat/Fedora等红帽系" 57 | curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo 58 | sudo yum -y update && sudo yum -y install git wget curl perl yarn npm 59 | if [ ! -x "$(command -v node)" ] || [ ! -x "$(command -v npm)" ] || [ ! -x "$(command -v git)" ] || [ ! -x "$(command -v curl)" ] || [ ! -x "$(command -v wget)" ] || [ ! -x "$(command -v perl)" ]; then 60 | echo -e "\n依赖未安装完整,请重新运行该脚本且切换良好的网络环境!\n" 61 | exit 1 62 | else 63 | echo -e "\n依赖安装完成,开始部署脚本,否则按 Ctrl + C 退出!\n" 64 | INSTALLATION_CLONE 65 | TG_BOT 66 | fi 67 | ;; 68 | 3) 69 | echo " Termux为主的安卓系" 70 | pkg update -y && pkg install -y git perl nodejs-lts yarn wget curl nano cronie 71 | if [ ! -x "$(command -v node)" ] || [ ! -x "$(command -v npm)" ] || [ ! -x "$(command -v git)" ] || [ ! -x "$(command -v curl)" ] || [ ! -x "$(command -v wget)" ] || [ ! -x "$(command -v perl)" ]; then 72 | echo -e "\n依赖未安装完整,请重新运行该脚本且切换良好的网络环境!\n" 73 | exit 1 74 | else 75 | echo -e "\n依赖安装完成,开始部署脚本,否则按 Ctrl + C 退出!\n" 76 | INSTALLATION_CLONE 77 | TG_BOT 78 | fi 79 | ;; 80 | 4) 81 | echo " 已安装(继续)" 82 | if [ ! -x "$(command -v node)" ] || [ ! -x "$(command -v git)" ] || [ ! -x "$(command -v curl)" ] || [ ! -x "$(command -v wget)" ] || [ ! -x "$(command -v perl)" ]; then 83 | echo -e "\n依赖未安装完整!\n" 84 | exit 1 85 | else 86 | echo -e "\n依赖已安装,开始部署脚本,否则按 Ctrl + C 退出!\n" 87 | INSTALLATION_CLONE 88 | TG_BOT 89 | fi 90 | ;; 91 | *) 92 | echo " 自己手动安装环境(退出)" 93 | ;; 94 | esac 95 | } 96 | 97 | INSTALLATION_CLONE() { 98 | echo -e "\n1. 获取源码" 99 | [ -d $JdDir ] && mv $JdDir $JdDir.bak && echo "检测到已有 $JdDir 目录,已备份为 $JdDir.bak" 100 | git clone -b A1 https://gitee.com/highdimen/js_tool.git $JdDir 101 | 102 | echo -e "\n2. 配置文件" 103 | crontab -l >$JdDir/old_crontab 104 | npm config set registry https://registry.npm.taobao.org 105 | echo -e "\n3. 执行 git_pull.sh 进行脚本更新以及定时文件更新" 106 | mkdir $JdDir/config 107 | [ ! -f $JdDir/config/config.sh ] && cp -f $JdDir/sample/config.sh.sample $JdDir/config/config.sh 108 | [ ! -f $JdDir/config/cookie.sh ] && cp -f $JdDir/sample/cookie.sh.sample $JdDir/config/cookie.sh 109 | [ ! -f $JdDir/config/crontab.list ] && cp -f $JdDir/sample/crontab.list.sample $JdDir/config/crontab.list 110 | [ ! -f $JdDir/config/sharecode.sh ] && cp -f $JdDir/sample/sharecode.sh.sample $JdDir/config/sharecode.sh 111 | bash $JdDir/jd.sh update 112 | 113 | echo -e "\n注意:原有定时任务已备份在 $JdDir/old_crontab" 114 | rm -f $dir_shell/${ShellName} 115 | 116 | echo -e "\n安装完成!!!!" 117 | } 118 | 119 | TG_BOT() { 120 | echo -e "\n 是否启用TG机器人功能,需额外占据200mb左右的空间,可能出现占用较大运行内存,cpu资源加重等情况" 121 | echo -e "\n 任意键暂不启用,后续仍可以开启。输入 1 现在开启。" 122 | read -n1 PY_TYPE 123 | case $PY_TYPE in 124 | 1) 125 | case $LINUX_TYPE in 126 | 1) 127 | sudo apt install -y python3 gcc 128 | ;; 129 | 2) 130 | sudo yum install -y python3 gcc 131 | ;; 132 | 3) 133 | pkg install -y python3 gcc 134 | ;; 135 | esac 136 | ;; 137 | *) 138 | exit 0 139 | ;; 140 | esac 141 | } 142 | detect_system 143 | Welcome 144 | -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.aarch64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.aarch64 -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.arm -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.armhf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.armhf -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.i686: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.i686 -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.mips: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.mips -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.mips64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.mips64 -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.mips64el: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.mips64el -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.mipsel: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.mipsel -------------------------------------------------------------------------------- /resource/webshellbinary/ttyd.x86_64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lan-tianxiang/JS_TOOL/cda35e5cad13a2b717d18998351372f88f9657ec/resource/webshellbinary/ttyd.x86_64 -------------------------------------------------------------------------------- /sample/auth.json.sample: -------------------------------------------------------------------------------- 1 | {"user":"admin","password":"adminadmin"} -------------------------------------------------------------------------------- /sample/bot.json.sample: -------------------------------------------------------------------------------- 1 | { 2 | "user_id": "你的USERID,去除双引号", 3 | "bot_token": "你的机器人TOKEN", 4 | "api_id": "https://my.telegram.org 在该网站申请到的id", 5 | "api_hash": "https://my.telegram.org 在该网站申请到的hash", 6 | "proxy": "是否使用代理,true 或者false,去除双引号", 7 | "proxy_type": "socks5或者http或者https", 8 | "proxy_add": "代理IP地址例如:192.168.99.100", 9 | "proxy_port": "代理端口,不需要双引号例如 5890", 10 | "StartCMD": "是否开启CMD命令,建议填false,开启填true,去除双引号" 11 | } -------------------------------------------------------------------------------- /sample/cookie.sh.sample: -------------------------------------------------------------------------------- 1 | ################################## 定义Cookie(必填) ################################## 2 | ## 请依次填入每个用户的Cookie,Cookie的具体形式(只有pt_key字段和pt_pin字段,没有其他字段):pt_key=xxxxxxxxxx;pt_pin=xxxx; 3 | ## 1. 如果是通过控制面板编辑本文件,点击页面上方“扫码获取Cookie”即可获取,此方式获取的Cookie有效期为1个月 4 | ## 2. 还可以通过浏览器开发工具获取,此方式获得的Cookie也为1个月有效期,教程:https://github.com/LXK9301/jd_scripts/wiki/GetCookies 5 | ## 必须按数字顺序1、2、3、4...依次编号下去,例子只有6个,超出6个你继续往下编号即可 6 | ## 不允许有汉字,如果ID有汉字,请在PC浏览器上获取Cookie,会自动将汉字转换为URL编码 7 | Cookie1="pt_key=xxxxxxxxxx;pt_pin=xxxx;" 8 | Cookie2="" 9 | Cookie3="" 10 | 11 | 12 | ################################## 临时屏蔽某个Cookie(选填) ################################## 13 | ## 如果某些Cookie已经失效了,但暂时还没法更新,可以使用此功能在不删除该Cookie和重新修改Cookie编号的前提下,临时屏蔽掉某些编号的Cookie 14 | ## 多个Cookie编号以半角的空格分隔,两侧一对半角双引号,使用此功能后,在运行js脚本时账户编号将发生变化 15 | ## 举例1:TempBlockCookie="2" 临时屏蔽掉Cookie2 16 | ## 举例2:TempBlockCookie="2 4" 临时屏蔽掉Cookie2和Cookie4 17 | 18 | ## 如果只是想要屏蔽某个账号不玩某些小游戏,可以参考下面 case 这个命令的例子来控制,脚本名称请去掉后缀 “.js” 19 | ## case $1 in 20 | ## jd_fruit) 21 | ## TempBlockCookie="5" # 账号5不玩东东农场 22 | ## ;; 23 | ## jd_dreamFactory | jd_jdfactory) 24 | ## TempBlockCookie="2" # 账号2不玩京喜工厂和东东工厂 25 | ## ;; 26 | ## jd_jdzz | jd_joy) 27 | ## TempBlockCookie="3 6" # 账号3、账号6不玩京东赚赚和宠汪汪 28 | ## ;; 29 | ## esac -------------------------------------------------------------------------------- /sample/crontab.list.sample: -------------------------------------------------------------------------------- 1 | ENV_PATH= 2 | 3 | # 更新所有脚本(包括自用thirdpard脚本) 4 | 22 * * * * JDRUN update >> ROOT_DIR/log/CMD_JD.log 2>&1 5 | 6 | # 删除 RmLogDaysAgo 指定天数以前的旧日志,本行为不记录日志: 7 | 57 13 * * * JDRUN clean 8 | 9 | # 导出所有互助码清单,日志在log/helpcode下 10 | 48 * * * * JDRUN myhelp 11 | 12 | # 重启挂机程序 13 | # 33 13 * * * JDRUN hangup 14 | 15 | # DIY任务区域 16 | # 需自行将脚本放在scripts文件夹下 17 | # 8 5 * * * thirdpard jd_live.js 18 | 19 | # thirdpard任务区域 20 | # 定时区域thirdpard开始,误删 21 | # 定时区域thirdpard结束,误删 22 | 23 | 24 | 25 | # jd任务区域,运行jd_scripts脚本,仅列出长期任务作初始化用,AutoAddCron=true时,将自动添加短期任务。 26 | # 请保留任务名称中的前缀"jd_",去掉后缀".js",如果有些任务你不想运行,注释掉就好了,不要删除。 27 | # 非lxk0301/jd_scripts仓库中的脚本请使用jd命令,不要使用jd命令。请在最后保留一个空行。 28 | -------------------------------------------------------------------------------- /sample/sharecode.sh.sample: -------------------------------------------------------------------------------- 1 | # ---------------------------------- 互 助 码 填 写 示 例 ---------------------------------- 2 | 3 | ################################## 互助码填法示例 ################################## 4 | ## **互助码是填在My系列变量中的,ForOther系统变量中只要填入My系列的变量名即可,按注释中的例子拼接,以东东农场为例,如下所示。** 5 | ## **实际上东东农场一个账号只能给别人助力3次,我多写的话,只有前几个会被助力。但如果前面的账号获得的助力次数已经达到上限了,那么还是会尝试继续给余下的账号助力,所以多填也是有意义的。** 6 | ## **ForOther系列变量必须从1开始编号,依次编下去。** 7 | 8 | # MyFruit1="e6e04602d5e343258873af1651b603ec" # 这是Cookie1这个账号的互助码 9 | # MyFruit2="52801b06ce2a462f95e1d59d7e856ef4" # 这是Cookie2这个账号的互助码 10 | # MyFruit3="e2fd1311229146cc9507528d0b054da8" # 这是Cookie3这个账号的互助码 11 | # MyFruit4="6dc9461f662d490991a31b798f624128" # 这是Cookie4这个账号的互助码 12 | # MyFruit5="30f29addd75d44e88fb452bbfe9f2110" # 这是Cookie5这个账号的互助码 13 | # MyFruit6="1d02fc9e0e574b4fa928e84cb1c5e70b" # 这是Cookie6这个账号的互助码 14 | # MyFruitA="5bc73a365ff74a559bdee785ea97fcc5" # 这是我和别人交换互助,另外一个用户A的互助码 15 | # MyFruitB="6d402dcfae1043fba7b519e0d6579a6f" # 这是我和别人交换互助,另外一个用户B的互助码 16 | # MyFruitC="5efc7fdbb8e0436f8694c4c393359576" # 这是我和别人交换互助,另外一个用户C的互助码 17 | 18 | # ForOtherFruit1="${MyFruit2}@${MyFruitB}@${MyFruit4}" # Cookie1这个账号助力Cookie2的账号的账号、Cookie4的账号以及用户B 19 | # ForOtherFruit2="${MyFruit1}@${MyFruitA}@${MyFruit4}" # Cookie2这个账号助力Cookie1的账号的账号、Cookie4的账号以及用户A 20 | # ForOtherFruit3="${MyFruit1}@${MyFruit2}@${MyFruitC}@${MyFruit4}@${MyFruitA}@${MyFruit6}" # 解释同上,东东农场实际上只能助力3次 21 | # ForOtherFruit4="${MyFruit1}@${MyFruit2}@${MyFruit3}@${MyFruitC}@${MyFruit6}@${MyFruitA}" # 解释同上,东东农场实际上只能助力3次 22 | # ForOtherFruit5="${MyFruit1}@${MyFruit2}@${MyFruit3}@${MyFruitB}@${MyFruit4}@${MyFruit6}@${MyFruitC}@${MyFruitA}" 23 | # ForOtherFruit6="${MyFruit1}@${MyFruit2}@${MyFruit3}@${MyFruitA}@${MyFruit4}@${MyFruit5}@${MyFruitC}" 24 | 25 | 26 | ## ---------------------------------- 手 动 填 写 互 助 码 区 域 (不推荐!) ---------------------------------- 27 | ## 以下为互助码的手动填写区域,为特定活动或临时活动填写的地方。现已可一键自动生成,只需运行export_sharecodes.sh按提示操作即可。 28 | 29 | ################################## 1. 定义东东农场互助(选填) ################################## 30 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 31 | MyFruit1="" 32 | MyFruit2="" 33 | MyFruitA="" 34 | MyFruitB="" 35 | 36 | ForOtherFruit1="" 37 | ForOtherFruit2="" 38 | 39 | 40 | ################################## 2. 定义东东萌宠互助(选填) ################################## 41 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 42 | MyPet1="" 43 | MyPet2="" 44 | MyPetA="" 45 | MyPetB="" 46 | 47 | ForOtherPet1="" 48 | ForOtherPet2="" 49 | 50 | 51 | ################################## 3. 定义种豆得豆互助(选填) ################################## 52 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 53 | MyBean1="" 54 | MyBean2="" 55 | MyBeanA="" 56 | MyBeanB="" 57 | 58 | ForOtherBean1="" 59 | ForOtherBean2="" 60 | 61 | 62 | ################################## 4. 定义东东工厂互助(选填) ################################## 63 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 64 | MyJdFactory1="" 65 | MyJdFactory2="" 66 | MyJdFactoryA="" 67 | MyJdFactoryB="" 68 | 69 | ForOtherJdFactory1="" 70 | ForOtherJdFactory2="" 71 | 72 | 73 | ################################## 5. 定义京喜工厂互助(选填) ################################## 74 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 75 | MyDreamFactory1="" 76 | MyDreamFactory2="" 77 | MyDreamFactoryA="" 78 | MyDreamFactoryB="" 79 | 80 | ForOtherDreamFactory1="" 81 | ForOtherDreamFactory2="" 82 | 83 | 84 | ################################## 6. 定义京东赚赚互助(选填) ################################## 85 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 86 | MyJdzz1="" 87 | MyJdzz2="" 88 | MyJdzzA="" 89 | MyJdzzB="" 90 | 91 | ForOtherJdzz1="" 92 | ForOtherJdzz2="" 93 | 94 | 95 | ################################## 7. 定义疯狂的JOY互助(选填) ################################## 96 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 97 | MyJoy1="" 98 | MyJoy2="" 99 | MyJoyA="" 100 | MyJoyB="" 101 | 102 | ForOtherJoy1="" 103 | ForOtherJoy2="" 104 | 105 | 106 | ################################## 8. 定义口袋书店互助(选填) ################################## 107 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 108 | MyBookShop1="" 109 | MyBookShop2="" 110 | MyBookShopA="" 111 | MyBookShopB="" 112 | 113 | ForOtherBookShop1="" 114 | ForOtherBookShop2="" 115 | 116 | 117 | ################################## 9. 定义签到领现金互助(选填) ################################## 118 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 119 | MyCash1="" 120 | MyCash2="" 121 | MyCashA="" 122 | MyCashB="" 123 | 124 | ForOtherCash1="" 125 | ForOtherCash2="" 126 | 127 | 128 | ################################## 10. 定义京喜农场互助(选填) ################################## 129 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 130 | ## 京喜农场助力码为 JSON 格式因此使用单引号,json 格式如下 131 | ## {"smp":"22bdadsfaadsfadse8a","active":"jdnc_1_btorange210113_2","joinnum":"1"} 132 | ## 助力码获取可以通过 bash jd.sh jd_get_share_code now 命令获取 133 | ## 注意:京喜农场 种植种子发生变化的时候,互助码也会变!! 134 | MyJxnc1='' 135 | MyJxnc2='' 136 | MyJxncA='' 137 | MyJxncB='' 138 | 139 | ForOtherJxnc1="" 140 | ForOtherJxnc2="" 141 | 142 | 143 | ################################## 11. 定义闪购盲盒互助(选填) ################################## 144 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 145 | MySgmh1="" 146 | MySgmh2="" 147 | MySgmhA="" 148 | MySgmhB="" 149 | 150 | ForOtherSgmh1="" 151 | ForOtherSgmh2="" 152 | 153 | 154 | ################################## 12. 定义京喜财富岛互助(选填) ################################## 155 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 156 | MyCfd1="" 157 | MyCfd2="" 158 | MyCfdA="" 159 | MyCfdB="" 160 | 161 | ForOtherCfd1="" 162 | ForOtherCfd2="" 163 | 164 | 165 | 166 | ################################## 13. 定义环球挑战赛互助(选填) ################################## 167 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 168 | MyGlobal1="" 169 | MyGlobal2="" 170 | MyGlobalA="" 171 | MyGlobalB="" 172 | 173 | ForOtherGlobal1="" 174 | ForOtherGlobal2="" 175 | 176 | 177 | ################################## 14. 定义京东手机狂欢城互助(选填) ################################## 178 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 179 | MyCarnivalcity1="" 180 | MyCarnivalcity2="" 181 | MyCarnivalcityA="" 182 | MyCarnivalcityB="" 183 | 184 | ForOtherCarnivalcity1="" 185 | ForOtherCarnivalcity2="" 186 | 187 | 188 | ################################################################################################## 189 | ################################## 15. 定义城城分现金互助(选填) ################################## 190 | ## 具体填法及要求详见本文件最下方“互助码填法示例” 191 | Mycity1="" 192 | Mycity2="" 193 | MycityA="" 194 | MycityB="" 195 | 196 | ForOtherCity1="" 197 | ForOtherCity2="" 198 | 199 | 200 | ################################################################################################## 201 | --------------------------------------------------------------------------------