├── LICENSE ├── README.md ├── assets ├── css │ ├── pages │ │ └── login │ │ │ └── login-1.css │ └── style.bundle.css ├── js │ ├── pages │ │ ├── custom │ │ │ └── login │ │ │ │ └── login-general.js │ │ └── widgets.js │ └── scripts.bundle.js └── plugins │ ├── custom │ ├── fullcalendar │ │ ├── fullcalendar.bundle.css │ │ └── fullcalendar.bundle.js │ └── prismjs │ │ ├── prismjs.bundle.css │ │ └── prismjs.bundle.js │ └── global │ ├── fonts │ ├── @fortawesome │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 │ ├── flaticon │ │ ├── Flaticon.eot │ │ ├── Flaticon.svg │ │ ├── Flaticon.ttf │ │ └── Flaticon.woff │ ├── flaticon2 │ │ ├── Flaticon2.eot │ │ ├── Flaticon2.svg │ │ ├── Flaticon2.ttf │ │ ├── Flaticon2.woff │ │ └── Flaticon2.woff2 │ ├── keenthemes-icons │ │ ├── Ki.eot │ │ ├── Ki.svg │ │ ├── Ki.ttf │ │ ├── Ki.woff │ │ ├── Ki.woff2 │ │ └── ki.css │ ├── line-awesome │ │ ├── la-brands-400.eot │ │ ├── la-brands-400.svg │ │ ├── la-brands-400.ttf │ │ ├── la-brands-400.woff │ │ ├── la-brands-400.woff2 │ │ ├── la-regular-400.eot │ │ ├── la-regular-400.svg │ │ ├── la-regular-400.ttf │ │ ├── la-regular-400.woff │ │ ├── la-regular-400.woff2 │ │ ├── la-solid-900.eot │ │ ├── la-solid-900.svg │ │ ├── la-solid-900.ttf │ │ ├── la-solid-900.woff │ │ └── la-solid-900.woff2 │ ├── socicon │ │ ├── socicon.eot │ │ ├── socicon.svg │ │ ├── socicon.ttf │ │ └── socicon.woff │ └── summernote │ │ ├── summernote.eot │ │ ├── summernote.ttf │ │ ├── summernote.woff │ │ └── summernote.woff2 │ ├── plugins.bundle.css │ └── plugins.bundle.js ├── img ├── admin.png ├── clan_index.png ├── clan_stat.png ├── index.png └── user.png ├── public ├── static │ └── yocool │ │ ├── css │ │ ├── style.css │ │ ├── style1.css │ │ ├── style2.css │ │ └── style3.css │ │ └── images │ │ ├── background-blue.gif │ │ ├── background-cobaltblue.gif │ │ ├── background-cyan.gif │ │ ├── background-green.gif │ │ ├── background-orange.gif │ │ ├── background-pink.gif │ │ ├── background-red.gif │ │ ├── background-violet.gif │ │ ├── background-yellow.gif │ │ ├── banner.png │ │ ├── clanbg.png │ │ ├── flag.png │ │ ├── logo.png │ │ ├── redbox.png │ │ ├── sprite01.png │ │ ├── sprite02.png │ │ └── sprite03.png └── template │ ├── admin │ ├── groups.html │ ├── pool-setting.html │ ├── setting.html │ └── users.html │ ├── base.html │ ├── clan │ ├── panel.html │ ├── progress.html │ ├── public_progress.html │ ├── public_unauthorized.html │ ├── setting.html │ ├── statistics.html │ ├── statistics │ │ ├── statistics1.html │ │ └── statistics2.html │ ├── subscribers.html │ ├── unauthorized.html │ └── user.html │ ├── login.html │ ├── password.html │ ├── public_base.html │ ├── unauthorized.html │ ├── user-info.html │ └── user.html └── ybplugins ├── clan_battle └── battle.py ├── login.py └── settings.py /README.md: -------------------------------------------------------------------------------- 1 | # YoWhite 2 | A template for Yobot 3 | 4 | 本项目仅为模板,请配合 [Yobot](https://github.com/pcrbot/yobot) 使用 5 | 6 | This project is only a template, please use it with [Yobot](https://github.com/pcrbot/yobot) 7 | 8 | ### 受酷Q停运影响,Yobot可能会提前重构,本模板在重构完成前将不会更新 9 | ### Affected by the outage of CoolQ, Yobot may refactor in advance, and this template will not be updated until the refactoring is completed 10 | 11 | ## 注意事项 12 | 13 | ### 本项目的根目录位于\yobot\src\client\ 请进入此文件夹后再根据本项目文件地址进行替换! 14 | ### The root directory of this project is located at \yobot\src\client\ Please enter this folder and then replace it according to the file address of this project! 15 | 16 | ### 本模板仅支持Yobot3.6.3 - Yobot3.6.4-beta3 17 | ### This template only supports Yobot3.6.3-Yobot3.6.4-beta3 18 | 19 | ## 如何使用 How to use 20 | 21 | - 插件版或源码版: 22 | 23 | 直接覆盖,**修改template/base.html和login.html的第6行{{botname}}为你机器人的名字**,重启Yobot 24 | 25 | - 便携版: 26 | 27 | 更换插件版或源码版,再进行上述操作 28 | 29 | 或自行替换文件重新打包 30 | 31 | ## 已知问题 Known issues 32 | 33 | - ~~部分页面无法获取到{{ group_id }}导致无法通过导航栏进入工会战页面~~ 34 | 35 | - ~~在没有加入任何工会时无法访问~~ 36 | 37 | - ~~手机访问可能存在无法点出侧边栏~~ 38 | 39 | ## 代码贡献 Code contribution 40 | 41 | 感谢以下大佬在本项目中提供的支援和帮助 42 | 43 | Thanks to the following users for their support and help in this project 44 | 45 | [@A-kirami](https://github.com/A-kirami) 46 | 47 | [@kaiseixd](https://github.com/kaiseixd) 48 | 49 | [@xuexue49](https://github.com/xuexue49) 50 | 51 | ## 联系我们 Contact us 52 | 53 | Yobot后台美化组(Q群):1143518690 54 | 55 | Yobot background beautification group (QQ group):1143518690 56 | 57 | ## 相关项目 Related Projects 58 | 59 | - [YoCool](https://github.com/A-kirami/YoCool/) 60 | 61 | ## 展示 Display 62 | 63 | 首页 64 | ![Index](img/index.png) 65 | 66 | 用户页 67 | ![User](img/user.png) 68 | 69 | 管理页 70 | ![Admin](img/admin.png) 71 | 72 | 工会战 73 | ![Clan_index](img/clan_index.png) 74 | 75 | 数据统计 76 | ![Clan_stat](img/clan_stat.png) 77 | 78 | -------------------------------------------------------------------------------- /assets/css/pages/login/login-1.css: -------------------------------------------------------------------------------- 1 | .login.login-1 .login-aside .aside-img { 2 | min-height: 450px; } 3 | 4 | .login.login-1 .login-signin, 5 | .login.login-1 .login-signup, 6 | .login.login-1 .login-forgot { 7 | display: none; } 8 | 9 | .login.login-1.login-signin-on .login-signup { 10 | display: none; } 11 | 12 | .login.login-1.login-signin-on .login-signin { 13 | display: block; } 14 | 15 | .login.login-1.login-signin-on .login-forgot { 16 | display: none; } 17 | 18 | .login.login-1.login-signup-on .login-signup { 19 | display: block; } 20 | 21 | .login.login-1.login-signup-on .login-signin { 22 | display: none; } 23 | 24 | .login.login-1.login-signup-on .login-forgot { 25 | display: none; } 26 | 27 | .login.login-1.login-forgot-on .login-signup { 28 | display: none; } 29 | 30 | .login.login-1.login-forgot-on .login-signin { 31 | display: none; } 32 | 33 | .login.login-1.login-forgot-on .login-forgot { 34 | display: block; } 35 | 36 | @media (min-width: 992px) { 37 | .login.login-1 .login-aside { 38 | width: 100%; 39 | max-width: 600px; } 40 | .login.login-1 .login-content { 41 | width: 100%; 42 | max-width: 500px; } 43 | .login.login-1 .login-content .login-form { 44 | width: 100%; 45 | max-width: 450px; } } 46 | 47 | @media (min-width: 992px) and (max-width: 1399.98px) { 48 | .login.login-1 .login-aside { 49 | width: 100%; 50 | max-width: 450px; } } 51 | 52 | @media (max-width: 991.98px) { 53 | .login.login-1 .login-content .login-form { 54 | width: 100%; 55 | max-width: 400px; } } 56 | 57 | @media (max-width: 575.98px) { 58 | .login.login-1 .aside-img { 59 | min-height: 300px !important; 60 | background-size: 400px; } 61 | .login.login-1 .login-content .login-form { 62 | width: 100%; 63 | max-width: 100%; } } 64 | -------------------------------------------------------------------------------- /assets/js/pages/custom/login/login-general.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // Class Definition 4 | var KTLogin = function() { 5 | var _login; 6 | 7 | var _showForm = function(form) { 8 | var cls = 'login-' + form + '-on'; 9 | var form = 'kt_login_' + form + '_form'; 10 | 11 | _login.removeClass('login-forgot-on'); 12 | _login.removeClass('login-signin-on'); 13 | _login.removeClass('login-signup-on'); 14 | 15 | _login.addClass(cls); 16 | 17 | KTUtil.animateClass(KTUtil.getById(form), 'animate__animated animate__backInUp'); 18 | } 19 | 20 | var _handleSignInForm = function() { 21 | var validation; 22 | 23 | // Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/ 24 | validation = FormValidation.formValidation( 25 | KTUtil.getById('kt_login_signin_form'), 26 | { 27 | fields: { 28 | username: { 29 | validators: { 30 | notEmpty: { 31 | message: 'Username is required' 32 | } 33 | } 34 | }, 35 | password: { 36 | validators: { 37 | notEmpty: { 38 | message: 'Password is required' 39 | } 40 | } 41 | } 42 | }, 43 | plugins: { 44 | trigger: new FormValidation.plugins.Trigger(), 45 | submitButton: new FormValidation.plugins.SubmitButton(), 46 | //defaultSubmit: new FormValidation.plugins.DefaultSubmit(), // Uncomment this line to enable normal button submit after form validation 47 | bootstrap: new FormValidation.plugins.Bootstrap() 48 | } 49 | } 50 | ); 51 | 52 | $('#kt_login_signin_submit').on('click', function (e) { 53 | e.preventDefault(); 54 | 55 | validation.validate().then(function(status) { 56 | if (status == 'Valid') { 57 | swal.fire({ 58 | text: "All is cool! Now you submit this form", 59 | icon: "success", 60 | buttonsStyling: false, 61 | confirmButtonText: "Ok, got it!", 62 | customClass: { 63 | confirmButton: "btn font-weight-bold btn-light-primary" 64 | } 65 | }).then(function() { 66 | KTUtil.scrollTop(); 67 | }); 68 | } else { 69 | swal.fire({ 70 | text: "Sorry, looks like there are some errors detected, please try again.", 71 | icon: "error", 72 | buttonsStyling: false, 73 | confirmButtonText: "Ok, got it!", 74 | customClass: { 75 | confirmButton: "btn font-weight-bold btn-light-primary" 76 | } 77 | }).then(function() { 78 | KTUtil.scrollTop(); 79 | }); 80 | } 81 | }); 82 | }); 83 | 84 | // Handle forgot button 85 | $('#kt_login_forgot').on('click', function (e) { 86 | e.preventDefault(); 87 | _showForm('forgot'); 88 | }); 89 | 90 | // Handle signup 91 | $('#kt_login_signup').on('click', function (e) { 92 | e.preventDefault(); 93 | _showForm('signup'); 94 | }); 95 | } 96 | 97 | var _handleSignUpForm = function(e) { 98 | var validation; 99 | var form = KTUtil.getById('kt_login_signup_form'); 100 | 101 | // Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/ 102 | validation = FormValidation.formValidation( 103 | form, 104 | { 105 | fields: { 106 | fullname: { 107 | validators: { 108 | notEmpty: { 109 | message: 'Username is required' 110 | } 111 | } 112 | }, 113 | email: { 114 | validators: { 115 | notEmpty: { 116 | message: 'Email address is required' 117 | }, 118 | emailAddress: { 119 | message: 'The value is not a valid email address' 120 | } 121 | } 122 | }, 123 | password: { 124 | validators: { 125 | notEmpty: { 126 | message: 'The password is required' 127 | } 128 | } 129 | }, 130 | cpassword: { 131 | validators: { 132 | notEmpty: { 133 | message: 'The password confirmation is required' 134 | }, 135 | identical: { 136 | compare: function() { 137 | return form.querySelector('[name="password"]').value; 138 | }, 139 | message: 'The password and its confirm are not the same' 140 | } 141 | } 142 | }, 143 | agree: { 144 | validators: { 145 | notEmpty: { 146 | message: 'You must accept the terms and conditions' 147 | } 148 | } 149 | }, 150 | }, 151 | plugins: { 152 | trigger: new FormValidation.plugins.Trigger(), 153 | bootstrap: new FormValidation.plugins.Bootstrap() 154 | } 155 | } 156 | ); 157 | 158 | $('#kt_login_signup_submit').on('click', function (e) { 159 | e.preventDefault(); 160 | 161 | validation.validate().then(function(status) { 162 | if (status == 'Valid') { 163 | swal.fire({ 164 | text: "All is cool! Now you submit this form", 165 | icon: "success", 166 | buttonsStyling: false, 167 | confirmButtonText: "Ok, got it!", 168 | customClass: { 169 | confirmButton: "btn font-weight-bold btn-light-primary" 170 | } 171 | }).then(function() { 172 | KTUtil.scrollTop(); 173 | }); 174 | } else { 175 | swal.fire({ 176 | text: "Sorry, looks like there are some errors detected, please try again.", 177 | icon: "error", 178 | buttonsStyling: false, 179 | confirmButtonText: "Ok, got it!", 180 | customClass: { 181 | confirmButton: "btn font-weight-bold btn-light-primary" 182 | } 183 | }).then(function() { 184 | KTUtil.scrollTop(); 185 | }); 186 | } 187 | }); 188 | }); 189 | 190 | // Handle cancel button 191 | $('#kt_login_signup_cancel').on('click', function (e) { 192 | e.preventDefault(); 193 | 194 | _showForm('signin'); 195 | }); 196 | } 197 | 198 | var _handleForgotForm = function(e) { 199 | var validation; 200 | 201 | // Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/ 202 | validation = FormValidation.formValidation( 203 | KTUtil.getById('kt_login_forgot_form'), 204 | { 205 | fields: { 206 | email: { 207 | validators: { 208 | notEmpty: { 209 | message: 'Email address is required' 210 | }, 211 | emailAddress: { 212 | message: 'The value is not a valid email address' 213 | } 214 | } 215 | } 216 | }, 217 | plugins: { 218 | trigger: new FormValidation.plugins.Trigger(), 219 | bootstrap: new FormValidation.plugins.Bootstrap() 220 | } 221 | } 222 | ); 223 | 224 | // Handle submit button 225 | $('#kt_login_forgot_submit').on('click', function (e) { 226 | e.preventDefault(); 227 | 228 | validation.validate().then(function(status) { 229 | if (status == 'Valid') { 230 | // Submit form 231 | KTUtil.scrollTop(); 232 | } else { 233 | swal.fire({ 234 | text: "Sorry, looks like there are some errors detected, please try again.", 235 | icon: "error", 236 | buttonsStyling: false, 237 | confirmButtonText: "Ok, got it!", 238 | customClass: { 239 | confirmButton: "btn font-weight-bold btn-light-primary" 240 | } 241 | }).then(function() { 242 | KTUtil.scrollTop(); 243 | }); 244 | } 245 | }); 246 | }); 247 | 248 | // Handle cancel button 249 | $('#kt_login_forgot_cancel').on('click', function (e) { 250 | e.preventDefault(); 251 | 252 | _showForm('signin'); 253 | }); 254 | } 255 | 256 | // Public Functions 257 | return { 258 | // public functions 259 | init: function() { 260 | _login = $('#kt_login'); 261 | 262 | _handleSignInForm(); 263 | _handleSignUpForm(); 264 | _handleForgotForm(); 265 | } 266 | }; 267 | }(); 268 | 269 | // Class Initialization 270 | jQuery(document).ready(function() { 271 | KTLogin.init(); 272 | }); 273 | -------------------------------------------------------------------------------- /assets/plugins/custom/prismjs/prismjs.bundle.css: -------------------------------------------------------------------------------- 1 | /** 2 | * prism.js default theme for JavaScript, CSS and HTML 3 | * Based on dabblet (http://dabblet.com) 4 | * @author Lea Verou 5 | */ 6 | code[class*="language-"], 7 | pre[class*="language-"] { 8 | color: black; 9 | background: none; 10 | text-shadow: 0 1px white; 11 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 12 | font-size: 1em; 13 | text-align: left; 14 | white-space: pre; 15 | word-spacing: normal; 16 | word-break: normal; 17 | word-wrap: normal; 18 | line-height: 1.5; 19 | -moz-tab-size: 4; 20 | -o-tab-size: 4; 21 | tab-size: 4; 22 | -webkit-hyphens: none; 23 | -ms-hyphens: none; 24 | hyphens: none; } 25 | 26 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, 27 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 28 | text-shadow: none; 29 | background: #b3d4fc; } 30 | 31 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 32 | text-shadow: none; 33 | background: #b3d4fc; } 34 | 35 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, 36 | code[class*="language-"]::selection, code[class*="language-"] ::selection { 37 | text-shadow: none; 38 | background: #b3d4fc; } 39 | 40 | @media print { 41 | code[class*="language-"], 42 | pre[class*="language-"] { 43 | text-shadow: none; } } 44 | 45 | /* Code blocks */ 46 | pre[class*="language-"] { 47 | padding: 1em; 48 | margin: .5em 0; 49 | overflow: auto; } 50 | 51 | :not(pre) > code[class*="language-"], 52 | pre[class*="language-"] { 53 | background: #f5f2f0; } 54 | 55 | /* Inline code */ 56 | :not(pre) > code[class*="language-"] { 57 | padding: .1em; 58 | border-radius: .3em; 59 | white-space: normal; } 60 | 61 | .token.comment, 62 | .token.prolog, 63 | .token.doctype, 64 | .token.cdata { 65 | color: slategray; } 66 | 67 | .token.punctuation { 68 | color: #999; } 69 | 70 | .token.namespace { 71 | opacity: .7; } 72 | 73 | .token.property, 74 | .token.tag, 75 | .token.boolean, 76 | .token.number, 77 | .token.constant, 78 | .token.symbol, 79 | .token.deleted { 80 | color: #905; } 81 | 82 | .token.selector, 83 | .token.attr-name, 84 | .token.string, 85 | .token.char, 86 | .token.builtin, 87 | .token.inserted { 88 | color: #690; } 89 | 90 | .token.operator, 91 | .token.entity, 92 | .token.url, 93 | .language-css .token.string, 94 | .style .token.string { 95 | color: #9a6e3a; 96 | background: rgba(255, 255, 255, 0.5); } 97 | 98 | .token.atrule, 99 | .token.attr-value, 100 | .token.keyword { 101 | color: #07a; } 102 | 103 | .token.function, 104 | .token.class-name { 105 | color: #DD4A68; } 106 | 107 | .token.regex, 108 | .token.important, 109 | .token.variable { 110 | color: #e90; } 111 | 112 | .token.important, 113 | .token.bold { 114 | font-weight: bold; } 115 | 116 | .token.italic { 117 | font-style: italic; } 118 | 119 | .token.entity { 120 | cursor: help; } 121 | -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-brands-400.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-brands-400.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-brands-400.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-brands-400.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-regular-400.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-regular-400.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-regular-400.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-regular-400.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-solid-900.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-solid-900.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-solid-900.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/@fortawesome/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/@fortawesome/fa-solid-900.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/flaticon/Flaticon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/flaticon/Flaticon.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/flaticon/Flaticon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/flaticon/Flaticon.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/flaticon/Flaticon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/flaticon/Flaticon.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/flaticon2/Flaticon2.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/flaticon2/Flaticon2.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/flaticon2/Flaticon2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/flaticon2/Flaticon2.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/flaticon2/Flaticon2.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/flaticon2/Flaticon2.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/flaticon2/Flaticon2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/flaticon2/Flaticon2.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/keenthemes-icons/Ki.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/keenthemes-icons/Ki.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/keenthemes-icons/Ki.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/keenthemes-icons/Ki.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/keenthemes-icons/Ki.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/keenthemes-icons/Ki.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/keenthemes-icons/Ki.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/keenthemes-icons/Ki.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/keenthemes-icons/ki.css: -------------------------------------------------------------------------------- 1 | /* 2 | Keenthemes Icons Font: Ki 3 | Creation date: 25/01/2020 4 | */ 5 | 6 | @font-face { 7 | font-family: "Ki"; 8 | src: url("./Ki.eot"); 9 | src: url("./Ki.eot?#iefix") format("embedded-opentype"), 10 | url("./Ki.woff") format("woff"), 11 | url("./Ki.ttf") format("truetype"), 12 | url("./Ki.svg#Ki") format("svg"); 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | 17 | .ki { 18 | font-size: 1rem; 19 | } 20 | 21 | .ki:before { 22 | font-family: "Ki"; 23 | font-style: normal; 24 | font-weight: normal; 25 | font-variant: normal; 26 | line-height: 1; 27 | text-decoration: inherit; 28 | text-rendering: optimizeLegibility; 29 | text-transform: none; 30 | -moz-osx-font-smoothing: grayscale; 31 | -webkit-font-smoothing: antialiased; 32 | font-smoothing: antialiased; 33 | } 34 | 35 | .ki-double-arrow-next:before { content: "\f100"; } 36 | .ki-double-arrow-back:before { content: "\f101"; } 37 | .ki-double-arrow-down:before { content: "\f102"; } 38 | .ki-double-arrow-up:before { content: "\f103"; } 39 | .ki-long-arrow-back:before { content: "\f104"; } 40 | .ki-arrow-next:before { content: "\f105"; } 41 | .ki-arrow-back:before { content: "\f106"; } 42 | .ki-long-arrow-next:before { content: "\f107"; } 43 | .ki-check:before { content: "\f108"; } 44 | .ki-arrow-down:before { content: "\f109"; } 45 | .ki-minus:before { content: "\f10a"; } 46 | .ki-long-arrow-down:before { content: "\f10b"; } 47 | .ki-long-arrow-up:before { content: "\f10c"; } 48 | .ki-plus:before { content: "\f10d"; } 49 | .ki-arrow-up:before { content: "\f10e"; } 50 | .ki-round:before { content: "\f10f"; } 51 | .ki-reload:before { content: "\f110"; } 52 | .ki-refresh:before { content: "\f111"; } 53 | .ki-solid-plus:before { content: "\f112"; } 54 | .ki-bold-close:before { content: "\f113"; } 55 | .ki-solid-minus:before { content: "\f114"; } 56 | .ki-hide:before { content: "\f115"; } 57 | .ki-code:before { content: "\f116"; } 58 | .ki-copy:before { content: "\f117"; } 59 | .ki-up-and-down:before { content: "\f118"; } 60 | .ki-left-and-right:before { content: "\f119"; } 61 | .ki-bold-triangle-bottom:before { content: "\f11a"; } 62 | .ki-bold-triangle-right:before { content: "\f11b"; } 63 | .ki-bold-triangle-top:before { content: "\f11c"; } 64 | .ki-bold-triangle-left:before { content: "\f11d"; } 65 | .ki-bold-double-arrow-up:before { content: "\f11e"; } 66 | .ki-bold-double-arrow-next:before { content: "\f11f"; } 67 | .ki-bold-double-arrow-back:before { content: "\f120"; } 68 | .ki-bold-double-arrow-down:before { content: "\f121"; } 69 | .ki-bold-arrow-down:before { content: "\f122"; } 70 | .ki-bold-arrow-next:before { content: "\f123"; } 71 | .ki-bold-arrow-back:before { content: "\f124"; } 72 | .ki-bold-arrow-up:before { content: "\f125"; } 73 | .ki-bold-check:before { content: "\f126"; } 74 | .ki-bold-wide-arrow-down:before { content: "\f127"; } 75 | .ki-bold-wide-arrow-up:before { content: "\f128"; } 76 | .ki-bold-wide-arrow-next:before { content: "\f129"; } 77 | .ki-bold-wide-arrow-back:before { content: "\f12a"; } 78 | .ki-bold-long-arrow-up:before { content: "\f12b"; } 79 | .ki-bold-long-arrow-down:before { content: "\f12c"; } 80 | .ki-bold-long-arrow-back:before { content: "\f12d"; } 81 | .ki-bold-long-arrow-next:before { content: "\f12e"; } 82 | .ki-bold-check-1:before { content: "\f12f"; } 83 | .ki-close:before { content: "\f130"; } 84 | .ki-more-ver:before { content: "\f131"; } 85 | .ki-bold-more-ver:before { content: "\f132"; } 86 | .ki-more-hor:before { content: "\f133"; } 87 | .ki-bold-more-hor:before { content: "\f134"; } 88 | .ki-bold-menu:before { content: "\f135"; } 89 | .ki-drag:before { content: "\f136"; } 90 | .ki-bold-sort:before { content: "\f137"; } 91 | .ki-eye:before { content: "\f138"; } 92 | .ki-outline-info:before { content: "\f139"; } 93 | .ki-menu:before { content: "\f13a"; } 94 | .ki-menu-grid:before { content: "\f13b"; } 95 | .ki-wrench:before { content: "\f13c"; } 96 | .ki-gear:before { content: "\f13d"; } 97 | .ki-info:before { content: "\f13e"; } 98 | .ki-calendar-2:before { content: "\f13f"; } 99 | .ki-calendar:before { content: "\f140"; } 100 | .ki-calendar-today:before { content: "\f141"; } 101 | .ki-clock:before { content: "\f142"; } -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-brands-400.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-brands-400.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-brands-400.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-brands-400.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-regular-400.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-regular-400.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-regular-400.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-regular-400.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-solid-900.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-solid-900.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-solid-900.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/line-awesome/la-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/line-awesome/la-solid-900.woff2 -------------------------------------------------------------------------------- /assets/plugins/global/fonts/socicon/socicon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/socicon/socicon.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/socicon/socicon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/socicon/socicon.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/socicon/socicon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/socicon/socicon.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/summernote/summernote.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/summernote/summernote.eot -------------------------------------------------------------------------------- /assets/plugins/global/fonts/summernote/summernote.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/summernote/summernote.ttf -------------------------------------------------------------------------------- /assets/plugins/global/fonts/summernote/summernote.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/summernote/summernote.woff -------------------------------------------------------------------------------- /assets/plugins/global/fonts/summernote/summernote.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/assets/plugins/global/fonts/summernote/summernote.woff2 -------------------------------------------------------------------------------- /img/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/img/admin.png -------------------------------------------------------------------------------- /img/clan_index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/img/clan_index.png -------------------------------------------------------------------------------- /img/clan_stat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/img/clan_stat.png -------------------------------------------------------------------------------- /img/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/img/index.png -------------------------------------------------------------------------------- /img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/img/user.png -------------------------------------------------------------------------------- /public/static/yocool/css/style.css: -------------------------------------------------------------------------------- 1 | /* style */ 2 | 3 | * { 4 | moz-user-select: -moz-none; 5 | -moz-user-select: none; 6 | -o-user-select:none; 7 | -khtml-user-select:none; 8 | -ms-user-select:none; 9 | user-select:none; 10 | } 11 | 12 | *:not(input,textarea) { 13 | -webkit-touch-callout: none; 14 | -webkit-user-select: none; 15 | } 16 | 17 | html { 18 | _background: url(about:blank); 19 | } 20 | 21 | body { 22 | font-family: Arial, Tahoma, sans-serif; 23 | text-align: center; 24 | margin: 0px; 25 | } 26 | 27 | h1{ 28 | margin-top: 60px; 29 | } 30 | 31 | .big { 32 | font-size: 32px; 33 | } 34 | 35 | .exbig { 36 | font-size: 48px; 37 | } 38 | 39 | .exxbig { 40 | font-size: 76px; 41 | } 42 | 43 | .el-row { 44 | margin-bottom: 15px; 45 | } 46 | 47 | el-button { 48 | width: 80px; 49 | } 50 | 51 | .buttons-row { 52 | display: flex; 53 | justify-content: space-between; 54 | margin-bottom: 30px; 55 | } 56 | 57 | .buttons-row .el-button { 58 | font-size: 14px; 59 | min-width: 100px; 60 | height: 34px; 61 | border-radius: 5px; 62 | } 63 | 64 | .el-menu-item { 65 | padding: 5px 20px; 66 | } 67 | 68 | .el-menu--horizontal .el-menu-item:not(.is-disabled):hover { 69 | outline: 0; 70 | color: #ffffff; 71 | } 72 | 73 | .clanname { 74 | background: url("../images/banner.png") no-repeat; 75 | text-align: center; 76 | width: 320px; 77 | height: 60px; 78 | background-size: 320px 60px; 79 | color: #FFF; 80 | font-size: 20px; 81 | margin: 0 auto; 82 | margin-top: 70px; 83 | margin-bottom: -3%; 84 | line-height: 30px; 85 | } 86 | 87 | .clanbg { 88 | background: url("../images/clanbg.png") no-repeat center; 89 | text-align: center; 90 | width: 100%; 91 | height: 300px; 92 | transform: scale(0.75); 93 | margin: 0 auto; 94 | display: block; 95 | } 96 | 97 | /* logo */ 98 | 99 | @media only screen and (min-width: 1080px) { 100 | .logo { 101 | width: 135px; 102 | height: 45px; 103 | background: url("../images/logo.png") no-repeat center; 104 | background-size: 100%; 105 | position: fixed; 106 | z-index: 100; 107 | left: 50%; 108 | right: 50%; 109 | transform: translate(-50%, 35%); 110 | } 111 | 112 | .url { 113 | display: block; 114 | width: 100%; 115 | height: 100%; 116 | } 117 | 118 | } 119 | 120 | .background-alpha { 121 | position: fixed; 122 | width: 100%; 123 | height: 100%; 124 | z-index: -1; 125 | background-color: rgb(255 255 255 / 85%); 126 | top: 0; 127 | bottom: 0; 128 | left: 0; 129 | right: 0; 130 | } 131 | -------------------------------------------------------------------------------- /public/static/yocool/css/style1.css: -------------------------------------------------------------------------------- 1 | .el-button { 2 | color: #FFF; 3 | background-color: #f5b459; 4 | border-color: #f5b459; 5 | } 6 | 7 | .el-button--info { 8 | background: #f5b459; 9 | border-color: #f5b459; 10 | color: #FFF; 11 | } 12 | 13 | .el-button--info.is-active, 14 | .el-button--info:active { 15 | background: #dc9e47; 16 | border-color: #dc9e47; 17 | color: #FFF; 18 | } 19 | 20 | .el-button--info:active { 21 | outline: 0 22 | } 23 | 24 | .el-button--info:focus, 25 | .el-button--info:hover { 26 | background: #fdcd88; 27 | border-color: #fdcd88; 28 | color: #FFF; 29 | } 30 | 31 | .el-button--info.is-disabled, 32 | .el-button--info.is-disabled:active, 33 | .el-button--info.is-disabled:focus, 34 | .el-button--info.is-disabled:hover { 35 | color: #FFF; 36 | background-color: #c8c9cc; 37 | border-color: #c8c9cc 38 | } 39 | 40 | .el-button--info.is-plain { 41 | color: #909399; 42 | background: #f4f4f5; 43 | border-color: #d3d4d6 44 | } 45 | 46 | .el-button--info.is-plain:focus, 47 | .el-button--info.is-plain:hover { 48 | background: #909399; 49 | border-color: #909399; 50 | color: #FFF 51 | } 52 | 53 | .el-button--info.is-plain:active { 54 | background: #82848a; 55 | border-color: #82848a; 56 | color: #FFF; 57 | outline: 0 58 | } 59 | 60 | .el-button--info.is-plain.is-disabled, 61 | .el-button--info.is-plain.is-disabled:active, 62 | .el-button--info.is-plain.is-disabled:focus, 63 | .el-button--info.is-plain.is-disabled:hover { 64 | color: #bcbec2; 65 | background-color: #f4f4f5; 66 | border-color: #e9e9eb 67 | } 68 | 69 | .background { 70 | position: fixed; 71 | width: 100%; 72 | height: 100%; 73 | z-index: -100; 74 | background: url("../images/background-pink.gif") repeat center top; 75 | top: 0; 76 | bottom: 0; 77 | left: 0; 78 | right: 0; 79 | transition: transform 330ms; 80 | transition-timing-function: ease-in-out; 81 | transform: translate3d(0, 0, 0); 82 | } 83 | 84 | /* topmenu */ 85 | 86 | .el-menu--horizontal>.el-menu-item { 87 | float: right; 88 | height: 60px; 89 | line-height: 60px; 90 | margin: 0; 91 | } 92 | 93 | .el-menu.el-menu--horizontal { 94 | border-bottom: solid 1px #FF9800; 95 | } 96 | 97 | .el-menu { 98 | list-style: none; 99 | position: relative; 100 | margin: 0; 101 | padding-left: 0; 102 | background-color: #ffaf38; 103 | } 104 | 105 | .el-menu--horizontal>.el-menu-item.is-active { 106 | border-bottom: 2px solid #FF5722; 107 | color: #ffffff; 108 | } 109 | 110 | .el-menu--horizontal>.el-menu-item:not(.is-disabled):hover { 111 | background-color: #FF5722; 112 | } 113 | 114 | .el-menu--horizontal>.el-menu-item { 115 | border-bottom: 2px solid transparent; 116 | color: #ffffff; 117 | } 118 | 119 | .el-page-header__left::after { 120 | content: ""; 121 | position: absolute; 122 | width: 1px; 123 | height: 16px; 124 | right: -20px; 125 | top: 50%; 126 | -webkit-transform: translateY(-50%); 127 | transform: translateY(-50%); 128 | background-color: #FFC107; 129 | } 130 | 131 | .el-page-header__title { 132 | font-size: 14px; 133 | font-weight: 500; 134 | color: #fff; 135 | } 136 | 137 | .el-icon-back:before { 138 | content: "\e6ea"; 139 | color: #fff; 140 | } 141 | 142 | .el-page-header { 143 | display: flex; 144 | line-height: 24px; 145 | position: absolute; 146 | z-index: 100; 147 | top: 25px; 148 | left: 10px; 149 | } 150 | 151 | /* Toolbar */ 152 | #topToolbar { 153 | _display: none; 154 | width: 100%; 155 | line-height: 40px; 156 | /* background:#101010; */ 157 | /* border-bottom:2px solid #409F89; */ 158 | position: fixed; 159 | top: -15px; 160 | left: 0; 161 | _top: 0; 162 | _position: absolute; 163 | _top: expression(documentElement.scrollTop); 164 | z-index: 999; 165 | } 166 | 167 | #bottomToolbar { 168 | width: 100%; 169 | height: 22px; 170 | line-height: 22px; 171 | background: #ffaa00; 172 | /* border-top:2px solid #409F89; */ 173 | position: fixed; 174 | bottom: 0; 175 | left: 0; 176 | _position: absolute; 177 | _top: expression(documentElement.scrollTop+documentElement.clientHeight-this.offsetHeight); 178 | z-index: 999; 179 | font-size: 13px; 180 | color: #FFF; 181 | } 182 | 183 | #bottomToolbar a { 184 | color: #FFF; 185 | } 186 | 187 | /* progress */ 188 | 189 | progress { 190 | display: inline-block; 191 | vertical-align: baseline 192 | } 193 | 194 | @-webkit-keyframes progress-bar-stripes { 195 | from { 196 | background-position: 40px 0 197 | } 198 | 199 | to { 200 | background-position: 0 0 201 | } 202 | } 203 | 204 | @-o-keyframes progress-bar-stripes { 205 | from { 206 | background-position: 40px 0 207 | } 208 | 209 | to { 210 | background-position: 0 0 211 | } 212 | } 213 | 214 | @keyframes progress-bar-stripes { 215 | from { 216 | background-position: 40px 0 217 | } 218 | 219 | to { 220 | background-position: 0 0 221 | } 222 | } 223 | 224 | .progress { 225 | height: 15px; 226 | margin-bottom: 6px; 227 | overflow: hidden; 228 | background-color: #f5f5f5; 229 | border-radius: 4px; 230 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); 231 | box-shadow: none; 232 | } 233 | 234 | .progress-bar { 235 | float: left; 236 | width: 0; 237 | height: 100%; 238 | font-size: 12px; 239 | line-height: 20px; 240 | color: #fff; 241 | text-align: center; 242 | background-color: #ffbc5d; 243 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); 244 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); 245 | -webkit-transition: width .6s ease; 246 | -o-transition: width .6s ease; 247 | transition: width .6s ease; 248 | box-shadow: none; 249 | } 250 | 251 | .progress-bar-striped, 252 | .progress-striped .progress-bar { 253 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 254 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 255 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 256 | -webkit-background-size: 40px 40px; 257 | background-size: 40px 40px 258 | } 259 | 260 | .progress-bar.active, 261 | .progress.active .progress-bar { 262 | -webkit-animation: progress-bar-stripes 2s linear infinite; 263 | -o-animation: progress-bar-stripes 2s linear infinite; 264 | animation: progress-bar-stripes 2s linear infinite 265 | } 266 | 267 | /* CharacterspriteAnime */ 268 | 269 | .character-container { 270 | width: 200px; 271 | height: 200px; 272 | overflow: hidden; 273 | background: url("../images/sprite01.png"); 274 | background-size: 100%; 275 | } 276 | 277 | .character-container.char { 278 | animation: spriteAnimechar 700ms steps(18) infinite; 279 | } 280 | 281 | @keyframes spriteAnimechar { 282 | 0% { 283 | background-position: 0 0; 284 | } 285 | 286 | 100% { 287 | background-position: 0 -3600px; 288 | } 289 | } -------------------------------------------------------------------------------- /public/static/yocool/css/style2.css: -------------------------------------------------------------------------------- 1 | .el-button { 2 | color: #FFF; 3 | background-color: #00004c; 4 | border-color: #00004c; 5 | } 6 | 7 | .el-button--info { 8 | background: #00004c; 9 | border-color: #00004c; 10 | color: #FFF; 11 | } 12 | 13 | .el-button--info.is-active, 14 | .el-button--info:active { 15 | background: #000038; 16 | border-color: #000038; 17 | color: #FFF; 18 | } 19 | 20 | .el-button--info:active { 21 | outline: 0 22 | } 23 | 24 | .el-button--info:focus, 25 | .el-button--info:hover { 26 | background: #000064; 27 | border-color: #00064; 28 | color: #FFF; 29 | } 30 | 31 | .el-button--info.is-disabled, 32 | .el-button--info.is-disabled:active, 33 | .el-button--info.is-disabled:focus, 34 | .el-button--info.is-disabled:hover { 35 | color: #FFF; 36 | background-color: #c8c9cc; 37 | border-color: #c8c9cc 38 | } 39 | 40 | .el-button--info.is-plain { 41 | color: #909399; 42 | background: #f4f4f5; 43 | border-color: #d3d4d6 44 | } 45 | 46 | .el-button--info.is-plain:focus, 47 | .el-button--info.is-plain:hover { 48 | background: #909399; 49 | border-color: #909399; 50 | color: #FFF 51 | } 52 | 53 | .el-button--info.is-plain:active { 54 | background: #82848a; 55 | border-color: #82848a; 56 | color: #FFF; 57 | outline: 0 58 | } 59 | 60 | .el-button--info.is-plain.is-disabled, 61 | .el-button--info.is-plain.is-disabled:active, 62 | .el-button--info.is-plain.is-disabled:focus, 63 | .el-button--info.is-plain.is-disabled:hover { 64 | color: #bcbec2; 65 | background-color: #f4f4f5; 66 | border-color: #e9e9eb 67 | } 68 | 69 | .background { 70 | position: fixed; 71 | width: 100%; 72 | height: 100%; 73 | z-index: -100; 74 | background: url("../images/background-blue.gif") repeat center top; 75 | top: 0; 76 | bottom: 0; 77 | left: 0; 78 | right: 0; 79 | transition: transform 330ms; 80 | transition-timing-function: ease-in-out; 81 | transform: translate3d(0, 0, 0); 82 | } 83 | 84 | /* topmenu */ 85 | 86 | .el-menu--horizontal>.el-menu-item { 87 | float: right; 88 | height: 60px; 89 | line-height: 60px; 90 | margin: 0; 91 | } 92 | 93 | .el-menu.el-menu--horizontal { 94 | border-bottom: solid 1px #000068; 95 | } 96 | 97 | .el-menu { 98 | list-style: none; 99 | position: relative; 100 | margin: 0; 101 | padding-left: 0; 102 | background-color: #000068; 103 | } 104 | 105 | .el-menu--horizontal>.el-menu-item.is-active { 106 | border-bottom: 2px solid #000090; 107 | color: #ffffff; 108 | } 109 | 110 | .el-menu--horizontal>.el-menu-item:not(.is-disabled):hover { 111 | background-color: #000090; 112 | } 113 | 114 | .el-menu--horizontal>.el-menu-item { 115 | border-bottom: 2px solid transparent; 116 | color: #ffffff; 117 | } 118 | 119 | .el-page-header__left::after { 120 | content: ""; 121 | position: absolute; 122 | width: 1px; 123 | height: 16px; 124 | right: -20px; 125 | top: 50%; 126 | -webkit-transform: translateY(-50%); 127 | transform: translateY(-50%); 128 | background-color: #000068; 129 | } 130 | 131 | .el-page-header__title { 132 | font-size: 14px; 133 | font-weight: 500; 134 | color: #fff; 135 | } 136 | 137 | .el-icon-back:before { 138 | content: "\e6ea"; 139 | color: #fff; 140 | } 141 | 142 | .el-page-header { 143 | display: flex; 144 | line-height: 24px; 145 | position: absolute; 146 | z-index: 100; 147 | top: 25px; 148 | left: 10px; 149 | } 150 | 151 | /* Toolbar */ 152 | #topToolbar { 153 | _display: none; 154 | width: 100%; 155 | line-height: 40px; 156 | /* background:#101010; */ 157 | /* border-bottom:2px solid #409F89; */ 158 | position: fixed; 159 | top: -15px; 160 | left: 0; 161 | _top: 0; 162 | _position: absolute; 163 | _top: expression(documentElement.scrollTop); 164 | z-index: 999; 165 | } 166 | 167 | #bottomToolbar { 168 | width: 100%; 169 | height: 22px; 170 | line-height: 22px; 171 | background: #000068; 172 | /* border-top:2px solid #409F89; */ 173 | position: fixed; 174 | bottom: 0; 175 | left: 0; 176 | _position: absolute; 177 | _top: expression(documentElement.scrollTop+documentElement.clientHeight-this.offsetHeight); 178 | z-index: 999; 179 | font-size: 13px; 180 | color: #FFF; 181 | } 182 | 183 | #bottomToolbar a { 184 | color: #FFF; 185 | } 186 | 187 | /* progress */ 188 | 189 | progress { 190 | display: inline-block; 191 | vertical-align: baseline 192 | } 193 | 194 | @-webkit-keyframes progress-bar-stripes { 195 | from { 196 | background-position: 40px 0 197 | } 198 | 199 | to { 200 | background-position: 0 0 201 | } 202 | } 203 | 204 | @-o-keyframes progress-bar-stripes { 205 | from { 206 | background-position: 40px 0 207 | } 208 | 209 | to { 210 | background-position: 0 0 211 | } 212 | } 213 | 214 | @keyframes progress-bar-stripes { 215 | from { 216 | background-position: 40px 0 217 | } 218 | 219 | to { 220 | background-position: 0 0 221 | } 222 | } 223 | 224 | .progress { 225 | height: 15px; 226 | margin-bottom: 6px; 227 | overflow: hidden; 228 | background-color: #f5f5f5; 229 | border-radius: 4px; 230 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); 231 | box-shadow: none; 232 | } 233 | 234 | .progress-bar { 235 | float: left; 236 | width: 0; 237 | height: 100%; 238 | font-size: 12px; 239 | line-height: 20px; 240 | color: #fff; 241 | text-align: center; 242 | background-color: #00004c; 243 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); 244 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); 245 | -webkit-transition: width .6s ease; 246 | -o-transition: width .6s ease; 247 | transition: width .6s ease; 248 | box-shadow: none; 249 | } 250 | 251 | .progress-bar-striped, 252 | .progress-striped .progress-bar { 253 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 254 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 255 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 256 | -webkit-background-size: 40px 40px; 257 | background-size: 40px 40px 258 | } 259 | 260 | .progress-bar.active, 261 | .progress.active .progress-bar { 262 | -webkit-animation: progress-bar-stripes 2s linear infinite; 263 | -o-animation: progress-bar-stripes 2s linear infinite; 264 | animation: progress-bar-stripes 2s linear infinite 265 | } 266 | 267 | /* CharacterspriteAnime */ 268 | 269 | .character-container { 270 | width: 200px; 271 | height: 200px; 272 | overflow: hidden; 273 | background: url("../images/sprite02.png"); 274 | background-size: 100%; 275 | } 276 | 277 | .character-container.char { 278 | animation: spriteAnimechar 700ms steps(19) infinite; 279 | } 280 | 281 | @keyframes spriteAnimechar { 282 | 0% { 283 | background-position: 0 0; 284 | } 285 | 286 | 100% { 287 | background-position: 0 -3800px; 288 | } 289 | } -------------------------------------------------------------------------------- /public/static/yocool/css/style3.css: -------------------------------------------------------------------------------- 1 | .el-button { 2 | color: #FFF; 3 | background-color: #5cb85c; 4 | border-color: #5cb85c; 5 | } 6 | 7 | .el-button--info { 8 | background: #5cb85c; 9 | border-color: #5cb85c; 10 | color: #FFF; 11 | } 12 | 13 | .el-button--info.is-active, 14 | .el-button--info:active { 15 | background: #51a451; 16 | border-color: #51a451; 17 | color: #FFF; 18 | } 19 | 20 | .el-button--info:active { 21 | outline: 0 22 | } 23 | 24 | .el-button--info:focus, 25 | .el-button--info:hover { 26 | background: #64c964; 27 | border-color: #64c964; 28 | color: #FFF; 29 | } 30 | 31 | .el-button--info.is-disabled, 32 | .el-button--info.is-disabled:active, 33 | .el-button--info.is-disabled:focus, 34 | .el-button--info.is-disabled:hover { 35 | color: #FFF; 36 | background-color: #c8c9cc; 37 | border-color: #c8c9cc 38 | } 39 | 40 | .el-button--info.is-plain { 41 | color: #909399; 42 | background: #f4f4f5; 43 | border-color: #d3d4d6 44 | } 45 | 46 | .el-button--info.is-plain:focus, 47 | .el-button--info.is-plain:hover { 48 | background: #909399; 49 | border-color: #909399; 50 | color: #FFF 51 | } 52 | 53 | .el-button--info.is-plain:active { 54 | background: #82848a; 55 | border-color: #82848a; 56 | color: #FFF; 57 | outline: 0 58 | } 59 | 60 | .el-button--info.is-plain.is-disabled, 61 | .el-button--info.is-plain.is-disabled:active, 62 | .el-button--info.is-plain.is-disabled:focus, 63 | .el-button--info.is-plain.is-disabled:hover { 64 | color: #bcbec2; 65 | background-color: #f4f4f5; 66 | border-color: #e9e9eb 67 | } 68 | 69 | .background { 70 | position: fixed; 71 | width: 100%; 72 | height: 100%; 73 | z-index: -100; 74 | background: url("../images/background-green.gif") repeat center top; 75 | top: 0; 76 | bottom: 0; 77 | left: 0; 78 | right: 0; 79 | transition: transform 330ms; 80 | transition-timing-function: ease-in-out; 81 | transform: translate3d(0, 0, 0); 82 | } 83 | 84 | /* topmenu */ 85 | 86 | .el-menu--horizontal>.el-menu-item { 87 | float: right; 88 | height: 60px; 89 | line-height: 60px; 90 | margin: 0; 91 | } 92 | 93 | .el-menu.el-menu--horizontal { 94 | border-bottom: solid 1px #68d168; 95 | } 96 | 97 | .el-menu { 98 | list-style: none; 99 | position: relative; 100 | margin: 0; 101 | padding-left: 0; 102 | background-color: #5cb85c; 103 | } 104 | 105 | .el-menu--horizontal>.el-menu-item.is-active { 106 | border-bottom: 2px solid #68d168; 107 | color: #ffffff; 108 | } 109 | 110 | .el-menu--horizontal>.el-menu-item:not(.is-disabled):hover { 111 | background-color: #68d168; 112 | } 113 | 114 | .el-menu--horizontal>.el-menu-item { 115 | border-bottom: 2px solid transparent; 116 | color: #ffffff; 117 | } 118 | 119 | .el-page-header__left::after { 120 | content: ""; 121 | position: absolute; 122 | width: 1px; 123 | height: 16px; 124 | right: -20px; 125 | top: 50%; 126 | -webkit-transform: translateY(-50%); 127 | transform: translateY(-50%); 128 | background-color: #5cb85c; 129 | } 130 | 131 | .el-page-header__title { 132 | font-size: 14px; 133 | font-weight: 500; 134 | color: #fff; 135 | } 136 | 137 | .el-icon-back:before { 138 | content: "\e6ea"; 139 | color: #fff; 140 | } 141 | 142 | .el-page-header { 143 | display: flex; 144 | line-height: 24px; 145 | position: absolute; 146 | z-index: 100; 147 | top: 25px; 148 | left: 10px; 149 | } 150 | 151 | /* Toolbar */ 152 | #topToolbar { 153 | _display: none; 154 | width: 100%; 155 | line-height: 40px; 156 | /* background:#101010; */ 157 | /* border-bottom:2px solid #409F89; */ 158 | position: fixed; 159 | top: -15px; 160 | left: 0; 161 | _top: 0; 162 | _position: absolute; 163 | _top: expression(documentElement.scrollTop); 164 | z-index: 999; 165 | } 166 | 167 | #bottomToolbar { 168 | width: 100%; 169 | height: 22px; 170 | line-height: 22px; 171 | background: #5cb85c; 172 | /* border-top:2px solid #409F89; */ 173 | position: fixed; 174 | bottom: 0; 175 | left: 0; 176 | _position: absolute; 177 | _top: expression(documentElement.scrollTop+documentElement.clientHeight-this.offsetHeight); 178 | z-index: 999; 179 | font-size: 13px; 180 | color: #FFF; 181 | } 182 | 183 | #bottomToolbar a { 184 | color: #FFF; 185 | } 186 | 187 | /* progress */ 188 | 189 | progress { 190 | display: inline-block; 191 | vertical-align: baseline 192 | } 193 | 194 | @-webkit-keyframes progress-bar-stripes { 195 | from { 196 | background-position: 40px 0 197 | } 198 | 199 | to { 200 | background-position: 0 0 201 | } 202 | } 203 | 204 | @-o-keyframes progress-bar-stripes { 205 | from { 206 | background-position: 40px 0 207 | } 208 | 209 | to { 210 | background-position: 0 0 211 | } 212 | } 213 | 214 | @keyframes progress-bar-stripes { 215 | from { 216 | background-position: 40px 0 217 | } 218 | 219 | to { 220 | background-position: 0 0 221 | } 222 | } 223 | 224 | .progress { 225 | height: 15px; 226 | margin-bottom: 6px; 227 | overflow: hidden; 228 | background-color: #f5f5f5; 229 | border-radius: 4px; 230 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); 231 | box-shadow: none; 232 | } 233 | 234 | .progress-bar { 235 | float: left; 236 | width: 0; 237 | height: 100%; 238 | font-size: 12px; 239 | line-height: 20px; 240 | color: #fff; 241 | text-align: center; 242 | background-color: #5cb85c; 243 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); 244 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); 245 | -webkit-transition: width .6s ease; 246 | -o-transition: width .6s ease; 247 | transition: width .6s ease; 248 | box-shadow: none; 249 | } 250 | 251 | .progress-bar-striped, 252 | .progress-striped .progress-bar { 253 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 254 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 255 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 256 | -webkit-background-size: 40px 40px; 257 | background-size: 40px 40px 258 | } 259 | 260 | .progress-bar.active, 261 | .progress.active .progress-bar { 262 | -webkit-animation: progress-bar-stripes 2s linear infinite; 263 | -o-animation: progress-bar-stripes 2s linear infinite; 264 | animation: progress-bar-stripes 2s linear infinite 265 | } 266 | 267 | /* CharacterspriteAnime */ 268 | 269 | .character-container { 270 | width: 200px; 271 | height: 200px; 272 | overflow: hidden; 273 | background: url("../images/sprite03.png"); 274 | background-size: 100%; 275 | } 276 | 277 | .character-container.char { 278 | animation: spriteAnimechar 700ms steps(19) infinite; 279 | } 280 | 281 | @keyframes spriteAnimechar { 282 | 0% { 283 | background-position: 0 0; 284 | } 285 | 286 | 100% { 287 | background-position: 0 -3800px; 288 | } 289 | } -------------------------------------------------------------------------------- /public/static/yocool/images/background-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-blue.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-cobaltblue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-cobaltblue.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-cyan.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-cyan.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-green.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-green.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-orange.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-orange.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-pink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-pink.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-red.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-red.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-violet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-violet.gif -------------------------------------------------------------------------------- /public/static/yocool/images/background-yellow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/background-yellow.gif -------------------------------------------------------------------------------- /public/static/yocool/images/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/banner.png -------------------------------------------------------------------------------- /public/static/yocool/images/clanbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/clanbg.png -------------------------------------------------------------------------------- /public/static/yocool/images/flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/flag.png -------------------------------------------------------------------------------- /public/static/yocool/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/logo.png -------------------------------------------------------------------------------- /public/static/yocool/images/redbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/redbox.png -------------------------------------------------------------------------------- /public/static/yocool/images/sprite01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/sprite01.png -------------------------------------------------------------------------------- /public/static/yocool/images/sprite02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/sprite02.png -------------------------------------------------------------------------------- /public/static/yocool/images/sprite03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ishkong/YoWhite/a419cefe87c483a627788bffe8e22a1e434714f6/public/static/yocool/images/sprite03.png -------------------------------------------------------------------------------- /public/template/admin/groups.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}公会管理{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block nav4 %}active{% endblock %} 10 | {% block nav8 %}active{% endblock %} 11 | {% block body %} 12 |
13 | 14 | 15 | 16 | 17 | 18 | 21 | 22 | 23 | 26 | 27 | 28 |
29 | {% endblock %} 30 | {% block scripts%} 31 | 35 | 36 | {% endblock %} -------------------------------------------------------------------------------- /public/template/admin/pool-setting.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block title %}自定义奖池{% endblock %} 3 | {% block header %} 4 | 5 | 6 | {% endblock %} 7 | {% block nav4 %}active{% endblock %} 8 | {% block nav8 %}active{% endblock %} 9 | {% block body %} 10 | 19 |
20 |
21 |
22 |
23 |

奖池:[[pname]]

24 |
25 |
26 | 27 |
28 |
29 |
30 | 名称:
31 | 前缀:
32 | 单抽概率:
33 | 保底抽概率:
34 | 内容:
35 | 36 | 37 | 38 |
39 | 40 |
41 |
42 |
43 |
44 | 每次抽卡数:
45 | 每日抽卡次数:
46 | 保底抽位置不固定 47 |
48 |
49 | 50 |
51 | {% endblock %} 52 | {% block scripts %} 53 | 57 | 58 | {% endblock %} -------------------------------------------------------------------------------- /public/template/admin/setting.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block title %}Bot设置{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | 13 | {% endblock %} 14 | {% block nav4 %}active{% endblock %} 15 | {% block nav8 %}active{% endblock %} 16 | {% block body %} 17 |
18 | 19 | 20 | 21 | 22 | 23 | 填入当前地址 24 | 获取 yobot 域名 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 77 | 78 | 79 | 添加 80 | 81 | 删除 82 | 83 | 84 | 86 | 87 | 88 | 添加 89 | 90 | 删除 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 100 | 101 | 102 | 添加 103 | 104 | 删除 105 | 106 | 107 | 109 | 110 | 111 | 添加 112 | 113 | 删除 114 | 115 | 116 | 仅主人 117 | 群主以上 118 | 管理员以上 119 | 所有人 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 133 | 使用(聊天+网站) 134 | 135 | 关闭 136 | 137 | 138 | 允许群聊抽卡 139 | 允许私聊抽卡 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 日服官网 154 | 日服推特 155 | 台服官网 156 | 国服官网 157 | 国服Bilibili动态 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 添加 172 | 173 | 删除 174 | 175 | 176 | 178 | 179 | 180 | 添加 181 | 182 | 删除 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 |

198 | 199 | 200 |

201 |
202 |

[[ {jp:"日服",tw:"台服",cn:"国服",eff:"得分系数"}[area] ]]

203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 213 | 214 |
[[k]]号boss
[[k+1]]阶段 212 |
215 | 216 |


217 |
218 | 227 |
228 | 229 | 230 |

231 |

232 | 前往卡池设置 233 |

234 |

235 | 确定 236 |

237 |
238 | {% endblock %} 239 | {% block scripts%} 240 | 244 | 245 | {% endblock %} -------------------------------------------------------------------------------- /public/template/admin/users.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}用户管理{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | 13 | {% endblock %} 14 | {% block nav4 %}active{% endblock %} 15 | {% block nav8 %}active{% endblock %} 16 | {% block body %} 17 |
18 | 19 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 33 | 34 | 35 | 38 | 39 | 40 | 41 | 44 | 45 | 46 |
47 | {% endblock %} 48 | {% block scripts%} 49 | 53 | 54 | {% endblock %} -------------------------------------------------------------------------------- /public/template/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ botname }} | {% block title %}{% endblock %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% block header %} 21 | {% endblock %} 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 |
30 | 31 |
32 | 33 |
34 | 35 | 36 | Logo 37 | 38 | 39 | 40 | 41 |
42 | 45 |
46 | 47 |
48 | 49 | 50 | 51 |
52 | 53 |
54 | 55 |
56 | 57 |
58 | 59 | 60 | Logo 61 | 62 | 63 |
64 | 65 |
66 | 67 |
68 | 69 | 70 | 71 |
72 | 73 |
74 | 75 | 112 | 113 | 114 | 115 |
116 | 117 |
118 | 119 | 134 | 135 | 136 | 137 | 163 | 164 | {% if clan_groups or group_id %} 165 | {% if not group_id %} 166 | {% set group_id = clan_groups[0].group_id %} 167 | {% endif %} 168 | 169 | 223 | 224 | {% endif %} 225 | 226 | 249 | 250 |
251 | 252 |
253 | 254 |
255 | 256 |
257 | 258 |
259 | 260 | 261 |
262 | 263 | 264 |
265 | 266 |
267 | 268 | {% block body %} 269 | {% endblock %} 270 | 271 |
272 | 273 |
274 | 275 |
276 | 277 | 278 | 279 | 298 | 299 |
300 | 301 |
302 | 303 |
304 | 305 | 306 | 307 |
308 | 309 | 310 | 311 | 312 | 313 | 314 |
315 | 316 | 317 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | {% block scripts%} 393 | {% endblock %} 394 | 395 | 396 | 397 | -------------------------------------------------------------------------------- /public/template/clan/panel.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 16 | {% endblock %} 17 | {% block nav3 %}active{% endblock %} 18 | {% block nav7 %}active{% endblock %} 19 | {% block body %} 20 |
21 |
[[groupData.group_name]]
22 | 23 | 24 | 25 | [[ bossData.cycle ]]周目 26 | [[ bossData.num ]]号boss 27 | 28 | 29 | [[ bossData.health.toLocaleString() ]]/[[ bossData.full_health.toLocaleString() ]] 30 | 31 | 40 |
41 | 46 |
47 | 48 | 49 |
51 | 52 |
53 |
54 |
55 | 56 |
[[bossData.health.toString() 57 | ]]/[[ bossData.full_health.toString() ]]
58 | 60 |
61 |
62 | {% if is_member -%} 63 | 64 | 上报伤害 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 80 | 81 | 上报尾刀 82 | 83 | 84 | 85 | 86 | 87 | 88 | 92 | 93 | 代理上报 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 120 | 121 | 撤销上报 122 | 123 | 124 | 申请出刀 125 | [[ (bossData.challenger)&&(bossData.challenger!=self_id)?'强制解锁':'解锁' ]] 126 | 锁定boss 127 | 128 | 129 | 130 | 131 | 132 | 133 | 137 | 138 | [[ today_sl?'取消SL':'SL']] 139 | 140 | 141 | 挂树 142 | 143 | 144 | 145 | 146 | 147 | 148 | 152 | 153 | 取消挂树 154 | 预约boss 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 168 | 169 | 取消预约 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 182 | 183 | 184 | 185 | 修改状态 186 | 设置 187 | 188 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 205 | 206 | 207 | {% else -%} 208 |

非公会战成员只允许查看

209 | {% endif -%} 210 |
211 |
212 |
213 | {% endblock %} 214 | {% block scripts%} 215 | 216 | 217 | {% endblock %} 218 | -------------------------------------------------------------------------------- /public/template/clan/progress.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}出刀记录{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | 29 | {% endblock %} 30 | {% block nav3 %}active{% endblock %} 31 | {% block nav7 %}active{% endblock %} 32 | {% block body %} 33 |
34 | 35 | 选中未完成 36 | 提醒出刀 37 | 38 |

您确定要向[[ multipleSelection.length ]]名成员发送提醒吗

39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 取消 48 | 确定 49 | 50 |
51 | 删除成员 52 | 53 |

您确定要删除这[[ multipleSelection.length ]]名成员吗

54 | 55 | 取消 56 | 确定 57 | 58 |
59 | 143 | 146 |
147 | {% endblock %} 148 | {% block scripts%} 149 | 150 | 151 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/public_progress.html: -------------------------------------------------------------------------------- 1 | {% extends './public_base.html' %} 2 | {% block title %}公共查刀{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | 29 | {% endblock %} 30 | {% block p1 %}查刀{% endblock %} 31 | {% block p2 %}公共查刀页面{% endblock %} 32 | {% block p3 %}其他功能请登录{% endblock %} 33 | {% block body %} 34 |
35 | 36 | 选中未完成 37 | 提醒出刀 38 | 39 |

您确定要向[[ multipleSelection.length ]]名成员发送提醒吗

40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 取消 49 | 确定 50 | 51 |
52 | 删除成员 53 | 54 |

您确定要删除这[[ multipleSelection.length ]]名成员吗

55 | 56 | 取消 57 | 确定 58 | 59 |
60 | 144 | 147 |
148 | {% endblock %} 149 | {% block scripts%} 150 | 151 | 152 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/public_unauthorized.html: -------------------------------------------------------------------------------- 1 | {% extends './public_base.html' %} 2 | {% block title %}无权查看{% endblock %} 3 | {% block header %} 4 | {% endblock %} 5 | {% block p1 %}无权查看{% endblock %} 6 | {% block p2 %}未公开的页面{% endblock %} 7 | {% block body %} 8 | 12 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/setting.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}工会战设置{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block nav3 %}active{% endblock %} 10 | {% block nav7 %}active{% endblock %} 11 | {% block body %} 12 |
13 | 14 | 15 | 面板 16 | 预约 17 | 查刀 18 | 统计 19 | 我的 20 | 21 |

设置

22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 出刀表无需登录 33 | 允许api获取数据 34 | 35 | 36 | 伤害上报 37 | 撤销上报 38 | 申请出刀 39 | 取消申请 40 | 预约boss 41 | 取消预约 42 | 挂树 43 | 取消挂树 44 | 修改状态 45 | 使用SL 46 | 47 | 48 | 确定 49 | 返回 50 | 51 | 52 | 现在档案编号:[[ battle_id ]]
53 | 导出数据 54 | {#- 新建档案 -#} 55 | 切换档案 56 | 57 | 58 |
    59 |
  • 60 | [[ item.battle_id ]]号存档:[[ item.record_count ]]条记录 61 |
  • 62 |
63 | 64 | 65 | 66 | 67 | 68 | 69 | 取消 70 | 切换 71 | 72 |
73 | 删除数据 74 | 75 |

此操作会删除 [[ battle_id ]] 号存档中所有数据

76 | 77 | 取消 78 | 确定 79 | 80 |
81 |
82 |
83 |
84 | {% endblock %} 85 | {% block scripts%} 86 | 87 | 88 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/statistics.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}数据分析{% endblock %} 3 | {% block header %} 4 | {% endblock %} 5 | {% block nav3 %}active{% endblock %} 6 | {% block nav7 %}active{% endblock %} 7 | {% block body %} 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 |

@Ai-Himmel

35 |

36 |   37 |   38 |   39 |   40 |

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 |

@Diving-Fish & @Winrey

66 |

67 |   68 |   69 |   70 |   71 |

72 |
73 | 74 |
75 |
76 |
77 | 78 | 79 | 80 |
81 |
82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 |
95 | 多维度分析 96 |

@Tan90Qian

97 |

98 |   99 | 需要开启api访问 100 |   101 |   102 |

103 |
104 | 105 |
106 |
107 |
108 | 109 | 110 | 111 |
112 |
113 |
114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 |
125 | 原始数据 126 |

(json格式)

127 |

128 | 查看本轮 129 | 下载本轮 130 | 查看全部 131 | 下载全部 132 |

133 |
134 | 135 |
136 |
137 |
138 | 139 |
140 |
141 |
142 | 161 | {% endblock %} 162 | {% block scripts%} 163 | 195 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/statistics/statistics1.html: -------------------------------------------------------------------------------- 1 | {% extends '././base.html' %} 2 | {% block title %}出刀顺序表{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block nav3 %}active{% endblock %} 10 | {% block nav7 %}active{% endblock %} 11 | {% block body %} 12 |
13 |
14 |
15 | 16 |

出刀顺序表

17 |
18 |
19 |
20 | 21 | 22 | 25 | 26 | 27 | 28 | 29 | 31 | 32 | 33 | 36 | 37 | 38 |
39 |
40 | {% endblock %} 41 | {% block scripts%} 42 | 99 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/statistics/statistics2.html: -------------------------------------------------------------------------------- 1 | {% extends '././base.html' %} 2 | {% block title %}数据图表{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | 29 | {% endblock %} 30 | {% block nav3 %}active{% endblock %} 31 | {% block nav7 %}active{% endblock %} 32 | {% block body %} 33 |
34 |
35 |
36 | 37 |

数据图表

38 |
39 |
40 |
41 | 50 | 51 | 52 | 53 |
54 |

55 | 共[[ members.length ]]人,[[ challengeCount(totalDamage, true) ]]刀 56 | 57 | 刀均伤害中计入尾刀和剩余刀 58 |   59 | 十万 百万 千万 亿 60 |

61 | 62 | 63 | 64 | 65 | 69 | 70 | 71 | 72 | 73 | 78 | 81 | 82 | 83 | 86 | 87 | 88 | 89 |
90 |
91 | 92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 | 124 |
125 |
126 |
127 |

128 | 选择玩家: 129 | 130 | 135 | 136 | 137 | 138 | 刀均伤害中计入尾刀和剩余刀 139 |

140 |
141 | 142 | 143 | 144 | 145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 | {% endblock %} 173 | {% block scripts%} 174 | 175 | 176 | 177 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/subscribers.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}公会战预约{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block nav3 %}active{% endblock %} 10 | {% block nav7 %}active{% endblock %} 11 | {% block body %} 12 |
13 |
14 | 15 | 16 | 17 | [[ bosstag[bn-1] ]] 18 | 19 |

20 | [[ find_name(m.qqid) ]]([[ m.qqid ]]) 21 | 24 |

25 |

26 | 没有记录 27 |

28 |
29 |
30 |
31 |
32 | {% endblock %} 33 | {% block scripts%} 34 | 35 | 36 | {% endblock %} -------------------------------------------------------------------------------- /public/template/clan/unauthorized.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}权限不足{% endblock %} 3 | {% block body %} 4 | 11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /public/template/clan/user.html: -------------------------------------------------------------------------------- 1 | {% extends './base.html' %} 2 | {% block title %}个人记录{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | 17 | {% endblock %} 18 | {% block nav3 %}active{% endblock %} 19 | {% block nav7 %}active{% endblock %} 20 | {% block body %} 21 |
22 | 71 | 74 |
75 | {% endblock %} 76 | {% block scripts%} 77 | 78 | 79 | {% endblock %} -------------------------------------------------------------------------------- /public/template/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ botname }} | Login 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
54 | 55 |
56 | 57 | 79 | 80 | 81 | 82 | 130 | 131 |
132 | 133 |
134 | 135 | 136 | 196 | 197 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | -------------------------------------------------------------------------------- /public/template/password.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block title %}修改密码{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block nav2 %}active{% endblock %} 10 | {% block nav6 %}active{% endblock %} 11 | {% block body %} 12 |
13 |
14 | {% if error -%} 15 | 18 | 19 | {% endif -%} 20 | {% if success -%} 21 | 24 | 25 | {% endif -%} 26 | 27 | 28 |
29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 修改 39 | 40 | 41 |
42 |
43 | {% endblock %} 44 | {% block scripts%} 45 | 110 | {% endblock %} -------------------------------------------------------------------------------- /public/template/public_base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ botname }} | {% block title %}{% endblock %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% block header %} 21 | {% endblock %} 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 |
30 | 31 |
32 | 33 |
34 | 35 | 36 | Logo 37 | 38 | 39 | 40 | 41 |
42 | 45 |
46 | 47 |
48 | 49 | 50 | 51 |
52 | 53 |
54 | 55 |
56 | 57 |
58 | 59 | 60 | Logo 61 | 62 | 63 |
64 | 65 |
66 | 67 |
68 | 69 | 70 | 71 |
72 | 73 |
74 | 75 | 85 | 86 | 87 | 88 |
89 | 90 |
91 | 92 |
93 | 94 |
95 | 96 | 103 | 104 |
105 | 106 |
107 | 108 |
109 | 110 |
111 | 112 |
113 | 114 |
115 | 116 |
117 | 118 | 119 |
120 | 121 | 122 |
123 | 124 |
125 | 126 | {% block body %} 127 | {% endblock %} 128 | 129 |
130 | 131 |
132 | 133 |
134 | 135 | 136 | 137 | 156 | 157 |
158 | 159 |
160 | 161 |
162 | 163 | 164 | 165 |
166 | 167 | 168 | 169 | 170 | 171 | 172 |
173 | 174 | 175 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | {% block scripts%} 250 | {% endblock %} 251 | 252 | 253 | 254 | -------------------------------------------------------------------------------- /public/template/unauthorized.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block title %}权限不足{% endblock %} 3 | {% block body %} 4 | 11 | {% endblock %} 12 | 13 | -------------------------------------------------------------------------------- /public/template/user-info.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block title %}用户信息{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block nav2 %}active{% endblock %} 10 | {% block nav6 %}active{% endblock %} 11 | {% block body %} 12 | {% if user.qqid == visitor.qqid or visitor.authority_group < 100 %} 13 |
14 |
15 | 16 |
17 | 18 |
19 |

欢迎

20 | 21 |
22 |

用户名:[[ nickname ]]

23 |

用户名:

24 |
25 | 26 |
27 | 28 |
29 |
30 | 31 |
32 | 33 |
34 |

用户权限

35 | 36 |
37 | 38 |

39 | [[ authtype[{{ user.authority_group }}] ]] 40 |

41 |
42 | 43 |
44 | 45 |
46 |
47 | 48 |
49 | 50 | 51 |
52 | 工会信息 53 | 54 |
55 | 56 |

57 | {{ user.clan_group_id }} 58 |

59 |
60 | 61 |
62 | 63 |
64 |
65 | 66 | {%- else %} 67 | 71 | {%- endif %} 72 | {% endblock %} 73 | {% block scripts%} 74 | {% if user.qqid == visitor.qqid or visitor.authority_group < 100 %} 75 | 124 | {%- endif %} 125 | {% endblock %} 126 | 127 | -------------------------------------------------------------------------------- /public/template/user.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block title %}用户面板{% endblock %} 3 | {% block header %} 4 | 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block nav1 %}active{% endblock %} 10 | {% block nav5 %}active{% endblock %} 11 | {% block body %} 12 | 13 |
14 |
15 | 16 |
17 | 18 |
19 | 欢迎 20 | 21 |
22 | 23 |

24 | {{ user.nickname }} 25 |

26 |
27 | 28 |
29 | 30 |
31 |
32 | 33 |
34 | 35 |
36 | 上次登录 37 | 38 |
[[ from_ts({{ session.get('last_login_time') }}) ]]
39 | 40 |

41 | {{ session.get('last_login_ipaddr') }}([[ addr.join('') ]]) 42 |

43 |
44 | 45 |
46 | 47 |
48 |
49 | 50 |
51 | 52 | 53 |
54 | 工会信息 55 | 56 |
57 | 58 |

59 | {% if not clan_groups -%} 60 |

64 | {%- else -%} 65 | {% for group in clan_groups -%} 66 | 67 | 68 | 69 | {% endfor -%} 70 | {%- endif %} 71 |

72 |
73 | 74 |
75 | 76 |
77 |
78 | 79 | {% endblock %} 80 | {% block scripts%} 81 | 112 | {% endblock %} -------------------------------------------------------------------------------- /ybplugins/settings.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import json 3 | import os 4 | from urllib.parse import urljoin 5 | 6 | from playhouse.shortcuts import model_to_dict 7 | from quart import Quart, jsonify, redirect, request, session, url_for 8 | 9 | from .templating import render_template 10 | from .ybdata import User, Clan_group, Clan_member 11 | 12 | 13 | class Setting: 14 | Passive = False 15 | Active = False 16 | Request = True 17 | 18 | def __init__(self, 19 | glo_setting, 20 | bot_api, 21 | *args, **kwargs): 22 | self.setting = glo_setting 23 | 24 | def register_routes(self, app: Quart): 25 | 26 | @app.route( 27 | urljoin(self.setting['public_basepath'], 'admin/setting/'), 28 | methods=['GET']) 29 | async def yobot_setting(): 30 | if 'yobot_user' not in session: 31 | return redirect(url_for('yobot_login', callback=request.path)) 32 | user=User.get_by_id(session['yobot_user']) 33 | clan_groups = Clan_member.select( 34 | Clan_member.group_id, 35 | Clan_group.group_name, 36 | ).join( 37 | Clan_group, 38 | on=(Clan_member.group_id == Clan_group.group_id), 39 | attr='info', 40 | ).where( 41 | Clan_member.qqid == session['yobot_user'] 42 | ) 43 | if user.authority_group >= 10: 44 | if not user.authority_group >= 100: 45 | uathname = '公会战管理员' 46 | else: 47 | uathname = '成员' 48 | return await render_template( 49 | 'unauthorized.html', 50 | limit='主人', 51 | uath=uathname, 52 | ) 53 | return await render_template( 54 | 'admin/setting.html', 55 | user=User.get_by_id(session['yobot_user']), 56 | clan_groups=[{ 57 | 'group_id': g.group_id, 58 | 'group_name': (getattr(getattr(g, 'info', None), 'group_name', None) or g.group_id) 59 | } for g in clan_groups], 60 | ) 61 | 62 | @app.route( 63 | urljoin(self.setting['public_basepath'], 'admin/setting/api/'), 64 | methods=['GET', 'PUT']) 65 | async def yobot_setting_api(): 66 | if 'yobot_user' not in session: 67 | return jsonify( 68 | code=10, 69 | message='Not logged in', 70 | ) 71 | user = User.get_by_id(session['yobot_user']) 72 | if user.authority_group >= 100: 73 | return jsonify( 74 | code=11, 75 | message='Insufficient authority', 76 | ) 77 | if request.method == 'GET': 78 | settings = self.setting.copy() 79 | del settings['dirname'] 80 | del settings['verinfo'] 81 | del settings['host'] 82 | del settings['port'] 83 | del settings['access_token'] 84 | return jsonify( 85 | code=0, 86 | message='success', 87 | settings=settings, 88 | ) 89 | elif request.method == 'PUT': 90 | req = await request.get_json() 91 | if req.get('csrf_token') != session['csrf_token']: 92 | return jsonify( 93 | code=15, 94 | message='Invalid csrf_token', 95 | ) 96 | new_setting = req.get('setting') 97 | if new_setting is None: 98 | return jsonify( 99 | code=30, 100 | message='Invalid payload', 101 | ) 102 | self.setting.update(new_setting) 103 | save_setting = self.setting.copy() 104 | del save_setting['dirname'] 105 | del save_setting['verinfo'] 106 | config_path = os.path.join( 107 | self.setting['dirname'], 'yobot_config.json') 108 | with open(config_path, 'w', encoding='utf-8') as f: 109 | json.dump(save_setting, f, indent=4) 110 | return jsonify( 111 | code=0, 112 | message='success', 113 | ) 114 | 115 | @app.route( 116 | urljoin(self.setting['public_basepath'], 'admin/pool-setting/'), 117 | methods=['GET']) 118 | async def yobot_pool_setting(): 119 | if 'yobot_user' not in session: 120 | return redirect(url_for('yobot_login', callback=request.path)) 121 | user = User.get_by_id(session['yobot_user']) 122 | clan_groups = Clan_member.select( 123 | Clan_member.group_id, 124 | Clan_group.group_name, 125 | ).join( 126 | Clan_group, 127 | on=(Clan_member.group_id == Clan_group.group_id), 128 | attr='info', 129 | ).where( 130 | Clan_member.qqid == session['yobot_user'] 131 | ) 132 | if user.authority_group >= 10: 133 | if not user.authority_group >= 100: 134 | uathname = '公会战管理员' 135 | else: 136 | uathname = '成员' 137 | return await render_template( 138 | 'unauthorized.html', 139 | limit='主人', 140 | uath=uathname, 141 | ) 142 | return await render_template( 143 | 'admin/pool-setting.html', 144 | user=User.get_by_id(session['yobot_user']), 145 | clan_groups=[{ 146 | 'group_id': g.group_id, 147 | 'group_name': (getattr(getattr(g, 'info', None), 'group_name', None) or g.group_id) 148 | } for g in clan_groups], 149 | ) 150 | 151 | @app.route( 152 | urljoin(self.setting['public_basepath'], 153 | 'admin/pool-setting/api/'), 154 | methods=['GET', 'PUT']) 155 | async def yobot_pool_setting_api(): 156 | if 'yobot_user' not in session: 157 | return jsonify( 158 | code=10, 159 | message='Not logged in', 160 | ) 161 | user = User.get_by_id(session['yobot_user']) 162 | if user.authority_group >= 10: 163 | return jsonify( 164 | code=11, 165 | message='Insufficient authority', 166 | ) 167 | if request.method == 'GET': 168 | with open(os.path.join(self.setting['dirname'], 'pool3.json'), 169 | 'r', encoding='utf-8') as f: 170 | settings = json.load(f) 171 | return jsonify( 172 | code=0, 173 | message='success', 174 | settings=settings, 175 | ) 176 | elif request.method == 'PUT': 177 | req = await request.get_json() 178 | if req.get('csrf_token') != session['csrf_token']: 179 | return jsonify( 180 | code=15, 181 | message='Invalid csrf_token', 182 | ) 183 | new_setting = req.get('setting') 184 | if new_setting is None: 185 | return jsonify( 186 | code=30, 187 | message='Invalid payload', 188 | ) 189 | with open(os.path.join(self.setting['dirname'], 'pool3.json'), 190 | 'w', encoding='utf-8') as f: 191 | json.dump(new_setting, f, ensure_ascii=False, indent=2) 192 | return jsonify( 193 | code=0, 194 | message='success', 195 | ) 196 | 197 | @app.route( 198 | urljoin(self.setting['public_basepath'], 'admin/users/'), 199 | methods=['GET']) 200 | async def yobot_users_managing(): 201 | if 'yobot_user' not in session: 202 | return redirect(url_for('yobot_login', callback=request.path)) 203 | user = User.get_by_id(session['yobot_user']) 204 | clan_groups = Clan_member.select( 205 | Clan_member.group_id, 206 | Clan_group.group_name, 207 | ).join( 208 | Clan_group, 209 | on=(Clan_member.group_id == Clan_group.group_id), 210 | attr='info', 211 | ).where( 212 | Clan_member.qqid == session['yobot_user'] 213 | ) 214 | if user.authority_group >= 10: 215 | if not user.authority_group >= 100: 216 | uathname = '公会战管理员' 217 | else: 218 | uathname = '成员' 219 | return await render_template( 220 | 'unauthorized.html', 221 | limit='主人', 222 | uath=uathname, 223 | ) 224 | return await render_template( 225 | 'admin/users.html', 226 | user=User.get_by_id(session['yobot_user']), 227 | clan_groups=[{ 228 | 'group_id': g.group_id, 229 | 'group_name': (getattr(getattr(g, 'info', None), 'group_name', None) or g.group_id) 230 | } for g in clan_groups], 231 | ) 232 | 233 | @app.route( 234 | urljoin(self.setting['public_basepath'], 'admin/users/api/'), 235 | methods=['POST']) 236 | async def yobot_users_api(): 237 | if 'yobot_user' not in session: 238 | return jsonify( 239 | code=10, 240 | message='Not logged in', 241 | ) 242 | user = User.get_by_id(session['yobot_user']) 243 | if user.authority_group >= 10: 244 | return jsonify( 245 | code=11, 246 | message='Insufficient authority', 247 | ) 248 | try: 249 | req = await request.get_json() 250 | if req is None: 251 | return jsonify( 252 | code=30, 253 | message='Invalid payload', 254 | ) 255 | if req.get('csrf_token') != session['csrf_token']: 256 | return jsonify( 257 | code=15, 258 | message='Invalid csrf_token', 259 | ) 260 | action = req['action'] 261 | if action == 'get_data': 262 | def _get_all_users(): 263 | users = User.select( 264 | User.qqid, 265 | User.nickname, 266 | User.clan_group_id, 267 | User.authority_group, 268 | User.last_login_time, 269 | User.last_login_ipaddr, 270 | ).where( 271 | User.deleted == False, 272 | ) 273 | return json.dumps({ 274 | 'code': 0, 275 | 'data': [model_to_dict(u) for u in users], 276 | }) 277 | return await asyncio.get_running_loop().run_in_executor( 278 | None, 279 | _get_all_users, 280 | ) 281 | 282 | elif action == 'modify_user': 283 | data = req['data'] 284 | m_user: User = User.get_or_none(qqid=data['qqid']) 285 | if ((m_user.authority_group <= user.authority_group) or 286 | (data.get('authority_group', 999)) <= user.authority_group): 287 | return jsonify(code=12, message='Exceed authorization is not allowed') 288 | if data.get('authority_group') == 1: 289 | self.setting['super-admin'].append(ctx['user_id']) 290 | save_setting = self.setting.copy() 291 | del save_setting['dirname'] 292 | del save_setting['verinfo'] 293 | config_path = os.path.join( 294 | self.setting['dirname'], 'yobot_config.json') 295 | with open(config_path, 'w', encoding='utf-8') as f: 296 | json.dump(save_setting, f, indent=4) 297 | if m_user is None: 298 | return jsonify(code=21, message='user not exist') 299 | for key in data.keys(): 300 | setattr(m_user, key, data[key]) 301 | m_user.save() 302 | return jsonify(code=0, message='success') 303 | elif action == 'delete_user': 304 | user = User.get_or_none(qqid=req['data']['qqid']) 305 | if user is None: 306 | return jsonify(code=21, message='user not exist') 307 | user.clan_group_id = None 308 | user.authority_group = 999 309 | user.password = None 310 | user.deleted = True 311 | user.save() 312 | return jsonify(code=0, message='success') 313 | else: 314 | return jsonify(code=32, message='unknown action') 315 | except KeyError as e: 316 | return jsonify(code=31, message=str(e)) 317 | 318 | @app.route( 319 | urljoin(self.setting['public_basepath'], 'admin/groups/'), 320 | methods=['GET']) 321 | async def yobot_groups_managing(): 322 | if 'yobot_user' not in session: 323 | return redirect(url_for('yobot_login', callback=request.path)) 324 | user = User.get_by_id(session['yobot_user']) 325 | clan_groups = Clan_member.select( 326 | Clan_member.group_id, 327 | Clan_group.group_name, 328 | ).join( 329 | Clan_group, 330 | on=(Clan_member.group_id == Clan_group.group_id), 331 | attr='info', 332 | ).where( 333 | Clan_member.qqid == session['yobot_user'] 334 | ) 335 | if user.authority_group >= 10: 336 | if not user.authority_group >= 100: 337 | uathname = '公会战管理员' 338 | else: 339 | uathname = '成员' 340 | return await render_template( 341 | 'unauthorized.html', 342 | limit='主人', 343 | uath=uathname, 344 | ) 345 | return await render_template( 346 | 'admin/groups.html', 347 | user=User.get_by_id(session['yobot_user']), 348 | clan_groups=[{ 349 | 'group_id': g.group_id, 350 | 'group_name': (getattr(getattr(g, 'info', None), 'group_name', None) or g.group_id) 351 | } for g in clan_groups], 352 | ) 353 | 354 | @app.route( 355 | urljoin(self.setting['public_basepath'], 'admin/groups/api/'), 356 | methods=['POST']) 357 | async def yobot_groups_api(): 358 | if 'yobot_user' not in session: 359 | return jsonify( 360 | code=10, 361 | message='Not logged in', 362 | ) 363 | user = User.get_by_id(session['yobot_user']) 364 | if user.authority_group >= 10: 365 | return jsonify( 366 | code=11, 367 | message='Insufficient authority', 368 | ) 369 | try: 370 | req = await request.get_json() 371 | if req is None: 372 | return jsonify( 373 | code=30, 374 | message='Invalid payload', 375 | ) 376 | if req.get('csrf_token') != session['csrf_token']: 377 | return jsonify( 378 | code=15, 379 | message='Invalid csrf_token', 380 | ) 381 | action = req['action'] 382 | if action == 'get_data': 383 | groups = [] 384 | for group in Clan_group.select().where( 385 | Clan_group.deleted == False, 386 | ): 387 | groups.append({ 388 | 'group_id': group.group_id, 389 | 'group_name': group.group_name, 390 | 'game_server': group.game_server, 391 | }) 392 | return jsonify(code=0, data=groups) 393 | if action == 'drop_group': 394 | User.update({ 395 | User.clan_group_id: None, 396 | }).where( 397 | User.clan_group_id == req['group_id'], 398 | ).execute() 399 | Clan_group.delete().where( 400 | Clan_group.group_id == req['group_id'], 401 | ).execute() 402 | return jsonify(code=0, message='ok') 403 | else: 404 | return jsonify(code=32, message='unknown action') 405 | except KeyError as e: 406 | return jsonify(code=31, message=str(e)) 407 | --------------------------------------------------------------------------------