├── .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 |
11 |
JS SHELL
12 | 自动化一键完成JS库管理
13 |
14 |
15 |
16 |
17 |
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`
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 |
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 |
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 |
50 |
51 |
52 |
58 |
59 |
60 |
61 |
62 |
67 |
✖
68 |
69 |
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 |
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 |
38 |
请输入新的用户名和密码
39 |
44 |
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 |
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 |
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 |
56 |
配置文件 温馨提示:每次保存都会在 config/bak 目录下生成备份文件
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
71 |
72 |
请使用手机京东APP扫码
73 |
✖
74 |
75 |
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 |
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 |
--------------------------------------------------------------------------------