├── API.md ├── LICENSE ├── README.md ├── html ├── index.html ├── login.html ├── pages │ ├── api │ │ ├── add.html │ │ ├── edit.html │ │ └── list.html │ ├── domain │ │ ├── add.html │ │ ├── edit.html │ │ └── list.html │ ├── server │ │ ├── add.html │ │ ├── edit.html │ │ └── list.html │ └── service │ │ ├── add.html │ │ ├── edit.html │ │ └── list.html └── static │ ├── adminlte │ ├── css │ │ ├── AdminLTE.css │ │ ├── AdminLTE.min.css │ │ └── skins │ │ │ ├── _all-skins.css │ │ │ ├── _all-skins.min.css │ │ │ ├── skin-black-light.css │ │ │ ├── skin-black-light.min.css │ │ │ ├── skin-black.css │ │ │ ├── skin-black.min.css │ │ │ ├── skin-blue-light.css │ │ │ ├── skin-blue-light.min.css │ │ │ ├── skin-blue.css │ │ │ ├── skin-blue.min.css │ │ │ ├── skin-green-light.css │ │ │ ├── skin-green-light.min.css │ │ │ ├── skin-green.css │ │ │ ├── skin-green.min.css │ │ │ ├── skin-purple-light.css │ │ │ ├── skin-purple-light.min.css │ │ │ ├── skin-purple.css │ │ │ ├── skin-purple.min.css │ │ │ ├── skin-red-light.css │ │ │ ├── skin-red-light.min.css │ │ │ ├── skin-red.css │ │ │ ├── skin-red.min.css │ │ │ ├── skin-yellow-light.css │ │ │ ├── skin-yellow-light.min.css │ │ │ ├── skin-yellow.css │ │ │ └── skin-yellow.min.css │ ├── img │ │ ├── avatar.png │ │ ├── avatar04.png │ │ ├── avatar2.png │ │ ├── avatar3.png │ │ ├── avatar5.png │ │ ├── boxed-bg.jpg │ │ ├── boxed-bg.png │ │ ├── credit │ │ │ ├── american-express.png │ │ │ ├── cirrus.png │ │ │ ├── mastercard.png │ │ │ ├── mestro.png │ │ │ ├── paypal.png │ │ │ ├── paypal2.png │ │ │ └── visa.png │ │ ├── default-50x50.gif │ │ ├── icons.png │ │ ├── photo1.png │ │ ├── photo2.png │ │ ├── photo3.jpg │ │ ├── photo4.jpg │ │ ├── user1-128x128.jpg │ │ ├── user2-160x160.jpg │ │ ├── user3-128x128.jpg │ │ ├── user4-128x128.jpg │ │ ├── user5-128x128.jpg │ │ ├── user6-128x128.jpg │ │ ├── user7-128x128.jpg │ │ └── user8-128x128.jpg │ └── js │ │ ├── app.js │ │ ├── app.min.js │ │ ├── demo.js │ │ └── pages │ │ ├── dashboard.js │ │ └── dashboard2.js │ ├── bootstrap │ ├── css │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js │ ├── editor │ ├── kindeditor-min.js │ ├── lang │ │ ├── ar.js │ │ ├── en.js │ │ ├── ko.js │ │ ├── zh_CN.js │ │ └── zh_TW.js │ ├── plugins │ │ ├── anchor │ │ │ └── anchor.js │ │ ├── autoheight │ │ │ └── autoheight.js │ │ ├── baidumap │ │ │ ├── baidumap.js │ │ │ ├── index.html │ │ │ └── map.html │ │ ├── clearhtml │ │ │ └── clearhtml.js │ │ ├── code │ │ │ ├── code.js │ │ │ ├── prettify.css │ │ │ └── prettify.js │ │ ├── emoticons │ │ │ ├── emoticons.js │ │ │ └── images │ │ │ │ ├── 0.gif │ │ │ │ ├── 1.gif │ │ │ │ ├── 10.gif │ │ │ │ ├── 100.gif │ │ │ │ ├── 101.gif │ │ │ │ ├── 102.gif │ │ │ │ ├── 103.gif │ │ │ │ ├── 104.gif │ │ │ │ ├── 105.gif │ │ │ │ ├── 106.gif │ │ │ │ ├── 107.gif │ │ │ │ ├── 108.gif │ │ │ │ ├── 109.gif │ │ │ │ ├── 11.gif │ │ │ │ ├── 110.gif │ │ │ │ ├── 111.gif │ │ │ │ ├── 112.gif │ │ │ │ ├── 113.gif │ │ │ │ ├── 114.gif │ │ │ │ ├── 115.gif │ │ │ │ ├── 116.gif │ │ │ │ ├── 117.gif │ │ │ │ ├── 118.gif │ │ │ │ ├── 119.gif │ │ │ │ ├── 12.gif │ │ │ │ ├── 120.gif │ │ │ │ ├── 121.gif │ │ │ │ ├── 122.gif │ │ │ │ ├── 123.gif │ │ │ │ ├── 124.gif │ │ │ │ ├── 125.gif │ │ │ │ ├── 126.gif │ │ │ │ ├── 127.gif │ │ │ │ ├── 128.gif │ │ │ │ ├── 129.gif │ │ │ │ ├── 13.gif │ │ │ │ ├── 130.gif │ │ │ │ ├── 131.gif │ │ │ │ ├── 132.gif │ │ │ │ ├── 133.gif │ │ │ │ ├── 134.gif │ │ │ │ ├── 14.gif │ │ │ │ ├── 15.gif │ │ │ │ ├── 16.gif │ │ │ │ ├── 17.gif │ │ │ │ ├── 18.gif │ │ │ │ ├── 19.gif │ │ │ │ ├── 2.gif │ │ │ │ ├── 20.gif │ │ │ │ ├── 21.gif │ │ │ │ ├── 22.gif │ │ │ │ ├── 23.gif │ │ │ │ ├── 24.gif │ │ │ │ ├── 25.gif │ │ │ │ ├── 26.gif │ │ │ │ ├── 27.gif │ │ │ │ ├── 28.gif │ │ │ │ ├── 29.gif │ │ │ │ ├── 3.gif │ │ │ │ ├── 30.gif │ │ │ │ ├── 31.gif │ │ │ │ ├── 32.gif │ │ │ │ ├── 33.gif │ │ │ │ ├── 34.gif │ │ │ │ ├── 35.gif │ │ │ │ ├── 36.gif │ │ │ │ ├── 37.gif │ │ │ │ ├── 38.gif │ │ │ │ ├── 39.gif │ │ │ │ ├── 4.gif │ │ │ │ ├── 40.gif │ │ │ │ ├── 41.gif │ │ │ │ ├── 42.gif │ │ │ │ ├── 43.gif │ │ │ │ ├── 44.gif │ │ │ │ ├── 45.gif │ │ │ │ ├── 46.gif │ │ │ │ ├── 47.gif │ │ │ │ ├── 48.gif │ │ │ │ ├── 49.gif │ │ │ │ ├── 5.gif │ │ │ │ ├── 50.gif │ │ │ │ ├── 51.gif │ │ │ │ ├── 52.gif │ │ │ │ ├── 53.gif │ │ │ │ ├── 54.gif │ │ │ │ ├── 55.gif │ │ │ │ ├── 56.gif │ │ │ │ ├── 57.gif │ │ │ │ ├── 58.gif │ │ │ │ ├── 59.gif │ │ │ │ ├── 6.gif │ │ │ │ ├── 60.gif │ │ │ │ ├── 61.gif │ │ │ │ ├── 62.gif │ │ │ │ ├── 63.gif │ │ │ │ ├── 64.gif │ │ │ │ ├── 65.gif │ │ │ │ ├── 66.gif │ │ │ │ ├── 67.gif │ │ │ │ ├── 68.gif │ │ │ │ ├── 69.gif │ │ │ │ ├── 7.gif │ │ │ │ ├── 70.gif │ │ │ │ ├── 71.gif │ │ │ │ ├── 72.gif │ │ │ │ ├── 73.gif │ │ │ │ ├── 74.gif │ │ │ │ ├── 75.gif │ │ │ │ ├── 76.gif │ │ │ │ ├── 77.gif │ │ │ │ ├── 78.gif │ │ │ │ ├── 79.gif │ │ │ │ ├── 8.gif │ │ │ │ ├── 80.gif │ │ │ │ ├── 81.gif │ │ │ │ ├── 82.gif │ │ │ │ ├── 83.gif │ │ │ │ ├── 84.gif │ │ │ │ ├── 85.gif │ │ │ │ ├── 86.gif │ │ │ │ ├── 87.gif │ │ │ │ ├── 88.gif │ │ │ │ ├── 89.gif │ │ │ │ ├── 9.gif │ │ │ │ ├── 90.gif │ │ │ │ ├── 91.gif │ │ │ │ ├── 92.gif │ │ │ │ ├── 93.gif │ │ │ │ ├── 94.gif │ │ │ │ ├── 95.gif │ │ │ │ ├── 96.gif │ │ │ │ ├── 97.gif │ │ │ │ ├── 98.gif │ │ │ │ ├── 99.gif │ │ │ │ └── static.gif │ │ ├── filemanager │ │ │ ├── filemanager.js │ │ │ └── images │ │ │ │ ├── file-16.gif │ │ │ │ ├── file-64.gif │ │ │ │ ├── folder-16.gif │ │ │ │ ├── folder-64.gif │ │ │ │ └── go-up.gif │ │ ├── flash │ │ │ └── flash.js │ │ ├── image │ │ │ ├── image.js │ │ │ └── images │ │ │ │ ├── align_left.gif │ │ │ │ ├── align_right.gif │ │ │ │ ├── align_top.gif │ │ │ │ └── refresh.png │ │ ├── insertfile │ │ │ └── insertfile.js │ │ ├── lineheight │ │ │ └── lineheight.js │ │ ├── link │ │ │ └── link.js │ │ ├── map │ │ │ ├── map.html │ │ │ └── map.js │ │ ├── media │ │ │ └── media.js │ │ ├── multiimage │ │ │ ├── images │ │ │ │ ├── image.png │ │ │ │ ├── select-files-en.png │ │ │ │ ├── select-files-zh_CN.png │ │ │ │ └── swfupload.swf │ │ │ └── multiimage.js │ │ ├── pagebreak │ │ │ └── pagebreak.js │ │ ├── plainpaste │ │ │ └── plainpaste.js │ │ ├── preview │ │ │ └── preview.js │ │ ├── quickformat │ │ │ └── quickformat.js │ │ ├── table │ │ │ └── table.js │ │ ├── template │ │ │ ├── html │ │ │ │ ├── 1.html │ │ │ │ ├── 2.html │ │ │ │ └── 3.html │ │ │ └── template.js │ │ └── wordpaste │ │ │ └── wordpaste.js │ └── themes │ │ ├── common │ │ ├── anchor.gif │ │ ├── blank.gif │ │ ├── flash.gif │ │ ├── loading.gif │ │ ├── media.gif │ │ └── rm.gif │ │ ├── default │ │ ├── background.png │ │ ├── default.css │ │ └── default.png │ │ ├── qq │ │ ├── editor.gif │ │ └── qq.css │ │ └── simple │ │ └── simple.css │ ├── font-awesome │ ├── css │ │ ├── font-awesome.css │ │ ├── font-awesome.css.map │ │ └── font-awesome.min.css │ └── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── ionicons │ └── ionicons.min.css │ ├── js │ ├── main.js │ └── template.js │ └── plugins │ ├── fastclick │ ├── fastclick.js │ └── fastclick.min.js │ ├── jQuery │ └── jQuery-2.2.0.min.js │ └── slimScroll │ ├── jquery.slimscroll.js │ └── jquery.slimscroll.min.js ├── manage.conf ├── modules.png ├── nginx.conf ├── pgw.sql ├── servers.png ├── src ├── access.lua ├── access_limit.lua ├── balancer.lua ├── config.lua ├── init.lua ├── manage │ ├── access.lua │ ├── app.lua │ └── controller.lua ├── model │ ├── api.lua │ ├── domain.lua │ ├── module.lua │ ├── mysql.lua │ └── server.lua ├── resty │ ├── aes.lua │ ├── cookie.lua │ ├── md5.lua │ ├── random.lua │ ├── sha.lua │ ├── sha1.lua │ ├── sha224.lua │ ├── sha256.lua │ ├── sha384.lua │ ├── sha512.lua │ └── string.lua └── service │ └── agw.lua ├── uri_config.png └── uris.png /API.md: -------------------------------------------------------------------------------- 1 | ## api_key 2 | api_key可以在config.lua中增加配置 3 | ```lua 4 | config['api_key'] = "your api key string" 5 | ``` 6 | 7 | ## 域名 8 | ### 添加域名 9 | #### 接口地址 10 | - POST /api/v1/domain/add?api_key={api_key} 11 | #### 表单参数 12 | | 参数 | 是否必须 | 说明 | 13 | | ---------------- | ------ | --------------------------------------- | 14 | | name | 是 | 域名名称 | 15 | 16 | #### 返回示例 17 | ```json 18 | { 19 | "info": { 20 | "insert_id": 17, 21 | "affected_rows": 1, 22 | "server_status": 2, 23 | "warning_count": 0 24 | }, 25 | "errno": 0, 26 | "status": 200, 27 | "msg": "success" 28 | } 29 | ``` 30 | 31 | ### 删除域名 32 | #### 接口地址 33 | - POST /api/v1/domain/delete?api_key={api_key} 34 | #### 表单参数 35 | | 参数 | 是否必须 | 说明 | 36 | | ---------------- | ------ | --------------------------------------- | 37 | | domain_id | 是 | 域名ID | 38 | 39 | #### 返回示例 40 | ```json 41 | { 42 | "errno": 0, 43 | "status": 200, 44 | "msg": "success" 45 | } 46 | ``` 47 | > 域名删除时会删除所有域名相关的数据,慎用 48 | 49 | ### 修改域名 50 | #### 接口地址 51 | - POST /api/v1/domain/update?api_key={api_key} 52 | #### 表单参数 53 | | 参数 | 是否必须 | 说明 | 54 | | ---------------- | ------ | --------------------------------------- | 55 | | domain_id | 是 | 域名ID | 56 | | name | 是 | 域名名称 | 57 | 58 | #### 返回示例 59 | ```json 60 | { 61 | "errno": 0, 62 | "status": 200, 63 | "msg": "success" 64 | } 65 | ``` 66 | > 域名删除时会删除所有域名相关的数据,慎用 67 | 68 | ### 查询已添加域名列表 69 | #### 接口地址 70 | - GET /api/v1/domain/all?api_key={api_key} 71 | 72 | #### 返回示例 73 | ```json 74 | { 75 | "info": [ 76 | { 77 | "name": "www.xxx.com", 78 | "id": 2 79 | } 80 | ], 81 | "errno": 0, 82 | "status": 200, 83 | "msg": "success" 84 | } 85 | ``` 86 | 87 | ## 模块 88 | > 每个域名下可以有多个模块 89 | 90 | - /api/v1/service/add 91 | - /api/v1/service/edit 92 | - /api/v1/service/delete 93 | - /api/v1/service/get 94 | - /api/v1/service/list 95 | 96 | ## 服务器 97 | > 每个模块可以有多个后端服务器 98 | 99 | - /api/v1/server/add 100 | - /api/v1/server/edit 101 | - /api/v1/server/delete 102 | - /api/v1/server/get 103 | - /api/v1/server/list 104 | 105 | ## URI映射 106 | > 每个模块可以有多个URI接口映射 107 | 108 | - /api/v1/api/add 109 | - /api/v1/api/edit 110 | - /api/v1/api/delete 111 | - /api/v1/api/get 112 | - /api/v1/api/list -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 小飞 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## Proxy Gateway 3 | 4 | Proxy Gateway基于openresty(nginx lua module)开发,可以作为接口网关(api gateway)使用,整合业务模块接口,微服务治理聚合,通过web配置界面,能够轻松进行代理配置管理,支持负载均衡,服务器状态检测,后续简称PGW。包括以下特性 5 | 6 | - 支持多域名,可以配置多个出口域名,互不干扰 7 | - 代理分组(服务模块),可以按照业务模块进行分组 8 | - 负载均衡,可以给每组(每个业务模块)代理配置多台后端服务器,PGW会自动进行负载均衡 9 | - 服务器监控,将down掉的服务器自动剔除,恢复以后自动加入 10 | - 路径配置支持正则表达式对uri进行重写 11 | - 集群部署,PGW配置的MySQL数据库使用同一个就能达到集群效果,在任意一台PGW服务器上进行的配置都将在所有PGW服务器上生效 12 | - https配置,与nginx配置一致,修改nginx.conf文件 13 | - 高效,反向代理能力基本和原生nginx一致 14 | - 支持API级别的限流(可针对总访问量以及单个IP访问量进行限流) 15 | 16 | ### 安装 17 | 18 | 安装最新版本的openresty http://openresty.org/en/installation.html 19 | 20 | nginx.conf配置如下,如果按照默认路径(/usr/local/openresty/)安装,可以参考以下步骤 21 | 22 | ```shell 23 | cd /usr/local/openresty/nginx 24 | git clone https://github.com/ffay/proxygateway.git 25 | ``` 26 | 27 | 然后把/usr/local/openresty/nginx/conf/nginx.conf 用源码中的nginx.conf替换即可 28 | 29 | https://github.com/ffay/proxygateway/blob/master/nginx.conf 30 | 31 | #### 配置manage.conf 32 | 33 | ``` 34 | server { 35 | listen 8081; 36 | server_name localhost; 37 | index index.html; 38 | location /api/v1 { 39 | access_by_lua_block{ 40 | local access = require "manage.access" 41 | access.checkLogin() 42 | } 43 | content_by_lua_block{ 44 | local ctl = require "manage.controller" 45 | ctl.run() 46 | } 47 | } 48 | 49 | location /static { 50 | #源码中html的实际路径 51 | root /usr/local/openresty/nginx/proxygateway/html; 52 | } 53 | 54 | location / { 55 | access_by_lua_block{ 56 | local access = require "manage.access" 57 | access.checkLogin() 58 | } 59 | #源码中html的实际路径 60 | root /usr/local/openresty/nginx/proxygateway/html; 61 | } 62 | } 63 | ``` 64 | 65 | - 在PGW源码中 src/config.lua 进行管理员以及MySQL相关配置,如果需要使用限流功能,请正确配置redis 66 | - 在数据库中运行pgw.sql脚本 67 | - 启动openresty(openresty安装目录/nginx/sbin/nginx) 68 | - 在浏览器中打开 http://ip:8081 ,如果是集群部署,打开任意一台的PGW管理界面进行配置即可,登录即可进行域名以及分组代理等配置管理,其中添加的域名需要解析到相应PGW的ip,如果前端还有负载均衡器(例如aws或aliyun的load balancing),域名直接解析到负载均衡器ip即可 69 | 70 | ### 管理配置 71 | 72 | - 域(域名)管理,可以任意添加多个域名,默认域 localhost 在该域下的配置,直接访问IP生效,PGW通过域名进行配置隔离,每个域名下的配置互不干扰,需要将域名解析到PGW的IP 73 | - 服务模块,每个域名下面可以添加多个服务模块,用于将接口按业务模块进行分组 74 | 75 | ![模块管理](modules.png) 76 | 77 | - 后端服务器,每个服务模块下面可以配置多台后端服务器,可以为每台服务器指定权重,负载均衡时会按权重进行接口请求分发,支持http以及https代理 78 | 79 | ![后端服务器管理](servers.png) 80 | 81 | - 代理路径(uri)配置,每个服务模块下可配置多个代理uri规则,配置规则类似nginx location的配置,配置实例 82 | 83 | ![映射列表](uris.png) 84 | ![映射配置](uri_config.png) 85 | 86 | 87 | |原始请求URI|后端服务URI|说明| 88 | |:---- |:---|:----- | 89 | |/ |/ |将所有对PGW某个域下的请求转发到后端服务器 | 90 | |/u |/user |将所有对PGW某个域下/u开头的请求重写成/user后转发到后端服务器,例如,请求 /u/1001 转发到后端服务器为 /user/1001 | 91 | |/topic/([0-9]+)/([0-9]+) |/topic?uid=$1&tid=$2 |支持正则匹配,请求 /topic/1001/2002 转发到后端服务器为 /topic?uid=1001&tid=2002 | 92 | |/t%?tid=(.*) |/topic?tid=$1 |支持正则匹配,原始请求URI中如果有 ? 出现,需要在前面加上 %,用于转义问号 | 93 | 94 | 所有接口映射配置必须以 / 开头,同一个域下面 原始请求URI 不能重复,原始请求URI **字符串越长匹配优先级越高** 95 | 96 | #### 后续 97 | 98 | - 认证检测 99 | - IP黑白名单 100 | - 数据统计 101 | - 欢迎提出更多功能 102 | 103 | -------------------------------------------------------------------------------- /html/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 登录 - Proxy Gateway 8 | 9 | 12 | 13 | 14 | 18 | 21 | 22 | 23 | 24 | 26 | 28 | 29 | 30 | 31 | 35 | 36 | 37 |
38 | 41 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 49 | 50 |
51 |
52 | 53 |
54 |
55 | 56 |
57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /html/pages/api/add.html: -------------------------------------------------------------------------------- 1 |
2 |

添加URI映射

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 28 |
29 | 30 |
31 |
32 |
33 | 46 | -------------------------------------------------------------------------------- /html/pages/api/edit.html: -------------------------------------------------------------------------------- 1 |
2 |

修改URI映射

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 25 |
26 |
27 | 28 | 29 |
30 |
31 | 32 | 33 |
34 |
35 | 36 | 37 |
38 |
39 | 40 | 44 |
45 | 46 |
47 |
48 |
49 | -------------------------------------------------------------------------------- /html/pages/api/list.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 |
5 | 6 |
7 | 8 |
9 |
10 |
11 |
12 |

13 | 14 |
15 |
16 |
17 | 18 |
19 |
20 |    21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 |
29 | 30 |
31 |
32 |
33 | 55 | 84 | -------------------------------------------------------------------------------- /html/pages/domain/add.html: -------------------------------------------------------------------------------- 1 |
2 |

添加域名

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 19 |
20 | 21 |
22 |
23 |
24 | 36 | -------------------------------------------------------------------------------- /html/pages/domain/edit.html: -------------------------------------------------------------------------------- 1 |
2 |

编辑域名

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 19 |
20 | 21 |
22 |
23 |
24 | 37 | -------------------------------------------------------------------------------- /html/pages/domain/list.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

域名列表

4 |
5 | 6 |
7 | 8 |
9 |
10 |
11 |
12 |
13 | 14 |
15 | 16 |
17 |
18 |
19 | 35 | 64 | -------------------------------------------------------------------------------- /html/pages/server/add.html: -------------------------------------------------------------------------------- 1 |
2 |

添加后端服务器

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 32 |
33 |
34 | 35 | 39 |
40 | 41 |
42 |
43 |
44 | 69 | -------------------------------------------------------------------------------- /html/pages/server/edit.html: -------------------------------------------------------------------------------- 1 |
2 |

编辑后端服务器

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 | 30 |
31 |
32 | 33 | 37 |
38 | 39 |
40 |
41 |
42 | -------------------------------------------------------------------------------- /html/pages/server/list.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 |
5 | 6 |
7 | 8 |
9 |
10 |
11 |
12 |

13 | 14 |
15 |
16 |
17 | 18 |
19 |
20 |    21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 |
29 | 30 |
31 |
32 |
33 | 67 | 96 | -------------------------------------------------------------------------------- /html/pages/service/add.html: -------------------------------------------------------------------------------- 1 |
2 |

添加服务模块

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 28 |
29 | 30 |
31 |
32 |
33 | 46 | -------------------------------------------------------------------------------- /html/pages/service/edit.html: -------------------------------------------------------------------------------- 1 |
2 |

编辑服务模块

3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 28 |
29 | 30 |
31 |
32 |
33 | 57 | -------------------------------------------------------------------------------- /html/pages/service/list.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 |
5 | 6 |
7 | 8 |
9 |
10 |
11 |
12 |

13 | 14 |
15 |
16 |
17 | 18 |
19 |
20 |
21 |
22 |
23 |
24 | 25 |
26 | 27 |
28 |
29 |
30 | 61 | 90 | -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-black.min.css: -------------------------------------------------------------------------------- 1 | .skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar{background-color:#fff}.skin-black .main-header>.navbar .nav>li>a{color:#333}.skin-black .main-header>.navbar .nav>li>a:hover,.skin-black .main-header>.navbar .nav>li>a:active,.skin-black .main-header>.navbar .nav>li>a:focus,.skin-black .main-header>.navbar .nav .open>a,.skin-black .main-header>.navbar .nav .open>a:hover,.skin-black .main-header>.navbar .nav .open>a:focus,.skin-black .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header>.navbar .sidebar-toggle{color:#333}.skin-black .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-blue-light.min.css: -------------------------------------------------------------------------------- 1 | .skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-blue.min.css: -------------------------------------------------------------------------------- 1 | .skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-green-light.min.css: -------------------------------------------------------------------------------- 1 | .skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-green.min.css: -------------------------------------------------------------------------------- 1 | .skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-purple-light.min.css: -------------------------------------------------------------------------------- 1 | .skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-purple.min.css: -------------------------------------------------------------------------------- 1 | .skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-red-light.min.css: -------------------------------------------------------------------------------- 1 | .skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-red.min.css: -------------------------------------------------------------------------------- 1 | .skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-yellow-light.min.css: -------------------------------------------------------------------------------- 1 | .skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} -------------------------------------------------------------------------------- /html/static/adminlte/css/skins/skin-yellow.min.css: -------------------------------------------------------------------------------- 1 | .skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} -------------------------------------------------------------------------------- /html/static/adminlte/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/avatar.png -------------------------------------------------------------------------------- /html/static/adminlte/img/avatar04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/avatar04.png -------------------------------------------------------------------------------- /html/static/adminlte/img/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/avatar2.png -------------------------------------------------------------------------------- /html/static/adminlte/img/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/avatar3.png -------------------------------------------------------------------------------- /html/static/adminlte/img/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/avatar5.png -------------------------------------------------------------------------------- /html/static/adminlte/img/boxed-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/boxed-bg.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/boxed-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/boxed-bg.png -------------------------------------------------------------------------------- /html/static/adminlte/img/credit/american-express.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/credit/american-express.png -------------------------------------------------------------------------------- /html/static/adminlte/img/credit/cirrus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/credit/cirrus.png -------------------------------------------------------------------------------- /html/static/adminlte/img/credit/mastercard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/credit/mastercard.png -------------------------------------------------------------------------------- /html/static/adminlte/img/credit/mestro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/credit/mestro.png -------------------------------------------------------------------------------- /html/static/adminlte/img/credit/paypal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/credit/paypal.png -------------------------------------------------------------------------------- /html/static/adminlte/img/credit/paypal2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/credit/paypal2.png -------------------------------------------------------------------------------- /html/static/adminlte/img/credit/visa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/credit/visa.png -------------------------------------------------------------------------------- /html/static/adminlte/img/default-50x50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/default-50x50.gif -------------------------------------------------------------------------------- /html/static/adminlte/img/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/icons.png -------------------------------------------------------------------------------- /html/static/adminlte/img/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/photo1.png -------------------------------------------------------------------------------- /html/static/adminlte/img/photo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/photo2.png -------------------------------------------------------------------------------- /html/static/adminlte/img/photo3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/photo3.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/photo4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/photo4.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user1-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user1-128x128.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user2-160x160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user2-160x160.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user3-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user3-128x128.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user4-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user4-128x128.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user5-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user5-128x128.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user6-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user6-128x128.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user7-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user7-128x128.jpg -------------------------------------------------------------------------------- /html/static/adminlte/img/user8-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/adminlte/img/user8-128x128.jpg -------------------------------------------------------------------------------- /html/static/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /html/static/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /html/static/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /html/static/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /html/static/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /html/static/editor/plugins/anchor/anchor.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('anchor', function(K) { 11 | var self = this, name = 'anchor', lang = self.lang(name + '.'); 12 | self.plugin.anchor = { 13 | edit : function() { 14 | var html = ['
', 15 | '
', 16 | '', 17 | '', 18 | '
', 19 | '
'].join(''); 20 | var dialog = self.createDialog({ 21 | name : name, 22 | width : 300, 23 | title : self.lang(name), 24 | body : html, 25 | yesBtn : { 26 | name : self.lang('yes'), 27 | click : function(e) { 28 | self.insertHtml('').hideDialog().focus(); 29 | } 30 | } 31 | }); 32 | var div = dialog.div, 33 | nameBox = K('input[name="name"]', div); 34 | var img = self.plugin.getSelectedAnchor(); 35 | if (img) { 36 | nameBox.val(unescape(img.attr('data-ke-name'))); 37 | } 38 | nameBox[0].focus(); 39 | nameBox[0].select(); 40 | }, 41 | 'delete' : function() { 42 | self.plugin.getSelectedAnchor().remove(); 43 | } 44 | }; 45 | self.clickToolbar(name, self.plugin.anchor.edit); 46 | }); 47 | -------------------------------------------------------------------------------- /html/static/editor/plugins/autoheight/autoheight.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('autoheight', function(K) { 11 | var self = this; 12 | 13 | if (!self.autoHeightMode) { 14 | return; 15 | } 16 | 17 | var minHeight; 18 | 19 | function hideScroll() { 20 | var edit = self.edit; 21 | var body = edit.doc.body; 22 | edit.iframe[0].scroll = 'no'; 23 | body.style.overflowY = 'hidden'; 24 | } 25 | 26 | function resetHeight() { 27 | var edit = self.edit; 28 | var body = edit.doc.body; 29 | edit.iframe.height(minHeight); 30 | self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight)); 31 | } 32 | 33 | function init() { 34 | minHeight = K.removeUnit(self.height); 35 | 36 | self.edit.afterChange(resetHeight); 37 | hideScroll(); 38 | resetHeight(); 39 | } 40 | 41 | if (self.isCreated) { 42 | init(); 43 | } else { 44 | self.afterCreate(init); 45 | } 46 | }); 47 | 48 | /* 49 | * 如何实现真正的自动高度? 50 | * 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。 51 | * 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。 52 | * 由此就实现了真正的自动高度 53 | * 测试:chrome、firefox、IE9、IE8 54 | * */ 55 | -------------------------------------------------------------------------------- /html/static/editor/plugins/baidumap/baidumap.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | // Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5 11 | 12 | KindEditor.plugin('baidumap', function(K) { 13 | var self = this, name = 'baidumap', lang = self.lang(name + '.'); 14 | var mapWidth = K.undef(self.mapWidth, 558); 15 | var mapHeight = K.undef(self.mapHeight, 360); 16 | self.clickToolbar(name, function() { 17 | var html = ['
', 18 | '
', 19 | // left start 20 | '
', 21 | lang.address + ' ', 22 | '', 23 | '', 24 | '', 25 | '
', 26 | // right start 27 | '
', 28 | ' ', 29 | '
', 30 | '
', 31 | '
', 32 | '
', 33 | '
'].join(''); 34 | var dialog = self.createDialog({ 35 | name : name, 36 | width : mapWidth + 42, 37 | title : self.lang(name), 38 | body : html, 39 | yesBtn : { 40 | name : self.lang('yes'), 41 | click : function(e) { 42 | var map = win.map; 43 | var centerObj = map.getCenter(); 44 | var center = centerObj.lng + ',' + centerObj.lat; 45 | var zoom = map.getZoom(); 46 | var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'http://api.map.baidu.com/staticimage', 47 | '?center=' + encodeURIComponent(center), 48 | '&zoom=' + encodeURIComponent(zoom), 49 | '&width=' + mapWidth, 50 | '&height=' + mapHeight, 51 | '&markers=' + encodeURIComponent(center), 52 | '&markerStyles=' + encodeURIComponent('l,A')].join(''); 53 | if (checkbox[0].checked) { 54 | self.insertHtml(''); 55 | } else { 56 | self.exec('insertimage', url); 57 | } 58 | self.hideDialog().focus(); 59 | } 60 | }, 61 | beforeRemove : function() { 62 | searchBtn.remove(); 63 | if (doc) { 64 | doc.write(''); 65 | } 66 | iframe.remove(); 67 | } 68 | }); 69 | var div = dialog.div, 70 | addressBox = K('[name="address"]', div), 71 | searchBtn = K('[name="searchBtn"]', div), 72 | checkbox = K('[name="insertDynamicMap"]', dialog.div), 73 | win, doc; 74 | var iframe = K(''); 75 | function ready() { 76 | win = iframe[0].contentWindow; 77 | doc = K.iframeDoc(iframe); 78 | } 79 | iframe.bind('load', function() { 80 | iframe.unbind('load'); 81 | if (K.IE) { 82 | ready(); 83 | } else { 84 | setTimeout(ready, 0); 85 | } 86 | }); 87 | K('.ke-map', div).replaceWith(iframe); 88 | // search map 89 | searchBtn.click(function() { 90 | win.search(addressBox.val()); 91 | }); 92 | }); 93 | }); 94 | -------------------------------------------------------------------------------- /html/static/editor/plugins/baidumap/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 百度地图API自定义地图 8 | 9 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 83 | -------------------------------------------------------------------------------- /html/static/editor/plugins/baidumap/map.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Baidu Maps 6 | 10 | 11 | 39 | 40 | 41 |
42 | 43 | 44 | -------------------------------------------------------------------------------- /html/static/editor/plugins/clearhtml/clearhtml.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('clearhtml', function(K) { 11 | var self = this, name = 'clearhtml'; 12 | self.clickToolbar(name, function() { 13 | self.focus(); 14 | var html = self.html(); 15 | html = html.replace(/(]*>)([\s\S]*?)(<\/script>)/ig, ''); 16 | html = html.replace(/(]*>)([\s\S]*?)(<\/style>)/ig, ''); 17 | html = K.formatHtml(html, { 18 | a : ['href', 'target'], 19 | embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'], 20 | img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'], 21 | table : ['border'], 22 | 'td,th' : ['rowspan', 'colspan'], 23 | 'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [] 24 | }); 25 | self.html(html); 26 | self.cmd.selection(true); 27 | self.addBookmark(); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /html/static/editor/plugins/code/code.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | // google code prettify: http://google-code-prettify.googlecode.com/ 11 | // http://google-code-prettify.googlecode.com/ 12 | 13 | KindEditor.plugin('code', function(K) { 14 | var self = this, name = 'code'; 15 | self.clickToolbar(name, function() { 16 | var lang = self.lang(name + '.'), 17 | html = ['
', 18 | '
', 19 | '', 35 | '
', 36 | '', 37 | '
'].join(''), 38 | dialog = self.createDialog({ 39 | name : name, 40 | width : 450, 41 | title : self.lang(name), 42 | body : html, 43 | yesBtn : { 44 | name : self.lang('yes'), 45 | click : function(e) { 46 | var type = K('.ke-code-type', dialog.div).val(), 47 | code = textarea.val(), 48 | cls = type === '' ? '' : ' lang-' + type, 49 | html = '
\n' + K.escape(code) + '
'; 50 | if (K.trim(code) === '') { 51 | alert(lang.pleaseInput); 52 | textarea[0].focus(); 53 | return; 54 | } 55 | self.insertHtml(html).hideDialog().focus(); 56 | } 57 | } 58 | }), 59 | textarea = K('textarea', dialog.div); 60 | textarea[0].focus(); 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /html/static/editor/plugins/code/prettify.css: -------------------------------------------------------------------------------- 1 | .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} 2 | 3 | pre.prettyprint { 4 | border: 0; 5 | border-left: 3px solid rgb(204, 204, 204); 6 | margin-left: 2em; 7 | padding: 0.5em; 8 | font-size: 110%; 9 | display: block; 10 | font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; 11 | margin: 1em 0px; 12 | white-space: pre; 13 | } 14 | -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/0.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/1.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/10.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/100.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/100.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/101.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/101.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/102.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/102.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/103.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/103.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/104.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/104.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/105.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/105.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/106.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/106.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/107.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/107.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/108.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/108.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/109.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/109.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/11.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/110.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/110.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/111.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/111.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/112.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/112.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/113.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/113.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/114.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/114.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/115.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/115.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/116.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/116.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/117.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/117.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/118.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/118.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/119.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/119.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/12.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/120.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/120.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/121.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/121.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/122.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/122.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/123.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/123.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/124.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/124.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/125.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/125.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/126.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/126.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/127.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/127.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/128.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/128.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/129.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/129.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/13.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/130.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/130.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/131.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/131.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/132.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/132.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/133.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/133.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/134.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/134.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/14.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/15.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/16.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/17.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/18.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/19.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/2.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/20.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/21.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/22.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/23.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/24.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/25.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/26.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/27.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/28.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/29.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/3.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/30.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/31.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/32.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/33.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/34.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/35.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/36.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/37.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/38.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/39.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/4.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/40.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/41.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/42.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/43.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/44.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/45.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/46.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/47.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/48.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/49.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/5.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/50.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/51.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/52.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/53.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/54.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/55.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/56.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/57.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/58.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/59.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/6.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/60.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/61.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/62.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/63.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/64.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/65.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/66.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/67.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/68.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/69.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/7.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/70.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/71.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/72.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/72.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/73.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/73.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/74.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/74.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/75.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/75.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/76.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/76.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/77.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/77.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/78.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/78.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/79.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/79.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/8.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/80.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/80.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/81.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/81.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/82.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/82.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/83.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/83.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/84.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/84.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/85.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/85.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/86.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/86.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/87.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/87.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/88.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/88.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/89.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/89.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/9.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/90.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/90.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/91.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/91.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/92.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/92.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/93.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/93.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/94.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/94.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/95.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/95.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/96.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/96.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/97.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/97.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/98.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/98.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/99.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/99.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/emoticons/images/static.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/emoticons/images/static.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/filemanager/images/file-16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/filemanager/images/file-16.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/filemanager/images/file-64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/filemanager/images/file-64.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/filemanager/images/folder-16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/filemanager/images/folder-16.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/filemanager/images/folder-64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/filemanager/images/folder-64.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/filemanager/images/go-up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/filemanager/images/go-up.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/image/images/align_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/image/images/align_left.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/image/images/align_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/image/images/align_right.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/image/images/align_top.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/image/images/align_top.gif -------------------------------------------------------------------------------- /html/static/editor/plugins/image/images/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/image/images/refresh.png -------------------------------------------------------------------------------- /html/static/editor/plugins/lineheight/lineheight.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('lineheight', function(K) { 11 | var self = this, name = 'lineheight', lang = self.lang(name + '.'); 12 | self.clickToolbar(name, function() { 13 | var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'}); 14 | if (commonNode) { 15 | curVal = commonNode.css('line-height'); 16 | } 17 | var menu = self.createMenu({ 18 | name : name, 19 | width : 150 20 | }); 21 | K.each(lang.lineHeight, function(i, row) { 22 | K.each(row, function(key, val) { 23 | menu.addItem({ 24 | title : val, 25 | checked : curVal === key, 26 | click : function() { 27 | self.cmd.toggle('', { 28 | span : '.line-height=' + key 29 | }); 30 | self.updateState(); 31 | self.addBookmark(); 32 | self.hideMenu(); 33 | } 34 | }); 35 | }); 36 | }); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /html/static/editor/plugins/link/link.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('link', function(K) { 11 | var self = this, name = 'link'; 12 | self.plugin.link = { 13 | edit : function() { 14 | var lang = self.lang(name + '.'), 15 | html = '
' + 16 | //url 17 | '
' + 18 | '' + 19 | '
' + 20 | //type 21 | '
' + 22 | '' + 23 | '' + 24 | '
' + 25 | '
', 26 | dialog = self.createDialog({ 27 | name : name, 28 | width : 450, 29 | title : self.lang(name), 30 | body : html, 31 | yesBtn : { 32 | name : self.lang('yes'), 33 | click : function(e) { 34 | var url = K.trim(urlBox.val()); 35 | if (url == 'http://' || K.invalidUrl(url)) { 36 | alert(self.lang('invalidUrl')); 37 | urlBox[0].focus(); 38 | return; 39 | } 40 | self.exec('createlink', url, typeBox.val()).hideDialog().focus(); 41 | } 42 | } 43 | }), 44 | div = dialog.div, 45 | urlBox = K('input[name="url"]', div), 46 | typeBox = K('select[name="type"]', div); 47 | urlBox.val('http://'); 48 | typeBox[0].options[0] = new Option(lang.newWindow, '_blank'); 49 | typeBox[0].options[1] = new Option(lang.selfWindow, ''); 50 | self.cmd.selection(); 51 | var a = self.plugin.getSelectedLink(); 52 | if (a) { 53 | self.cmd.range.selectNode(a[0]); 54 | self.cmd.select(); 55 | urlBox.val(a.attr('data-ke-src')); 56 | typeBox.val(a.attr('target')); 57 | } 58 | urlBox[0].focus(); 59 | urlBox[0].select(); 60 | }, 61 | 'delete' : function() { 62 | self.exec('unlink', null); 63 | } 64 | }; 65 | self.clickToolbar(name, self.plugin.link.edit); 66 | }); 67 | -------------------------------------------------------------------------------- /html/static/editor/plugins/map/map.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 53 | 54 | 55 |
56 | 57 | -------------------------------------------------------------------------------- /html/static/editor/plugins/multiimage/images/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/multiimage/images/image.png -------------------------------------------------------------------------------- /html/static/editor/plugins/multiimage/images/select-files-en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/multiimage/images/select-files-en.png -------------------------------------------------------------------------------- /html/static/editor/plugins/multiimage/images/select-files-zh_CN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/multiimage/images/select-files-zh_CN.png -------------------------------------------------------------------------------- /html/static/editor/plugins/multiimage/images/swfupload.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/plugins/multiimage/images/swfupload.swf -------------------------------------------------------------------------------- /html/static/editor/plugins/pagebreak/pagebreak.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('pagebreak', function(K) { 11 | var self = this; 12 | var name = 'pagebreak'; 13 | var pagebreakHtml = K.undef(self.pagebreakHtml, '
'); 14 | 15 | self.clickToolbar(name, function() { 16 | var cmd = self.cmd, range = cmd.range; 17 | self.focus(); 18 | var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : ''; 19 | self.insertHtml(pagebreakHtml + tail); 20 | if (tail !== '') { 21 | var p = K('#__kindeditor_tail_tag__', self.edit.doc); 22 | range.selectNodeContents(p[0]); 23 | p.removeAttr('id'); 24 | cmd.select(); 25 | } 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /html/static/editor/plugins/plainpaste/plainpaste.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('plainpaste', function(K) { 11 | var self = this, name = 'plainpaste'; 12 | self.clickToolbar(name, function() { 13 | var lang = self.lang(name + '.'), 14 | html = '
' + 15 | '
' + lang.comment + '
' + 16 | '' + 17 | '
', 18 | dialog = self.createDialog({ 19 | name : name, 20 | width : 450, 21 | title : self.lang(name), 22 | body : html, 23 | yesBtn : { 24 | name : self.lang('yes'), 25 | click : function(e) { 26 | var html = textarea.val(); 27 | html = K.escape(html); 28 | html = html.replace(/ {2}/g, '  '); 29 | if (self.newlineTag == 'p') { 30 | html = html.replace(/^/, '

').replace(/$/, '

').replace(/\n/g, '

'); 31 | } else { 32 | html = html.replace(/\n/g, '
$&'); 33 | } 34 | self.insertHtml(html).hideDialog().focus(); 35 | } 36 | } 37 | }), 38 | textarea = K('textarea', dialog.div); 39 | textarea[0].focus(); 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /html/static/editor/plugins/preview/preview.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('preview', function(K) { 11 | var self = this, name = 'preview', undefined; 12 | self.clickToolbar(name, function() { 13 | var lang = self.lang(name + '.'), 14 | html = '

' + 15 | '' + 16 | '
', 17 | dialog = self.createDialog({ 18 | name : name, 19 | width : 750, 20 | title : self.lang(name), 21 | body : html 22 | }), 23 | iframe = K('iframe', dialog.div), 24 | doc = K.iframeDoc(iframe); 25 | doc.open(); 26 | doc.write(self.fullHtml()); 27 | doc.close(); 28 | K(doc.body).css('background-color', '#FFF'); 29 | iframe[0].contentWindow.focus(); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /html/static/editor/plugins/quickformat/quickformat.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('quickformat', function(K) { 11 | var self = this, name = 'quickformat', 12 | blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p'); 13 | function getFirstChild(knode) { 14 | var child = knode.first(); 15 | while (child && child.first()) { 16 | child = child.first(); 17 | } 18 | return child; 19 | } 20 | self.clickToolbar(name, function() { 21 | self.focus(); 22 | var doc = self.edit.doc, 23 | range = self.cmd.range, 24 | child = K(doc.body).first(), next, 25 | nodeList = [], subList = [], 26 | bookmark = range.createBookmark(true); 27 | while(child) { 28 | next = child.next(); 29 | var firstChild = getFirstChild(child); 30 | if (!firstChild || firstChild.name != 'img') { 31 | if (blockMap[child.name]) { 32 | child.html(child.html().replace(/^(\s| | )+/ig, '')); 33 | child.css('text-indent', '2em'); 34 | } else { 35 | subList.push(child); 36 | } 37 | if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) { 38 | if (subList.length > 0) { 39 | nodeList.push(subList); 40 | } 41 | subList = []; 42 | } 43 | } 44 | child = next; 45 | } 46 | K.each(nodeList, function(i, subList) { 47 | var wrapper = K('

', doc); 48 | subList[0].before(wrapper); 49 | K.each(subList, function(i, knode) { 50 | wrapper.append(knode); 51 | }); 52 | }); 53 | range.moveToBookmark(bookmark); 54 | self.addBookmark(); 55 | }); 56 | }); 57 | 58 | /** 59 | -------------------------- 60 | abcd
61 | 1234
62 | 63 | to 64 | 65 |

66 | abcd
67 | 1234
68 |

69 | 70 | -------------------------- 71 | 72 |   abcd1233 73 |

1234

74 | 75 | to 76 | 77 |

abcd1233

78 |

1234

79 | 80 | -------------------------- 81 | */ -------------------------------------------------------------------------------- /html/static/editor/plugins/template/html/1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

8 | 在此处输入标题 9 |

10 |

11 | 在此处输入内容 12 |

13 | 14 | -------------------------------------------------------------------------------- /html/static/editor/plugins/template/html/2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

8 | 标题 9 |

10 | 11 | 12 | 13 | 16 | 19 | 20 | 21 | 24 | 27 | 28 | 29 | 32 | 35 | 36 | 37 |
14 |

标题1

15 |
17 |

标题1

18 |
22 | 内容1 23 | 25 | 内容2 26 |
30 | 内容3 31 | 33 | 内容4 34 |
38 |

39 | 表格说明 40 |

41 | 42 | -------------------------------------------------------------------------------- /html/static/editor/plugins/template/html/3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

8 | 在此处输入内容 9 |

10 |
    11 |
  1. 12 | 描述1 13 |
  2. 14 |
  3. 15 | 描述2 16 |
  4. 17 |
  5. 18 | 描述3 19 |
  6. 20 |
21 |

22 | 在此处输入内容 23 |

24 |
    25 |
  • 26 | 描述1 27 |
  • 28 |
  • 29 | 描述2 30 |
  • 31 |
  • 32 | 描述3 33 |
  • 34 |
35 | 36 | -------------------------------------------------------------------------------- /html/static/editor/plugins/template/template.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('template', function(K) { 11 | var self = this, name = 'template', lang = self.lang(name + '.'), 12 | htmlPath = self.pluginsPath + name + '/html/'; 13 | function getFilePath(fileName) { 14 | return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION); 15 | } 16 | self.clickToolbar(name, function() { 17 | var lang = self.lang(name + '.'), 18 | arr = ['
', 19 | '
', 20 | // left start 21 | '
', 22 | lang. selectTemplate + '
', 28 | // right start 29 | '
', 30 | ' ', 31 | '
', 32 | '
', 33 | '
', 34 | '', 35 | '
'].join(''); 36 | var dialog = self.createDialog({ 37 | name : name, 38 | width : 500, 39 | title : self.lang(name), 40 | body : html, 41 | yesBtn : { 42 | name : self.lang('yes'), 43 | click : function(e) { 44 | var doc = K.iframeDoc(iframe); 45 | self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus(); 46 | } 47 | } 48 | }); 49 | var selectBox = K('select', dialog.div), 50 | checkbox = K('[name="replaceFlag"]', dialog.div), 51 | iframe = K('iframe', dialog.div); 52 | checkbox[0].checked = true; 53 | iframe.attr('src', getFilePath(selectBox.val())); 54 | selectBox.change(function() { 55 | iframe.attr('src', getFilePath(this.value)); 56 | }); 57 | }); 58 | }); 59 | -------------------------------------------------------------------------------- /html/static/editor/plugins/wordpaste/wordpaste.js: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * KindEditor - WYSIWYG HTML Editor for Internet 3 | * Copyright (C) 2006-2011 kindsoft.net 4 | * 5 | * @author Roddy 6 | * @site http://www.kindsoft.net/ 7 | * @licence http://www.kindsoft.net/license.php 8 | *******************************************************************************/ 9 | 10 | KindEditor.plugin('wordpaste', function(K) { 11 | var self = this, name = 'wordpaste'; 12 | self.clickToolbar(name, function() { 13 | var lang = self.lang(name + '.'), 14 | html = '
' + 15 | '
' + lang.comment + '
' + 16 | '' + 17 | '
', 18 | dialog = self.createDialog({ 19 | name : name, 20 | width : 450, 21 | title : self.lang(name), 22 | body : html, 23 | yesBtn : { 24 | name : self.lang('yes'), 25 | click : function(e) { 26 | var str = doc.body.innerHTML; 27 | str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags); 28 | self.insertHtml(str).hideDialog().focus(); 29 | } 30 | } 31 | }), 32 | div = dialog.div, 33 | iframe = K('iframe', div), 34 | doc = K.iframeDoc(iframe); 35 | if (!K.IE) { 36 | doc.designMode = 'on'; 37 | } 38 | doc.open(); 39 | doc.write('WordPaste'); 40 | doc.write(''); 41 | if (!K.IE) { 42 | doc.write('
'); 43 | } 44 | doc.write(''); 45 | doc.close(); 46 | if (K.IE) { 47 | doc.body.contentEditable = 'true'; 48 | } 49 | iframe[0].contentWindow.focus(); 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /html/static/editor/themes/common/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/common/anchor.gif -------------------------------------------------------------------------------- /html/static/editor/themes/common/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/common/blank.gif -------------------------------------------------------------------------------- /html/static/editor/themes/common/flash.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/common/flash.gif -------------------------------------------------------------------------------- /html/static/editor/themes/common/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/common/loading.gif -------------------------------------------------------------------------------- /html/static/editor/themes/common/media.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/common/media.gif -------------------------------------------------------------------------------- /html/static/editor/themes/common/rm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/common/rm.gif -------------------------------------------------------------------------------- /html/static/editor/themes/default/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/default/background.png -------------------------------------------------------------------------------- /html/static/editor/themes/default/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/default/default.png -------------------------------------------------------------------------------- /html/static/editor/themes/qq/editor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/editor/themes/qq/editor.gif -------------------------------------------------------------------------------- /html/static/editor/themes/qq/qq.css: -------------------------------------------------------------------------------- 1 | /* container */ 2 | .ke-container-qq { 3 | display: block; 4 | border: 1px solid #c3c3c3; 5 | background-color: #FFF; 6 | overflow: hidden; 7 | margin: 0; 8 | padding: 0; 9 | } 10 | /* toolbar */ 11 | .ke-container-qq .ke-toolbar { 12 | border-bottom: 1px solid #c3c3c3; 13 | background-color: #FFFFFF; 14 | padding: 2px 5px; 15 | text-align: left; 16 | overflow: hidden; 17 | zoom: 1; 18 | } 19 | .ke-toolbar-icon-url { 20 | background-image: url(editor.gif); 21 | width:18px; 22 | *xwidth:20px; 23 | height:18px; 24 | *xheight:20px; 25 | } 26 | .ke-icon-checked{ 27 | background-image: url(../default/default.png); 28 | width:16px; 29 | height:16px; 30 | } 31 | .ke-container-qq .ke-icon-bold{ 32 | background-position: 4px 1px; 33 | } 34 | .ke-container-qq .ke-icon-italic{ 35 | background-position: -27px 1px; 36 | } 37 | .ke-container-qq .ke-icon-italic{ 38 | background-position: -28px 1px; 39 | } 40 | .ke-container-qq .ke-icon-underline{ 41 | background-position: -60px 1px; 42 | } 43 | .ke-container-qq .ke-icon-fontname{ 44 | background-position: -95px 1px; 45 | } 46 | .ke-container-qq .ke-icon-fontsize{ 47 | background-position: -128px 1px; 48 | } 49 | .ke-container-qq .ke-icon-forecolor{ 50 | background-position: -159px 1px; 51 | } 52 | .ke-container-qq .ke-icon-hilitecolor{ 53 | background-position: -190px 1px; 54 | } 55 | .ke-container-qq .ke-icon-plug-align{ 56 | background-position: -223px 1px; 57 | } 58 | .plug-align-justifyleft{ 59 | background-position: -350px 1px; 60 | } 61 | .plug-align-justifycenter{ 62 | background-position: -382px 1px; 63 | } 64 | .plug-align-justifyright{ 65 | background-position: -414px 1px; 66 | } 67 | .plug-order-insertorderedlist{ 68 | background-position: -446px 1px; 69 | } 70 | .plug-order-insertunorderedlist{ 71 | background-position: -477px 1px; 72 | } 73 | .plug-indent-indent{ 74 | background-position: -513px 1px; 75 | } 76 | .plug-indent-outdent{ 77 | background-position: -545px 1px; 78 | } 79 | .ke-container-qq .ke-icon-plug-order{ 80 | background-position: -255px 1px; 81 | } 82 | .ke-container-qq .ke-icon-plug-indent{ 83 | background-position: -287px 1px; 84 | } 85 | .ke-container-qq .ke-icon-link{ 86 | background-position: -319px 1px; 87 | } 88 | 89 | .ke-container-qq .ke-toolbar .ke-outline { 90 | cursor: default; 91 | padding:0px; 92 | border:1px solid #fff; 93 | } 94 | .ke-container-qq .ke-toolbar .ke-on { 95 | border-left:1px solid white; 96 | border-top:1px solid white; 97 | border-right:1px solid gray; 98 | border-bottom:1px solid gray; 99 | background-color: #FFFFFF; 100 | } 101 | .ke-container-qq .ke-toolbar .ke-selected { 102 | border-left:1px solid gray; 103 | border-top:1px solid gray; 104 | border-right:1px solid white; 105 | border-bottom:1px solid white; 106 | background-color: #FFFFFF; 107 | } 108 | .ke-container-qq .ke-toolbar .ke-disabled { 109 | cursor: default; 110 | } 111 | 112 | .ke-colorpicker-qq{ 113 | background:#fff; 114 | } 115 | /* statusbar */ 116 | .ke-container-qq .ke-statusbar { 117 | display:none; 118 | } 119 | /* menu */ 120 | .ke-menu-qq { 121 | border:1px solid #a6a6a6; 122 | position:absolute; 123 | background:#fff; 124 | -moz-box-shadow:2px 2px 4px #DDDDDD; 125 | z-index:999; 126 | left:-400px; 127 | top:-386px; 128 | right:218px; 129 | width:130px; 130 | } 131 | .ke-menu-qq .ke-menu-item { 132 | padding:0px; 133 | background:#fff; 134 | } 135 | .ke-menu-qq .ke-menu-item-on { 136 | border:1px solid #000080;background:#FFEEC2;color:#036; 137 | } 138 | .ke-menu-qq .ke-toolbar .ke-selected { 139 | border:1px solid #9a9afb; 140 | } 141 | .ke-menu-qq .ke-menu-item-left{ 142 | width:auto; 143 | } 144 | -------------------------------------------------------------------------------- /html/static/editor/themes/simple/simple.css: -------------------------------------------------------------------------------- 1 | /* container */ 2 | .ke-container-simple { 3 | display: block; 4 | border: 1px solid #CCC; 5 | background-color: #FFF; 6 | overflow: hidden; 7 | } 8 | /* toolbar */ 9 | .ke-container-simple .ke-toolbar { 10 | border-bottom: 1px solid #CCC; 11 | background-color: #FFF; 12 | padding: 2px 5px; 13 | overflow: hidden; 14 | } 15 | .ke-container-simple .ke-toolbar .ke-outline { 16 | border: 1px solid #FFF; 17 | background-color: transparent; 18 | margin: 1px; 19 | padding: 1px 2px; 20 | font-size: 0; 21 | line-height: 0; 22 | overflow: hidden; 23 | cursor: pointer; 24 | } 25 | .ke-container-simple .ke-toolbar .ke-on { 26 | border: 1px solid #5690D2; 27 | } 28 | .ke-container-simple .ke-toolbar .ke-selected { 29 | border: 1px solid #5690D2; 30 | background-color: #E9EFF6; 31 | } 32 | .ke-container-simple .ke-toolbar .ke-disabled { 33 | cursor: default; 34 | } 35 | /* statusbar */ 36 | .ke-container-simple .ke-statusbar { 37 | position: relative; 38 | background-color: #FFF; 39 | border-top: 1px solid #CCCCCC; 40 | font-size: 0; 41 | line-height: 0; 42 | *height: 12px; 43 | overflow: hidden; 44 | text-align: center; 45 | cursor: s-resize; 46 | } 47 | /* menu */ 48 | .ke-menu-simple { 49 | border: 1px solid #A0A0A0; 50 | background-color: #FFF; 51 | color: #222222; 52 | padding: 2px; 53 | font-family: "sans serif",tahoma,verdana,helvetica; 54 | font-size: 12px; 55 | text-align: left; 56 | overflow: hidden; 57 | } 58 | .ke-menu-simple .ke-menu-item { 59 | border: 1px solid #FFF; 60 | background-color: #FFF; 61 | color: #222222; 62 | height: 24px; 63 | overflow: hidden; 64 | cursor: pointer; 65 | } 66 | .ke-menu-simple .ke-menu-item-on { 67 | border: 1px solid #5690D2; 68 | background-color: #FFF; 69 | } 70 | /* colorpicker */ 71 | .ke-colorpicker-simple { 72 | border: 1px solid #A0A0A0; 73 | background-color: #FEFEFE; 74 | color: #222222; 75 | padding: 2px; 76 | } 77 | .ke-colorpicker-simple .ke-colorpicker-cell { 78 | font-size: 0; 79 | line-height: 0; 80 | border: 1px solid #FEFEFE; 81 | cursor: pointer; 82 | margin:3px; 83 | padding:0; 84 | } 85 | .ke-colorpicker-simple .ke-colorpicker-cell-top { 86 | font-family: "sans serif",tahoma,verdana,helvetica; 87 | font-size: 12px; 88 | line-height: 24px; 89 | border: 1px solid #FEFEFE; 90 | cursor: pointer; 91 | margin:0; 92 | padding:0; 93 | text-align: center; 94 | } 95 | .ke-colorpicker-simple .ke-colorpicker-cell-on { 96 | border: 1px solid #5690D2; 97 | } 98 | .ke-colorpicker-simple .ke-colorpicker-cell-selected { 99 | border: 1px solid #2446AB; 100 | } 101 | -------------------------------------------------------------------------------- /html/static/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /html/static/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /html/static/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /html/static/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /html/static/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/html/static/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /html/static/js/main.js: -------------------------------------------------------------------------------- 1 | function api_invoke(uri, params, callback) { 2 | $.ajax({ 3 | url: uri, 4 | data: params, 5 | type: 'POST', 6 | cache: false, 7 | dataType: 'json', 8 | success: function (data) { 9 | if (40100 == data.errno) { 10 | location.href = "/login.html"; 11 | return; 12 | } 13 | callback(data); 14 | }, 15 | error: function (XMLHttpRequest, textStatus, errorThrown) { 16 | if ("undefined" == typeof(XMLHttpRequest.responseJSON)) { 17 | alert("System error, please try again later."); 18 | return; 19 | } 20 | alert(XMLHttpRequest.responseJSON.msg); 21 | } 22 | }); 23 | } 24 | 25 | function load_page(pageUrl) { 26 | $(".content-wrapper").load(pageUrl); 27 | } 28 | 29 | function get_query_string(name) { 30 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); 31 | var r = window.location.search.substr(1).match(reg); 32 | if (r != null)return unescape(r[2]); 33 | return null; 34 | } 35 | 36 | function is_ip(ip) { 37 | var re = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/ 38 | return re.test(ip); 39 | } 40 | 41 | function check_port(port) { 42 | if (port > 65535) { 43 | return false; 44 | } 45 | var re = /^[1-9]+[0-9]*]*$/ 46 | return re.test(port); 47 | } 48 | 49 | function check_weight(weight) { 50 | var re = /^[1-9]+[0-9]*]*$/ 51 | return re.test(weight); 52 | } 53 | 54 | -------------------------------------------------------------------------------- /manage.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 8081; 3 | server_name localhost; 4 | index index.html; 5 | location /api/v1 { 6 | access_by_lua_block{ 7 | local access = require "manage.access" 8 | access.checkLogin() 9 | } 10 | content_by_lua_block{ 11 | local ctl = require "manage.controller" 12 | ctl.run() 13 | } 14 | } 15 | 16 | location /static { 17 | #源码中html的实际路径 18 | root /usr/local/openresty/nginx/proxygateway/html; 19 | } 20 | 21 | location / { 22 | access_by_lua_block{ 23 | local access = require "manage.access" 24 | access.checkLogin() 25 | } 26 | #源码中html的实际路径 27 | root /usr/local/openresty/nginx/proxygateway/html; 28 | } 29 | } -------------------------------------------------------------------------------- /modules.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/modules.png -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | worker_processes 1; 2 | 3 | events { 4 | worker_connections 102400; 5 | } 6 | 7 | http { 8 | include mime.types; 9 | default_type application/octet-stream; 10 | sendfile on; 11 | keepalive_timeout 65; 12 | client_max_body_size 1024m; 13 | lua_shared_dict cache 10m; 14 | lua_shared_dict domain_cache 10m; 15 | lua_shared_dict session 1m; 16 | 17 | #换成你的实际路径,这里将源码中src目录加入到 lua_package_path 18 | lua_package_path '/usr/local/openresty/nginx/proxygateway/src/?.lua;;'; 19 | 20 | #lua_code_cache off; 21 | 22 | upstream servers { 23 | server 127.0.0.1; 24 | balancer_by_lua_block{ 25 | local balancer = require "balancer" 26 | balancer.balancing() 27 | } 28 | keepalive 32; 29 | } 30 | 31 | init_worker_by_lua_block{ 32 | require "init" 33 | } 34 | 35 | server { 36 | listen 80 default_server; 37 | server_name localhost; 38 | 39 | location / { 40 | set $backend_host '127.0.0.1'; 41 | set $backend_port 80; 42 | set $newhost ''; 43 | set $upstream 'http://servers'; 44 | access_by_lua_block{ 45 | local access = require "access" 46 | access.dispatch() 47 | } 48 | proxy_set_header Host $newhost; 49 | proxy_set_header X-Real-IP $remote_addr; 50 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 51 | proxy_http_version 1.1; 52 | proxy_set_header Connection ""; 53 | proxy_pass $upstream; 54 | } 55 | error_log logs/error.log; 56 | } 57 | 58 | #将源码中的 manage.conf 路径 59 | include /usr/local/openresty/nginx/proxygateway/manage.conf; 60 | } 61 | -------------------------------------------------------------------------------- /pgw.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `agw_api` ( 2 | `id` int(11) NOT NULL, 3 | `service_id` int(11) DEFAULT NULL, 4 | `request_uri` varchar(64) DEFAULT NULL, 5 | `original_uri` varchar(64) DEFAULT NULL, 6 | `uri_limit_seconds` int(10) NOT NULL DEFAULT '0', 7 | `uri_limit_times` int(10) NOT NULL DEFAULT '0', 8 | `ip_uri_limit_seconds` int(10) NOT NULL DEFAULT '0', 9 | `ip_uri_limit_times` int(10) NOT NULL DEFAULT '0', 10 | `description` varchar(128) DEFAULT NULL 11 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 12 | INSERT INTO `agw_api` (`id`, `service_id`, `request_uri`, `original_uri`, `description`) VALUES 13 | (1, 1, '/', '/', 'all request map'); 14 | CREATE TABLE `agw_domain` ( 15 | `id` int(11) NOT NULL, 16 | `name` varchar(255) NOT NULL 17 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 18 | INSERT INTO `agw_domain` (`id`, `name`) VALUES 19 | (1, 'localhost'); 20 | CREATE TABLE `agw_server` ( 21 | `id` int(11) NOT NULL, 22 | `service_id` int(11) DEFAULT NULL, 23 | `ip` varchar(64) DEFAULT NULL, 24 | `port` int(11) DEFAULT NULL, 25 | `protocol` varchar(32) NOT NULL DEFAULT 'http://', 26 | `weight` int(11) DEFAULT NULL, 27 | `status` tinyint(1) DEFAULT '1', 28 | `description` varchar(255) DEFAULT '' 29 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 30 | INSERT INTO `agw_server` (`id`, `service_id`, `ip`, `port`, `protocol`, `weight`, `status`, `description`) VALUES 31 | (1, 1, '127.0.0.1', 8081, 'http://', 1, 1, 'proxygateway management'); 32 | CREATE TABLE `agw_service` ( 33 | `id` int(11) NOT NULL, 34 | `domain_id` int(11) NOT NULL, 35 | `name` varchar(64) DEFAULT NULL, 36 | `host` varchar(255) NOT NULL DEFAULT '', 37 | `description` varchar(64) DEFAULT NULL 38 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 39 | INSERT INTO `agw_service` (`id`, `domain_id`, `name`, `host`, `description`) VALUES 40 | (1, 1, 'default', 'localhost', 'default proxy configuration'); 41 | ALTER TABLE `agw_api` 42 | ADD PRIMARY KEY (`id`), 43 | ADD UNIQUE KEY `service_id` (`service_id`,`request_uri`), 44 | ADD KEY `service_id_2` (`service_id`); 45 | ALTER TABLE `agw_domain` 46 | ADD PRIMARY KEY (`id`), 47 | ADD UNIQUE KEY `name` (`name`); 48 | ALTER TABLE `agw_server` 49 | ADD PRIMARY KEY (`id`); 50 | ALTER TABLE `agw_service` 51 | ADD PRIMARY KEY (`id`), 52 | ADD KEY `domain_id` (`domain_id`); 53 | ALTER TABLE `agw_api` 54 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; 55 | ALTER TABLE `agw_domain` 56 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; 57 | ALTER TABLE `agw_server` 58 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; 59 | ALTER TABLE `agw_service` 60 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; -------------------------------------------------------------------------------- /servers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/servers.png -------------------------------------------------------------------------------- /src/access.lua: -------------------------------------------------------------------------------- 1 | local _M = {} 2 | local cjson = require "cjson" 3 | local domain_cache = ngx.shared.domain_cache 4 | local cache = ngx.shared.cache 5 | 6 | function split(str, delimiter) 7 | if str == nil or str == '' or delimiter == nil then 8 | return nil 9 | end 10 | 11 | local result = {} 12 | for match in (str .. delimiter):gmatch("(.-)" .. delimiter) do 13 | table.insert(result, match) 14 | end 15 | return result 16 | end 17 | 18 | -- 重写URL 19 | function rewrite(request_uri, reg, original_uri) 20 | i, j = string.find(request_uri, reg) 21 | if i ~= nil then 22 | local real_uri, _ = string.gsub(request_uri, reg, original_uri, 1) 23 | return real_uri 24 | end 25 | return nil 26 | end 27 | 28 | -- 负载均衡,选择服务器 29 | function select_server(api_info) 30 | local servers = api_info["servers"] 31 | local server_count = table.getn(servers) 32 | 33 | if server_count == 0 then 34 | return nil 35 | end 36 | 37 | -- 简单轮询策略 38 | local request_index_cache_key = ngx.var.host .. "_request_index_" .. api_info["request_uri"] 39 | local request_index, _ = cache:incr(request_index_cache_key, 1) 40 | if request_index == nil then 41 | request_index = cache:incr(request_index_cache_key, 1, 0) 42 | end 43 | 44 | return servers[request_index % server_count + 1]; --Lua 的 table 索引默认从 1 开始 45 | end 46 | 47 | function _M.dispatch() 48 | local config_str = domain_cache:get(ngx.var.host); 49 | if config_str == nil then 50 | config_str = domain_cache:get("localhost"); 51 | if config_str == nil then 52 | ngx.exit(404) 53 | end 54 | end 55 | 56 | local config = cjson.decode(config_str) 57 | local real_uri 58 | local api_info 59 | local api_uri_array = config["api_uri_array"] 60 | local api_uri_map = config["api_uri_map"] 61 | local uri = ngx.var.uri 62 | if ngx.var.args ~= nil then 63 | uri = uri .. "?" .. ngx.var.args 64 | end 65 | 66 | -- 匹配请求映射获得配置(api_info) 67 | for _, uri_regx in pairs(api_uri_array) do 68 | local api_info_t = api_uri_map[uri_regx]; 69 | real_uri = rewrite(uri, api_info_t["request_uri"], api_info_t["original_uri"]); 70 | if (real_uri ~= nil) then 71 | api_info = api_info_t 72 | break; 73 | end 74 | end 75 | 76 | if api_info == nil then 77 | ngx.exit(404) 78 | end 79 | 80 | -- TODO:IP黑名单... 81 | -- 限流 82 | local al = require "access_limit" 83 | al.checkAccessLimit(api_info["request_uri"], api_info["uri_limit_seconds"], api_info["uri_limit_times"], api_info["ip_uri_limit_seconds"], api_info["ip_uri_limit_times"]) 84 | 85 | -- 负载均衡,选择服务器开始 86 | local server = select_server(api_info); 87 | if server == nil then 88 | ngx.exit(503) 89 | end 90 | 91 | if api_info["host"] == "localhost" then 92 | api_info["host"] = ngx.var.host 93 | end 94 | 95 | if server["protocol"] ~= nil and server["protocol"] ~= "" then 96 | ngx.var.upstream = server["protocol"] .. "servers" 97 | end 98 | 99 | ngx.var.backend_host = server["ip"] 100 | ngx.var.backend_port = server["port"] 101 | ngx.var.newhost = api_info["host"] 102 | ngx.req.set_header("Host", api_info["host"]) 103 | 104 | local uri_t = split(real_uri, "?") 105 | ngx.req.set_uri(uri_t[1]) 106 | if table.getn(uri_t) == 2 then 107 | local uri_args = uri_t[2] 108 | ngx.req.set_uri_args(uri_args) 109 | else 110 | ngx.req.set_uri_args({}) 111 | end 112 | end 113 | 114 | return _M -------------------------------------------------------------------------------- /src/access_limit.lua: -------------------------------------------------------------------------------- 1 | local config = require "config" 2 | local _M = {} 3 | local log = ngx.log 4 | local ERR = ngx.ERR 5 | 6 | function open_redis() 7 | local redis = require "resty.redis" 8 | local red = redis:new() 9 | red:set_timeout(1000) -- 1 sec 10 | local ok, err = red:connect(config["redis_host"], config["redis_port"]) 11 | if not ok then 12 | log(ERR, "failed to connect: ", err) 13 | end 14 | return red, err 15 | end 16 | 17 | function return_redis(red) 18 | -- put it into the connection pool of size 100, 19 | -- with 10 seconds max idle time 20 | local ok, err = red:set_keepalive(10000, 100) 21 | if not ok then 22 | log(ERR, "failed to set keepalive: ", err) 23 | return 24 | end 25 | end 26 | 27 | function _M.checkAccessLimit(uri, uriSeconds, uriTimes, ipUriSeconds, ipUriTimes) 28 | if uriSeconds == 0 and ipUriSeconds == 0 then 29 | return 30 | end 31 | 32 | local red, err = open_redis() 33 | if err then 34 | return 35 | end 36 | 37 | -- 针对整个接口限流 38 | if uriSeconds > 0 then 39 | local value, _ = red:get(uri) 40 | if value == ngx.null then 41 | red:setex(uri, uriSeconds, 1) 42 | else 43 | local count = tonumber(value) 44 | if count >= uriTimes then 45 | return_redis(red) 46 | ngx.exit(403) 47 | end 48 | red:incr(uri) 49 | end 50 | end 51 | 52 | -- 针对IP接口限流 53 | if ipUriSeconds > 0 then 54 | local headers = ngx.req.get_headers() 55 | local ip = headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr or "0.0.0.0" 56 | local value, _ = red:get(ip .. uri) 57 | if value ~= ngx.null then 58 | local count = tonumber(value) 59 | if count >= ipUriTimes then 60 | return_redis(red) 61 | ngx.exit(403) 62 | end 63 | red:incr(ip .. uri) 64 | else 65 | red:setex(ip .. uri, ipUriSeconds, 1) 66 | end 67 | end 68 | return_redis(red) 69 | end 70 | 71 | return _M -------------------------------------------------------------------------------- /src/balancer.lua: -------------------------------------------------------------------------------- 1 | local _M = {} 2 | 3 | function _M.balancing() 4 | local balancer = require "ngx.balancer" 5 | local host = ngx.var.backend_host 6 | local port = ngx.var.backend_port 7 | local ok, err = balancer.set_current_peer(host, port) 8 | if not ok then 9 | ngx.log(ngx.ERR, "failed to set the current peer: ", err) 10 | return ngx.exit(500) 11 | end 12 | ok, err = balancer.set_more_tries(3) 13 | if not ok then 14 | ngx.log(ngx.ERR, "failed to set more tries: ", err) 15 | return ngx.exit(500) 16 | end 17 | end 18 | 19 | return _M -------------------------------------------------------------------------------- /src/config.lua: -------------------------------------------------------------------------------- 1 | local config = {}; 2 | config['mysql_host'] = "127.0.0.1" 3 | config['mysql_port'] = "3306" 4 | config['mysql_user'] = "root" 5 | config['mysql_pass'] = "" 6 | config['mysql_db'] = "agw" 7 | 8 | -- 如果开启限流需要正确配置redis 9 | config["redis_host"] = "127.0.0.1" 10 | config["redis_port"] = 6379 11 | 12 | config['admin_name'] = "admin" 13 | config['admin_pass'] = "admin" 14 | 15 | -- 需要通过接口远程管理时打开下面的配置 16 | -- config['api_key'] = "your apikey" 17 | 18 | return config; 19 | -------------------------------------------------------------------------------- /src/init.lua: -------------------------------------------------------------------------------- 1 | local agw_service = require "service.agw" 2 | 3 | local log = ngx.log 4 | local ERR = ngx.ERR 5 | local DEBUG = ngx.DEBUG 6 | local new_timer = ngx.timer.at 7 | 8 | local api_sync_interval = 3 9 | local server_state_check_interval = 20 10 | 11 | local api_sync_timer 12 | local server_state_check_timer 13 | 14 | -- sync api proxy infos from mysql 15 | api_sync_timer = function(premature) 16 | if not premature then 17 | local ret, result = pcall(agw_service.syncApiInfo) 18 | if ret then 19 | log(DEBUG, "sync api info over") 20 | else 21 | log(ERR, "sync api info failed:", result) 22 | end 23 | new_timer(api_sync_interval, api_sync_timer) 24 | end 25 | end 26 | 27 | -- check servers' status 28 | server_state_check_timer = function(premature) 29 | if not premature then 30 | local ret, result = pcall(agw_service.checkState) 31 | if ret then 32 | log(DEBUG, "server state check over") 33 | else 34 | log(ERR, "error occured when check server state:", result) 35 | end 36 | new_timer(server_state_check_interval, server_state_check_timer) 37 | end 38 | end 39 | 40 | local ok, err = new_timer(api_sync_interval, api_sync_timer) 41 | if not ok then 42 | log(ERR, "failed to create timer: ", err) 43 | return 44 | end 45 | 46 | ok, err = new_timer(server_state_check_interval, server_state_check_timer) 47 | if not ok then 48 | log(ERR, "failed to create timer: ", err) 49 | return 50 | end 51 | -------------------------------------------------------------------------------- /src/manage/access.lua: -------------------------------------------------------------------------------- 1 | local _M = {} 2 | local cjson = require "cjson" 3 | local config = require "config" 4 | 5 | function _M.checkLogin() 6 | local params = ngx.req.get_uri_args() 7 | if params["api_key"] ~= nil and params["api_key"] == config["api_key"] then 8 | return 1 9 | end 10 | local uri = ngx.var.uri 11 | if uri ~= "/api/v1/login" and uri ~= "/login.html" then 12 | local session = ngx.shared.session 13 | local ck = require "resty.cookie" 14 | local cookie, _ = ck:new() 15 | local token = cookie:get("token") 16 | local user; 17 | if token ~= nil then 18 | user = session:get(token) 19 | end 20 | local isApi = string.find(uri, "/api/v1/"); 21 | if isApi and user == nil then 22 | local response = {} 23 | response["status"] = 401 24 | response["errno"] = 40100 25 | response["msg"] = "Authentication required" 26 | ngx.header.content_type = 'application/json;charset=UTF-8'; 27 | ngx.say(cjson.encode(response)) 28 | ngx.exit(401) 29 | return; 30 | end 31 | if user == nil then 32 | return ngx.redirect("/login.html") 33 | end 34 | end 35 | return 1 36 | end 37 | 38 | return _M -------------------------------------------------------------------------------- /src/manage/app.lua: -------------------------------------------------------------------------------- 1 | local cjson = require "cjson" 2 | local app = {} 3 | local routes ={} 4 | function app:route(route, func) 5 | routes[route] = func 6 | end 7 | 8 | function app:run() 9 | local params = {} 10 | if ngx.req.get_method() == "POST" then 11 | ngx.req.read_body() 12 | params, err = ngx.req.get_post_args() 13 | end 14 | 15 | local get_params = ngx.req.get_uri_args() 16 | for name, param in pairs(get_params) do 17 | params[name] = param 18 | end 19 | 20 | for name, param in pairs(params) do 21 | param, index=string.gsub(param, "\'", "\\\'") 22 | params[name] = param 23 | end 24 | local response = {} 25 | response["status"] = 200 26 | response["errno"] = 0 27 | response["msg"] = "success" 28 | if routes[ngx.var.uri]~= nil then 29 | local res, err, errno = routes[ngx.var.uri](params) 30 | --ngx.log(ngx.ERR, res ,err) 31 | if err ~= nil then 32 | response["msg"] = err 33 | if errno == nil then 34 | response["errno"] = 1 35 | else 36 | response["errno"] = errno 37 | end 38 | else 39 | response["info"] = res 40 | end 41 | else 42 | response["status"] = 404 43 | response["errno"] = 161 44 | response["msg"] = "api not found" 45 | ngx.status = 404 46 | end 47 | ngx.header.content_type = 'application/json;charset=UTF-8'; 48 | ngx.say(cjson.encode(response)) 49 | end 50 | 51 | return app 52 | -------------------------------------------------------------------------------- /src/model/api.lua: -------------------------------------------------------------------------------- 1 | local mysql = require "model.mysql" 2 | local api_model = {} 3 | 4 | -- 由于系统都是内部使用,对SQL注入问题没有特殊处理 5 | function api_model.getApis() 6 | local db = mysql.getDb() 7 | local apis, err, _, _ = db:query("select * from agw_api", 10) 8 | db:set_keepalive(10000, 10) 9 | return apis, err 10 | end 11 | 12 | function api_model.add(service_id, request_uri, original_uri, description) 13 | local db = mysql.getDb() 14 | description = ndk.set_var.set_quote_sql_str(description) 15 | local res, err, _, _ = db:query("INSERT INTO agw_api (service_id,request_uri,original_uri,description)values(\'" .. service_id .. "\',\'" .. request_uri .. "\',\'" .. original_uri .. "\'," .. description .. ")", 10) 16 | db:set_keepalive(10000, 10) 17 | return res, err 18 | end 19 | 20 | function api_model.delete(aid) 21 | local db = mysql.getDb() 22 | local res, err, _, _ = db:query("DELETE FROM agw_api WHERE id=" .. aid, 10) 23 | db:set_keepalive(10000, 10) 24 | return res, err 25 | end 26 | 27 | function api_model.deleteByServiceId(sid) 28 | local db = mysql.getDb() 29 | local res, err, _, _ = db:query("DELETE FROM agw_api WHERE service_id=" .. sid, 10) 30 | db:set_keepalive(10000, 10) 31 | return res, err 32 | end 33 | 34 | function api_model.update(id, request_uri, original_uri, uri_limit_seconds, uri_limit_times, ip_uri_limit_seconds, ip_uri_limit_times, description) 35 | local db = mysql.getDb() 36 | description = ndk.set_var.set_quote_sql_str(description) 37 | local res, err, _, _ = db:query("UPDATE agw_api SET ip_uri_limit_times=" .. ip_uri_limit_times .. ",ip_uri_limit_seconds=" .. ip_uri_limit_seconds .. ",uri_limit_times=" .. uri_limit_times .. ",uri_limit_seconds=" .. uri_limit_seconds .. ",request_uri=\'" .. request_uri .. "\',original_uri=\'" .. original_uri .. "\',description=" .. description .. " WHERE id=" .. id, 10) 38 | db:set_keepalive(10000, 10) 39 | return res, err 40 | end 41 | 42 | function api_model.getApi(id) 43 | local db = mysql.getDb() 44 | local apis, err, _, _ = db:query("SELECT * FROM agw_api WHERE id=" .. id, 10) 45 | api = nil 46 | if table.getn(apis) > 0 then 47 | api = apis[1] 48 | else 49 | err = "error api id" 50 | end 51 | db:set_keepalive(10000, 10) 52 | return api, err 53 | end 54 | 55 | function api_model.getServiceApis(sid) 56 | local db = mysql.getDb() 57 | local services, err, _, _ = db:query("SELECT * FROM agw_api WHERE service_id=" .. sid, 10) 58 | db:set_keepalive(10000, 10) 59 | return services, err 60 | end 61 | 62 | return api_model 63 | -------------------------------------------------------------------------------- /src/model/domain.lua: -------------------------------------------------------------------------------- 1 | local mysql = require "model.mysql" 2 | local domain_model = {} 3 | 4 | function domain_model.addDomain(name) 5 | local db = mysql.getDb() 6 | local res, err, _, _ = db:query("INSERT INTO agw_domain (name)values(\'" .. name .. "\')", 10) 7 | db:set_keepalive(10000, 100) 8 | return res, err 9 | end 10 | 11 | function domain_model.delete(id) 12 | local db = mysql.getDb() 13 | local res, err, _, _ = db:query("DELETE FROM agw_domain WHERE id=" .. id, 10) 14 | db:set_keepalive(10000, 100) 15 | return res, err 16 | end 17 | 18 | function domain_model.update(id, name) 19 | local db = mysql.getDb() 20 | local res, err, _, _ = db:query("UPDATE agw_domain SET name=\'" .. name .. "\' WHERE id=" .. id, 10) 21 | db:set_keepalive(10000, 100) 22 | return res, err 23 | end 24 | 25 | function domain_model.getDomain(id) 26 | local db = mysql.getDb() 27 | local service, err, _, _ = db:query("SELECT * FROM agw_domain WHERE id=" .. id, 10) 28 | db:set_keepalive(10000, 100) 29 | return service, err 30 | end 31 | 32 | function domain_model.getDomains() 33 | local db = mysql.getDb() 34 | local res, err, _, _ = db:query("SELECT * FROM agw_domain ORDER BY id ASC", 10) 35 | db:set_keepalive(10000, 100) 36 | return res, err 37 | end 38 | 39 | return domain_model 40 | -------------------------------------------------------------------------------- /src/model/module.lua: -------------------------------------------------------------------------------- 1 | local mysql = require "model.mysql" 2 | local service_model = {} 3 | 4 | function service_model.add(domain_id, name, host, description) 5 | description = ndk.set_var.set_quote_sql_str(description) 6 | local db = mysql.getDb() 7 | local res, err, _, _ = db:query("INSERT INTO agw_service (domain_id, name,host,description)values(\'" .. domain_id .. "\',\'" .. name .. "\',\'" .. host .. "\'," .. description .. ")", 10) 8 | db:set_keepalive(10000, 100) 9 | return res, err 10 | end 11 | 12 | function service_model.deleteByDomainId(did) 13 | local db = mysql.getDb() 14 | local res, err, _, _ = db:query("DELETE FROM agw_service WHERE domain_id=" .. did, 10) 15 | db:set_keepalive(10000, 100) 16 | return res, err 17 | end 18 | 19 | function service_model.delete(id) 20 | local db = mysql.getDb() 21 | local res, err, _, _ = db:query("DELETE FROM agw_service WHERE id=" .. id, 10) 22 | db:set_keepalive(10000, 100) 23 | return res, err 24 | end 25 | 26 | function service_model.update(id, name, host, description) 27 | description = ndk.set_var.set_quote_sql_str(description) 28 | local db = mysql.getDb() 29 | local res, err, _, _ = db:query("UPDATE agw_service SET name=\'" .. name .. "\',host=\'" .. host .. "\',description=" .. description .. " WHERE id=" .. id, 10) 30 | db:set_keepalive(10000, 100) 31 | return res, err 32 | end 33 | 34 | function service_model.getService(id) 35 | local db = mysql.getDb() 36 | local services, err, _, _ = db:query("SELECT * FROM agw_service WHERE id=" .. id, 10) 37 | service = nil 38 | if table.getn(services) > 0 then 39 | service = services[1] 40 | else 41 | err = "error service id" 42 | end 43 | db:set_keepalive(10000, 100) 44 | return service, err 45 | end 46 | 47 | function service_model.getServices(domain_id) 48 | local db = mysql.getDb() 49 | local services, err, _, _ = db:query("SELECT * FROM agw_service WHERE domain_id=" .. domain_id, 10) 50 | db:set_keepalive(10000, 100) 51 | return services, err 52 | end 53 | 54 | return service_model 55 | -------------------------------------------------------------------------------- /src/model/mysql.lua: -------------------------------------------------------------------------------- 1 | local config=require "config" 2 | local mysql = require "resty.mysql" 3 | 4 | local log = ngx.log 5 | local ERR = ngx.ERR 6 | local DEBUG = ngx.DEBUG 7 | local mysql_connection = {} 8 | 9 | function mysql_connection.getDb() 10 | local db, err = mysql:new() 11 | local ok, err, errno, sqlstate = db:connect{ 12 | host = config["mysql_host"], 13 | port = config["mysql_port"], 14 | database = config["mysql_db"], 15 | user = config["mysql_user"], 16 | password = config["mysql_pass"], 17 | max_packet_size = 1024 * 1024 } 18 | if not ok then 19 | log(ERR, "failed to connect to mysql", err) 20 | return 21 | end 22 | log(DEBUG, "connected to mysql") 23 | return db 24 | end 25 | 26 | return mysql_connection 27 | -------------------------------------------------------------------------------- /src/model/server.lua: -------------------------------------------------------------------------------- 1 | local mysql = require "model.mysql" 2 | local server_model = {} 3 | 4 | function server_model.add(service_id, ip, port, weight, description, protocol) 5 | description = ndk.set_var.set_quote_sql_str(description) 6 | local db = mysql.getDb() 7 | local res, err, _, _ = db:query("INSERT INTO agw_server(service_id,ip,port,weight,description,protocol)values(\'" .. service_id .. "\',\'" .. ip .. "\',\'" .. port .. "\',\'" .. weight .. "\'," .. description .. ",\'" .. protocol .. "\')", 10) 8 | db:set_keepalive(10000, 100) 9 | return res, err 10 | end 11 | 12 | function server_model.delete(server_id) 13 | local db = mysql.getDb() 14 | local res, err, _, _ = db:query("DELETE FROM agw_server WHERE id=" .. server_id, 10) 15 | db:set_keepalive(10000, 100) 16 | return res, err 17 | end 18 | 19 | function server_model.deleteByServiceId(sid) 20 | local db = mysql.getDb() 21 | local res, err, _, _ = db:query("DELETE FROM agw_server WHERE service_id=" .. sid, 10) 22 | db:set_keepalive(10000, 100) 23 | return res, err 24 | end 25 | 26 | function server_model.update(server_id, ip, port, weight, description, protocol) 27 | description = ndk.set_var.set_quote_sql_str(description) 28 | local db = mysql.getDb() 29 | local res, err, _, _ = db:query("UPDATE agw_server SET ip=\'" .. ip .. "\',port=" .. port .. ",protocol=\'" .. protocol .. "\',weight=\'" .. weight .. "\',description=" .. description .. " WHERE id=" .. server_id, 10) 30 | db:set_keepalive(10000, 100) 31 | return res, err 32 | end 33 | 34 | function server_model.getServers(state) 35 | local db = mysql.getDb() 36 | local servers, _, _, _ = db:query("SELECT * FROM agw_server WHERE status=" .. state, 10) 37 | db:set_keepalive(10000, 100) 38 | if not servers then 39 | return 40 | end 41 | return servers 42 | end 43 | 44 | function server_model.getServiceServers(service_id) 45 | local db = mysql.getDb() 46 | local servers, err, errno, sqlstate = db:query("SELECT * FROM agw_server WHERE service_id=" .. service_id, 10) 47 | return servers, err 48 | end 49 | 50 | function server_model.getServiceServersWithState(service_id, state) 51 | local db = mysql.getDb() 52 | local servers, err, _, _ = db:query("SELECT * FROM agw_server WHERE service_id=" .. service_id .. " AND status=" .. state, 10) 53 | db:set_keepalive(10000, 100) 54 | return servers, err 55 | end 56 | 57 | function server_model.getServer(id) 58 | local db = mysql.getDb() 59 | local servers, err, _, _ = db:query("SELECT * FROM agw_server WHERE id=" .. id, 10) 60 | db:set_keepalive(10000, 100) 61 | server = nil 62 | if table.getn(servers) > 0 then 63 | server = servers[1] 64 | else 65 | err = "error server id" 66 | end 67 | return server, err 68 | end 69 | 70 | function server_model.getServersByMid(mid) 71 | local db = mysql.getDb() 72 | local servers, _, _, _ = db:query("SELECT * FROM agw_server WHERE mid=" .. mid, 10) 73 | db:set_keepalive(10000, 100) 74 | if not servers then 75 | return 76 | end 77 | return servers 78 | end 79 | 80 | function server_model.getAllServers() 81 | local db = mysql.getDb() 82 | local servers, _, _, _ = db:query("SELECT * FROM agw_server", 10) 83 | db:set_keepalive(10000, 100) 84 | if not servers then 85 | return 86 | end 87 | return servers 88 | end 89 | 90 | function server_model.updateState(sid, state) 91 | local db = mysql.getDb() 92 | local res, err, _, _ = db:query("UPDATE agw_server SET status=" .. state .. " WHERE id=" .. sid, 10) 93 | db:set_keepalive(10000, 100) 94 | if not res then 95 | ngx.log(ngx.ERR, "update server state err:", err); 96 | return false 97 | end 98 | return true 99 | end 100 | 101 | return server_model 102 | -------------------------------------------------------------------------------- /src/resty/md5.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | local ffi = require "ffi" 5 | local ffi_new = ffi.new 6 | local ffi_str = ffi.string 7 | local C = ffi.C 8 | local setmetatable = setmetatable 9 | --local error = error 10 | 11 | 12 | local _M = { _VERSION = '0.09' } 13 | 14 | local mt = { __index = _M } 15 | 16 | 17 | ffi.cdef[[ 18 | typedef unsigned long MD5_LONG ; 19 | 20 | enum { 21 | MD5_CBLOCK = 64, 22 | MD5_LBLOCK = MD5_CBLOCK/4 23 | }; 24 | 25 | typedef struct MD5state_st 26 | { 27 | MD5_LONG A,B,C,D; 28 | MD5_LONG Nl,Nh; 29 | MD5_LONG data[MD5_LBLOCK]; 30 | unsigned int num; 31 | } MD5_CTX; 32 | 33 | int MD5_Init(MD5_CTX *c); 34 | int MD5_Update(MD5_CTX *c, const void *data, size_t len); 35 | int MD5_Final(unsigned char *md, MD5_CTX *c); 36 | ]] 37 | 38 | local buf = ffi_new("char[16]") 39 | local ctx_ptr_type = ffi.typeof("MD5_CTX[1]") 40 | 41 | 42 | function _M.new(self) 43 | local ctx = ffi_new(ctx_ptr_type) 44 | if C.MD5_Init(ctx) == 0 then 45 | return nil 46 | end 47 | 48 | return setmetatable({ _ctx = ctx }, mt) 49 | end 50 | 51 | 52 | function _M.update(self, s) 53 | return C.MD5_Update(self._ctx, s, #s) == 1 54 | end 55 | 56 | 57 | function _M.final(self) 58 | if C.MD5_Final(buf, self._ctx) == 1 then 59 | return ffi_str(buf, 16) 60 | end 61 | 62 | return nil 63 | end 64 | 65 | 66 | function _M.reset(self) 67 | return C.MD5_Init(self._ctx) == 1 68 | end 69 | 70 | 71 | return _M 72 | 73 | -------------------------------------------------------------------------------- /src/resty/random.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | local ffi = require "ffi" 5 | local ffi_new = ffi.new 6 | local ffi_str = ffi.string 7 | local C = ffi.C 8 | --local setmetatable = setmetatable 9 | --local error = error 10 | 11 | 12 | local _M = { _VERSION = '0.09' } 13 | 14 | 15 | ffi.cdef[[ 16 | int RAND_bytes(unsigned char *buf, int num); 17 | int RAND_pseudo_bytes(unsigned char *buf, int num); 18 | ]] 19 | 20 | 21 | function _M.bytes(len, strong) 22 | local buf = ffi_new("char[?]", len) 23 | if strong then 24 | if C.RAND_bytes(buf, len) == 0 then 25 | return nil 26 | end 27 | else 28 | C.RAND_pseudo_bytes(buf,len) 29 | end 30 | 31 | return ffi_str(buf, len) 32 | end 33 | 34 | 35 | return _M 36 | 37 | -------------------------------------------------------------------------------- /src/resty/sha.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | local ffi = require "ffi" 5 | 6 | 7 | local _M = { _VERSION = '0.09' } 8 | 9 | 10 | ffi.cdef[[ 11 | typedef unsigned long SHA_LONG; 12 | typedef unsigned long long SHA_LONG64; 13 | 14 | enum { 15 | SHA_LBLOCK = 16 16 | }; 17 | ]]; 18 | 19 | return _M 20 | -------------------------------------------------------------------------------- /src/resty/sha1.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | require "resty.sha" 5 | local ffi = require "ffi" 6 | local ffi_new = ffi.new 7 | local ffi_str = ffi.string 8 | local C = ffi.C 9 | local setmetatable = setmetatable 10 | --local error = error 11 | 12 | 13 | local _M = { _VERSION = '0.09' } 14 | 15 | 16 | local mt = { __index = _M } 17 | 18 | 19 | ffi.cdef[[ 20 | typedef struct SHAstate_st 21 | { 22 | SHA_LONG h0,h1,h2,h3,h4; 23 | SHA_LONG Nl,Nh; 24 | SHA_LONG data[SHA_LBLOCK]; 25 | unsigned int num; 26 | } SHA_CTX; 27 | 28 | int SHA1_Init(SHA_CTX *c); 29 | int SHA1_Update(SHA_CTX *c, const void *data, size_t len); 30 | int SHA1_Final(unsigned char *md, SHA_CTX *c); 31 | ]] 32 | 33 | local digest_len = 20 34 | 35 | local buf = ffi_new("char[?]", digest_len) 36 | local ctx_ptr_type = ffi.typeof("SHA_CTX[1]") 37 | 38 | 39 | function _M.new(self) 40 | local ctx = ffi_new(ctx_ptr_type) 41 | if C.SHA1_Init(ctx) == 0 then 42 | return nil 43 | end 44 | 45 | return setmetatable({ _ctx = ctx }, mt) 46 | end 47 | 48 | 49 | function _M.update(self, s) 50 | return C.SHA1_Update(self._ctx, s, #s) == 1 51 | end 52 | 53 | 54 | function _M.final(self) 55 | if C.SHA1_Final(buf, self._ctx) == 1 then 56 | return ffi_str(buf, digest_len) 57 | end 58 | 59 | return nil 60 | end 61 | 62 | 63 | function _M.reset(self) 64 | return C.SHA1_Init(self._ctx) == 1 65 | end 66 | 67 | 68 | return _M 69 | 70 | -------------------------------------------------------------------------------- /src/resty/sha224.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | require "resty.sha256" 5 | local ffi = require "ffi" 6 | local ffi_new = ffi.new 7 | local ffi_str = ffi.string 8 | local C = ffi.C 9 | local setmetatable = setmetatable 10 | --local error = error 11 | 12 | 13 | local _M = { _VERSION = '0.09' } 14 | 15 | 16 | local mt = { __index = _M } 17 | 18 | 19 | ffi.cdef[[ 20 | int SHA224_Init(SHA256_CTX *c); 21 | int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); 22 | int SHA224_Final(unsigned char *md, SHA256_CTX *c); 23 | ]] 24 | 25 | local digest_len = 28 26 | 27 | local buf = ffi_new("char[?]", digest_len) 28 | local ctx_ptr_type = ffi.typeof("SHA256_CTX[1]") 29 | 30 | 31 | function _M.new(self) 32 | local ctx = ffi_new(ctx_ptr_type) 33 | if C.SHA224_Init(ctx) == 0 then 34 | return nil 35 | end 36 | 37 | return setmetatable({ _ctx = ctx }, mt) 38 | end 39 | 40 | 41 | function _M.update(self, s) 42 | return C.SHA224_Update(self._ctx, s, #s) == 1 43 | end 44 | 45 | 46 | function _M.final(self) 47 | if C.SHA224_Final(buf, self._ctx) == 1 then 48 | return ffi_str(buf, digest_len) 49 | end 50 | 51 | return nil 52 | end 53 | 54 | 55 | function _M.reset(self) 56 | return C.SHA224_Init(self._ctx) == 1 57 | end 58 | 59 | 60 | return _M 61 | -------------------------------------------------------------------------------- /src/resty/sha256.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | require "resty.sha" 5 | local ffi = require "ffi" 6 | local ffi_new = ffi.new 7 | local ffi_str = ffi.string 8 | local C = ffi.C 9 | local setmetatable = setmetatable 10 | --local error = error 11 | 12 | 13 | local _M = { _VERSION = '0.09' } 14 | 15 | 16 | local mt = { __index = _M } 17 | 18 | 19 | ffi.cdef[[ 20 | typedef struct SHA256state_st 21 | { 22 | SHA_LONG h[8]; 23 | SHA_LONG Nl,Nh; 24 | SHA_LONG data[SHA_LBLOCK]; 25 | unsigned int num,md_len; 26 | } SHA256_CTX; 27 | 28 | int SHA256_Init(SHA256_CTX *c); 29 | int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); 30 | int SHA256_Final(unsigned char *md, SHA256_CTX *c); 31 | ]] 32 | 33 | local digest_len = 32 34 | 35 | local buf = ffi_new("char[?]", digest_len) 36 | local ctx_ptr_type = ffi.typeof("SHA256_CTX[1]") 37 | 38 | 39 | function _M.new(self) 40 | local ctx = ffi_new(ctx_ptr_type) 41 | if C.SHA256_Init(ctx) == 0 then 42 | return nil 43 | end 44 | 45 | return setmetatable({ _ctx = ctx }, mt) 46 | end 47 | 48 | 49 | function _M.update(self, s) 50 | return C.SHA256_Update(self._ctx, s, #s) == 1 51 | end 52 | 53 | 54 | function _M.final(self) 55 | if C.SHA256_Final(buf, self._ctx) == 1 then 56 | return ffi_str(buf, digest_len) 57 | end 58 | 59 | return nil 60 | end 61 | 62 | 63 | function _M.reset(self) 64 | return C.SHA256_Init(self._ctx) == 1 65 | end 66 | 67 | 68 | return _M 69 | 70 | -------------------------------------------------------------------------------- /src/resty/sha384.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | require "resty.sha512" 5 | local ffi = require "ffi" 6 | local ffi_new = ffi.new 7 | local ffi_str = ffi.string 8 | local C = ffi.C 9 | local setmetatable = setmetatable 10 | --local error = error 11 | 12 | 13 | local _M = { _VERSION = '0.09' } 14 | 15 | 16 | local mt = { __index = _M } 17 | 18 | 19 | ffi.cdef[[ 20 | int SHA384_Init(SHA512_CTX *c); 21 | int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); 22 | int SHA384_Final(unsigned char *md, SHA512_CTX *c); 23 | ]] 24 | 25 | local digest_len = 48 26 | 27 | local buf = ffi_new("char[?]", digest_len) 28 | local ctx_ptr_type = ffi.typeof("SHA512_CTX[1]") 29 | 30 | 31 | function _M.new(self) 32 | local ctx = ffi_new(ctx_ptr_type) 33 | if C.SHA384_Init(ctx) == 0 then 34 | return nil 35 | end 36 | 37 | return setmetatable({ _ctx = ctx }, mt) 38 | end 39 | 40 | 41 | function _M.update(self, s) 42 | return C.SHA384_Update(self._ctx, s, #s) == 1 43 | end 44 | 45 | 46 | function _M.final(self) 47 | if C.SHA384_Final(buf, self._ctx) == 1 then 48 | return ffi_str(buf, digest_len) 49 | end 50 | 51 | return nil 52 | end 53 | 54 | 55 | function _M.reset(self) 56 | return C.SHA384_Init(self._ctx) == 1 57 | end 58 | 59 | return _M 60 | 61 | -------------------------------------------------------------------------------- /src/resty/sha512.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | require "resty.sha" 5 | local ffi = require "ffi" 6 | local ffi_new = ffi.new 7 | local ffi_str = ffi.string 8 | local C = ffi.C 9 | local setmetatable = setmetatable 10 | --local error = error 11 | 12 | 13 | local _M = { _VERSION = '0.09' } 14 | 15 | 16 | local mt = { __index = _M } 17 | 18 | 19 | ffi.cdef[[ 20 | enum { 21 | SHA512_CBLOCK = SHA_LBLOCK*8 22 | }; 23 | 24 | typedef struct SHA512state_st 25 | { 26 | SHA_LONG64 h[8]; 27 | SHA_LONG64 Nl,Nh; 28 | union { 29 | SHA_LONG64 d[SHA_LBLOCK]; 30 | unsigned char p[SHA512_CBLOCK]; 31 | } u; 32 | unsigned int num,md_len; 33 | } SHA512_CTX; 34 | 35 | int SHA512_Init(SHA512_CTX *c); 36 | int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); 37 | int SHA512_Final(unsigned char *md, SHA512_CTX *c); 38 | ]] 39 | 40 | local digest_len = 64 41 | 42 | local buf = ffi_new("char[?]", digest_len) 43 | local ctx_ptr_type = ffi.typeof("SHA512_CTX[1]") 44 | 45 | 46 | function _M.new(self) 47 | local ctx = ffi_new(ctx_ptr_type) 48 | if C.SHA512_Init(ctx) == 0 then 49 | return nil 50 | end 51 | 52 | return setmetatable({ _ctx = ctx }, mt) 53 | end 54 | 55 | 56 | function _M.update(self, s) 57 | return C.SHA512_Update(self._ctx, s, #s) == 1 58 | end 59 | 60 | 61 | function _M.final(self) 62 | if C.SHA512_Final(buf, self._ctx) == 1 then 63 | return ffi_str(buf, digest_len) 64 | end 65 | 66 | return nil 67 | end 68 | 69 | 70 | function _M.reset(self) 71 | return C.SHA512_Init(self._ctx) == 1 72 | end 73 | 74 | 75 | return _M 76 | -------------------------------------------------------------------------------- /src/resty/string.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) by Yichun Zhang (agentzh) 2 | 3 | 4 | local ffi = require "ffi" 5 | local ffi_new = ffi.new 6 | local ffi_str = ffi.string 7 | local C = ffi.C 8 | --local setmetatable = setmetatable 9 | --local error = error 10 | local tonumber = tonumber 11 | 12 | 13 | local _M = { _VERSION = '0.09' } 14 | 15 | 16 | ffi.cdef[[ 17 | typedef unsigned char u_char; 18 | 19 | u_char * ngx_hex_dump(u_char *dst, const u_char *src, size_t len); 20 | 21 | intptr_t ngx_atoi(const unsigned char *line, size_t n); 22 | ]] 23 | 24 | local str_type = ffi.typeof("uint8_t[?]") 25 | 26 | 27 | function _M.to_hex(s) 28 | local len = #s * 2 29 | local buf = ffi_new(str_type, len) 30 | C.ngx_hex_dump(buf, s, #s) 31 | return ffi_str(buf, len) 32 | end 33 | 34 | 35 | function _M.atoi(s) 36 | return tonumber(C.ngx_atoi(s, #s)) 37 | end 38 | 39 | 40 | return _M 41 | -------------------------------------------------------------------------------- /uri_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/uri_config.png -------------------------------------------------------------------------------- /uris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ffay/proxygateway/d8233f0582415ee78b3817f53998bb70227f1da9/uris.png --------------------------------------------------------------------------------