├── var ├── cache │ └── .gitkeep ├── logs │ └── .gitkeep ├── sessions │ └── .gitkeep └── data │ └── test.sqlite ├── web ├── upload │ ├── cover │ │ └── .gitkeep │ └── images │ │ └── .gitignore ├── assets │ ├── lib │ │ ├── echarts │ │ ├── eds-ui │ │ ├── jquery │ │ ├── laydate │ │ ├── Caret.js │ │ ├── bootstrap │ │ ├── jquery.atwho │ │ ├── metisMenu │ │ ├── nprogress │ │ ├── wangeditor │ │ ├── font-awesome │ │ ├── jquery-pjax │ │ ├── bootstrap-social │ │ ├── socket.io-client │ │ ├── startbootstrap-sb-admin-2 │ │ ├── live2d │ │ │ ├── images │ │ │ │ ├── info.png │ │ │ │ ├── talk.png │ │ │ │ ├── music.png │ │ │ │ ├── pasue.png │ │ │ │ ├── quite.png │ │ │ │ └── youdu.png │ │ │ ├── model │ │ │ │ ├── nep │ │ │ │ │ ├── model.moc │ │ │ │ │ ├── ico_histoire.png │ │ │ │ │ ├── histoire.1024 │ │ │ │ │ │ ├── 0.png │ │ │ │ │ │ ├── 1.png │ │ │ │ │ │ └── normal_2.png │ │ │ │ │ └── motions │ │ │ │ │ │ └── tap │ │ │ │ │ │ └── smile.mtn │ │ │ │ └── histoire │ │ │ │ │ ├── model.moc │ │ │ │ │ ├── ico_histoire.png │ │ │ │ │ └── histoire.1024 │ │ │ │ │ ├── texture_00.png │ │ │ │ │ ├── texture_01.png │ │ │ │ │ ├── texture_02.png │ │ │ │ │ └── texture_03.png │ │ │ └── message.json │ │ └── bootoast │ │ │ └── css │ │ │ └── bootoast.css │ ├── images │ │ ├── logo.png │ │ ├── ad │ │ │ └── vultr.png │ │ ├── flags │ │ │ ├── en.png │ │ │ ├── jp.png │ │ │ ├── zh_CN.png │ │ │ └── zh_TW.png │ │ ├── gold@2x.png │ │ ├── loading.gif │ │ ├── vmoex-home.png │ │ ├── zan │ │ │ ├── alipay.jpg │ │ │ └── wechat.jpg │ │ ├── vmoex-admin.png │ │ ├── vmoex-mobile.png │ │ ├── vmoex-screenshot.png │ │ └── vmoex-screenshot-kanbanniang.png │ └── css │ │ └── admin.css ├── favicon.ico ├── pointer.cur ├── avatar │ └── default.png ├── apple-touch-icon.png ├── robots.txt ├── assets-private │ └── js │ │ ├── admin.js │ │ ├── pjax.js │ │ ├── sb-admin-2.js │ │ └── socket.js ├── app.php └── app_dev.php ├── app ├── AppCache.php ├── Resources │ └── views │ │ ├── stub │ │ ├── nginx-301.html.twig │ │ └── nginx-cname.html.twig │ │ ├── emails │ │ ├── verify-email.html.twig │ │ ├── new-message.html.twig │ │ ├── new-comment.html.twig │ │ └── mention-comment.html.twig │ │ ├── form │ │ ├── vertical-field-2.html.twig │ │ ├── vertical-image-field-1.html.twig │ │ ├── no-label-field-1.html.twig │ │ ├── vertical-html-textarea.html.twig │ │ ├── vertical-search-field.html.twig │ │ ├── vertical-field-1.html.twig │ │ ├── vertical-checkbox-type.html.twig │ │ ├── image-input-filed-type.html.twig │ │ └── datetime-range-field-type.html.twig │ │ ├── base.html.twig │ │ └── flash_messages.html.twig ├── .htaccess └── config │ ├── routing.yml │ ├── routing_dev.yml │ ├── config_prod.yml │ ├── services.yml │ ├── config_test.yml │ ├── config_dev.yml │ ├── parameters.yml.dist │ └── security.yml ├── src ├── Yeskn │ ├── MainBundle │ │ ├── Resources │ │ │ ├── views │ │ │ │ ├── base.html.twig │ │ │ │ ├── sidebar │ │ │ │ │ ├── sidebar-ad1.html.twig │ │ │ │ │ ├── sidebar-ad2.html.twig │ │ │ │ │ ├── hello-stranger.html.twig │ │ │ │ │ ├── recommand-tabs.html.twig │ │ │ │ │ ├── topic-author.html.twig │ │ │ │ │ ├── hot-user.html.twig │ │ │ │ │ ├── hot-topics.html.twig │ │ │ │ │ └── community-state.html.twig │ │ │ │ ├── sidebar.html.twig │ │ │ │ ├── error.html.twig │ │ │ │ ├── page │ │ │ │ │ └── default.html.twig │ │ │ │ ├── user │ │ │ │ │ └── notices │ │ │ │ │ │ ├── comment-post.html.twig │ │ │ │ │ │ └── mention-comment.html.twig │ │ │ │ ├── javascripts │ │ │ │ │ └── loading.html.twig │ │ │ │ ├── tos.html.twig │ │ │ │ ├── cards │ │ │ │ │ └── blog-card.html.twig │ │ │ │ ├── base │ │ │ │ │ ├── script.html.twig │ │ │ │ │ └── pjax.html.twig │ │ │ │ ├── sidebar-login.html.twig │ │ │ │ ├── auth │ │ │ │ │ └── register.html.twig │ │ │ │ ├── modals │ │ │ │ │ ├── form-modal.html.twig │ │ │ │ │ ├── send-message-modal.html.twig │ │ │ │ │ └── add-cname-modal.html.twig │ │ │ │ └── contribute.html.twig │ │ │ └── config │ │ │ │ └── services.yml │ │ ├── YesknMainBundle.php │ │ ├── Repository │ │ │ ├── VisitRepository.php │ │ │ ├── BlogRepository.php │ │ │ ├── FooterLinkRepository.php │ │ │ ├── GoodsRepository.php │ │ │ ├── PageRepository.php │ │ │ ├── PhotoRepository.php │ │ │ ├── AdvertisementRepository.php │ │ │ ├── AnnounceRepository.php │ │ │ ├── DeviceRepository.php │ │ │ ├── MachineRepository.php │ │ │ ├── OpenUserRepository.php │ │ │ ├── OptionsRepository.php │ │ │ ├── TagRepository.php │ │ │ ├── SignRepository.php │ │ │ ├── CategoryRepository.php │ │ │ ├── TranslationRepository.php │ │ │ ├── RepositoryTrait.php │ │ │ ├── CommentRepository.php │ │ │ ├── ChatRepository.php │ │ │ ├── TabRepository.php │ │ │ ├── MessageRepository.php │ │ │ └── NoticeRepository.php │ │ ├── EventListener │ │ │ ├── ResponseListener.php │ │ │ ├── RequestListener.php │ │ │ ├── ControllerListener.php │ │ │ ├── AccessDeniedHandler.php │ │ │ └── AjaxAuthenticationListener.php │ │ ├── Controller │ │ │ ├── PingController.php │ │ │ ├── PageController.php │ │ │ ├── AnnounceController.php │ │ │ ├── UsersController.php │ │ │ ├── TabsController.php │ │ │ ├── InfoController.php │ │ │ ├── NoticeController.php │ │ │ ├── DefaultController.php │ │ │ ├── LocaleController.php │ │ │ ├── SearchController.php │ │ │ └── StatusController.php │ │ ├── Form │ │ │ ├── DataTransfer │ │ │ │ ├── DatetimeRangeToStringTransformer.php │ │ │ │ ├── UserToUsernameTransformer.php │ │ │ │ └── DatetimeToStringTransfer.php │ │ │ ├── Entity │ │ │ │ └── ChangePassword.php │ │ │ ├── BlogAddCnameType.php │ │ │ ├── Type │ │ │ │ ├── ImageInputType.php │ │ │ │ ├── TinyHtmlTextareaType.php │ │ │ │ └── DatetimeType.php │ │ │ ├── PhotoType.php │ │ │ ├── OptionsGirlType.php │ │ │ ├── TagType.php │ │ │ ├── AnnounceType.php │ │ │ ├── CategoryType.php │ │ │ ├── ChangePasswordType.php │ │ │ ├── UserLoginType.php │ │ │ ├── TranslationType.php │ │ │ ├── UserMessageType.php │ │ │ ├── PageType.php │ │ │ └── FooterLinkType.php │ │ ├── Services │ │ │ ├── VersionStrategyService.php │ │ │ └── RandomAvatarService.php │ │ ├── Tests │ │ │ ├── Controller │ │ │ │ ├── PingTest.php │ │ │ │ └── StatusControllerTest.php │ │ │ └── Framework │ │ │ │ └── ParameterConfigTest.php │ │ ├── DependencyInjection │ │ │ ├── Configuration.php │ │ │ └── YesknMainExtension.php │ │ ├── Command │ │ │ ├── DoctrineDatabaseInitCommand.php │ │ │ └── BroadcastCommand.php │ │ └── Routing │ │ │ └── DynamicRoutesGenerator.php │ ├── AdminBundle │ │ ├── CrudEvent │ │ │ ├── CrudEventInterface.php │ │ │ ├── CrudEntityEventInterface.php │ │ │ ├── CrudListEventInterface.php │ │ │ ├── ProcessEditTagEvent.php │ │ │ ├── ProcessEditCommentEvent.php │ │ │ ├── AbstractCrudEntityEvent.php │ │ │ ├── ProcessDeleteTranslationEvent.php │ │ │ ├── FinishEditTranslationEvent.php │ │ │ ├── ProcessEditPageEvent.php │ │ │ ├── ProcessEditAnnounceEvent.php │ │ │ ├── StartEditTabEvent.php │ │ │ ├── StartEditPostEvent.php │ │ │ ├── StartEditGoodsEvent.php │ │ │ ├── StartEditPhotoEvent.php │ │ │ ├── StartEditUserEvent.php │ │ │ ├── StartRenderPageListEvent.php │ │ │ ├── StartRenderPhotoListEvent.php │ │ │ ├── AbstractCrudListEvent.php │ │ │ ├── ProcessEditTabEvent.php │ │ │ ├── StartRenderCategoryListEvent.php │ │ │ └── StartRenderTagListEvent.php │ │ ├── YesknAdminBundle.php │ │ ├── Resources │ │ │ ├── config │ │ │ │ └── services.yml │ │ │ └── views │ │ │ │ ├── modals │ │ │ │ ├── alert-modal.html.twig │ │ │ │ ├── confirm-modal.html.twig │ │ │ │ ├── add-translate-modal.html.twig │ │ │ │ └── entity-modal.html.twig │ │ │ │ ├── nav.html.twig │ │ │ │ ├── manage │ │ │ │ └── general.html.twig │ │ │ │ └── crud │ │ │ │ ├── search-form.html.twig │ │ │ │ └── footer-javascript.html.twig │ │ ├── QueryBuilder │ │ │ ├── BuilderFactory.php │ │ │ ├── VisitQueryBuilder.php │ │ │ ├── UserQueryBuilder.php │ │ │ ├── TranslationQueryBuilder.php │ │ │ ├── PostQueryBuilder.php │ │ │ └── CommentQueryBuilder.php │ │ ├── Form │ │ │ └── SearchForm │ │ │ │ ├── DefaultSearchType.php │ │ │ │ ├── SearchVisitType.php │ │ │ │ ├── SearchCommentType.php │ │ │ │ ├── SearchTranslationType.php │ │ │ │ ├── SearchUserType.php │ │ │ │ └── SearchPostType.php │ │ ├── DependencyInjection │ │ │ ├── Configuration.php │ │ │ └── YesknAdminExtension.php │ │ ├── Command │ │ │ └── TranslationLoadCommand.php │ │ └── Controller │ │ │ └── UploadController.php │ └── Support │ │ ├── YesknSupportBundle.php │ │ ├── Validator.php │ │ ├── Http │ │ ├── ApiOk.php │ │ ├── ApiFail.php │ │ ├── ApiResponse.php │ │ └── Session │ │ │ └── Flash.php │ │ ├── Routing │ │ ├── DynamicRoutesGeneratorInterface.php │ │ └── DynamicRouteLoader.php │ │ ├── AbstractService.php │ │ ├── Exceptions │ │ └── AccessDeniedHttpException.php │ │ ├── ParameterBag.php │ │ ├── Traits │ │ └── OptionsTrait.php │ │ ├── DependencyInjection │ │ └── YesknSupportExtension.php │ │ ├── File │ │ └── UploadedFile.php │ │ ├── EventListener │ │ ├── ExceptionListener.php │ │ ├── MaintainExceptionListener.php │ │ └── ConsoleCommandListener.php │ │ ├── Resources │ │ ├── config │ │ │ └── services.yml │ │ └── views │ │ │ └── maintain.html.twig │ │ └── AbstractControllerListener.php └── .htaccess ├── package.json ├── .github └── FUNDING.yml ├── .gitignore ├── bin └── console ├── LICENSE └── phpunit.xml.dist /var/cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /var/logs/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /var/sessions/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/upload/cover/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/assets/lib/echarts: -------------------------------------------------------------------------------- 1 | ../../../node_modules/echarts -------------------------------------------------------------------------------- /web/assets/lib/eds-ui: -------------------------------------------------------------------------------- 1 | ../../../node_modules/eds-ui -------------------------------------------------------------------------------- /web/assets/lib/jquery: -------------------------------------------------------------------------------- 1 | ../../../node_modules/jquery -------------------------------------------------------------------------------- /web/assets/lib/laydate: -------------------------------------------------------------------------------- 1 | ../../../node_modules/laydate -------------------------------------------------------------------------------- /web/upload/images/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /web/assets/lib/Caret.js: -------------------------------------------------------------------------------- 1 | ../../../node_modules/jquery.caret -------------------------------------------------------------------------------- /web/assets/lib/bootstrap: -------------------------------------------------------------------------------- 1 | ../../../node_modules/bootstrap -------------------------------------------------------------------------------- /web/assets/lib/jquery.atwho: -------------------------------------------------------------------------------- 1 | ../../../node_modules/at.js -------------------------------------------------------------------------------- /web/assets/lib/metisMenu: -------------------------------------------------------------------------------- 1 | ../../../node_modules/metismenu -------------------------------------------------------------------------------- /web/assets/lib/nprogress: -------------------------------------------------------------------------------- 1 | ../../../node_modules/nprogress -------------------------------------------------------------------------------- /web/assets/lib/wangeditor: -------------------------------------------------------------------------------- 1 | ../../../node_modules/wangeditor -------------------------------------------------------------------------------- /web/assets/lib/font-awesome: -------------------------------------------------------------------------------- 1 | ../../../node_modules/font-awesome -------------------------------------------------------------------------------- /web/assets/lib/jquery-pjax: -------------------------------------------------------------------------------- 1 | ../../../node_modules/jquery-pjax -------------------------------------------------------------------------------- /web/assets/lib/bootstrap-social: -------------------------------------------------------------------------------- 1 | ../../../node_modules/bootstrap-social -------------------------------------------------------------------------------- /web/assets/lib/socket.io-client: -------------------------------------------------------------------------------- 1 | ../../../node_modules/socket.io-client -------------------------------------------------------------------------------- /web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/favicon.ico -------------------------------------------------------------------------------- /web/pointer.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/pointer.cur -------------------------------------------------------------------------------- /web/assets/lib/startbootstrap-sb-admin-2: -------------------------------------------------------------------------------- 1 | ../../../node_modules/startbootstrap-sb-admin-2 -------------------------------------------------------------------------------- /var/data/test.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/var/data/test.sqlite -------------------------------------------------------------------------------- /web/avatar/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/avatar/default.png -------------------------------------------------------------------------------- /web/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/apple-touch-icon.png -------------------------------------------------------------------------------- /web/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/logo.png -------------------------------------------------------------------------------- /web/assets/images/ad/vultr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/ad/vultr.png -------------------------------------------------------------------------------- /web/assets/images/flags/en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/flags/en.png -------------------------------------------------------------------------------- /web/assets/images/flags/jp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/flags/jp.png -------------------------------------------------------------------------------- /web/assets/images/gold@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/gold@2x.png -------------------------------------------------------------------------------- /web/assets/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/loading.gif -------------------------------------------------------------------------------- /web/assets/images/vmoex-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/vmoex-home.png -------------------------------------------------------------------------------- /web/assets/images/zan/alipay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/zan/alipay.jpg -------------------------------------------------------------------------------- /web/assets/images/zan/wechat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/zan/wechat.jpg -------------------------------------------------------------------------------- /web/assets/images/flags/zh_CN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/flags/zh_CN.png -------------------------------------------------------------------------------- /web/assets/images/flags/zh_TW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/flags/zh_TW.png -------------------------------------------------------------------------------- /web/assets/images/vmoex-admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/vmoex-admin.png -------------------------------------------------------------------------------- /web/assets/images/vmoex-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/vmoex-mobile.png -------------------------------------------------------------------------------- /web/assets/lib/live2d/images/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/lib/live2d/images/info.png -------------------------------------------------------------------------------- /web/assets/lib/live2d/images/talk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/lib/live2d/images/talk.png -------------------------------------------------------------------------------- /web/assets/images/vmoex-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/images/vmoex-screenshot.png -------------------------------------------------------------------------------- /web/assets/lib/live2d/images/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/lib/live2d/images/music.png -------------------------------------------------------------------------------- /web/assets/lib/live2d/images/pasue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/lib/live2d/images/pasue.png -------------------------------------------------------------------------------- /web/assets/lib/live2d/images/quite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/lib/live2d/images/quite.png -------------------------------------------------------------------------------- /web/assets/lib/live2d/images/youdu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/lib/live2d/images/youdu.png -------------------------------------------------------------------------------- /web/assets/lib/live2d/model/nep/model.moc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Volt0303/sunshine/HEAD/web/assets/lib/live2d/model/nep/model.moc -------------------------------------------------------------------------------- /app/AppCache.php: -------------------------------------------------------------------------------- 1 | 2 | Require all denied 3 | 4 | 5 | Order deny,allow 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /src/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Require all denied 3 | 4 | 5 | Order deny,allow 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/YesknMainBundle.php: -------------------------------------------------------------------------------- 1 | {{ code }},欢迎使用{{ 'site_name'|trans }}! 9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /app/config/routing.yml: -------------------------------------------------------------------------------- 1 | yeskn_admin: 2 | resource: "@YesknAdminBundle/Controller/" 3 | type: annotation 4 | prefix: /admin 5 | 6 | yeskn_main: 7 | resource: "@YesknMainBundle/Controller/" 8 | type: annotation 9 | prefix: / 10 | 11 | yeskn_dynamic: 12 | resource: . 13 | type: extra 14 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/CrudEventInterface.php: -------------------------------------------------------------------------------- 1 | 5 |
6 |
7 | {{ ad.content|raw }} 8 |
9 |
10 | 11 | {% endfor %} 12 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar/sidebar-ad2.html.twig: -------------------------------------------------------------------------------- 1 | {% set ads = adsWidget() %} 2 | 3 | {% for ad in ads if ad.location == 'sidebar2' %} 4 |
5 |
6 |
7 | {{ ad.content|raw }} 8 |
9 |
10 |
11 | {% endfor %} 12 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/CrudEntityEventInterface.php: -------------------------------------------------------------------------------- 1 | 4 | {{ form_label(form, '', {label_attr: {class: 'col-sm-2'}}) }} 5 |
6 | {{ form_widget(form) }} 7 |
8 | {{ form_errors(form) }} 9 | 10 | {% endfilter %} 11 | {% endblock form_row %} 12 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/CrudListEventInterface.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% block title %}Welcome!{% endblock %} 6 | {% block stylesheets %}{% endblock %} 7 | 8 | 9 | 10 | {% block body %}{% endblock %} 11 | {% block javascripts %}{% endblock %} 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/Yeskn/Support/Routing/DynamicRoutesGeneratorInterface.php: -------------------------------------------------------------------------------- 1 | em = $em; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Resources/views/form/vertical-image-field-1.html.twig: -------------------------------------------------------------------------------- 1 | {% block form_row %} 2 | {% filter spaceless %} 3 |
4 | {{ form_label(form, '', {label_attr: {class: 'col-sm-2'}}) }} 5 |
6 | 7 | {{ form_widget(form) }} 8 |
9 | {{ form_errors(form) }} 10 |
11 | {% endfilter %} 12 | {% endblock form_row %} 13 | -------------------------------------------------------------------------------- /src/Yeskn/Support/Exceptions/AccessDeniedHttpException.php: -------------------------------------------------------------------------------- 1 | 4 |
5 | {{ form_widget(form) }} 6 | {% if attr['help'] is defined %} 7 | {{ attr['help'] }} 8 | {% endif %} 9 |
10 | {{ form_errors(form) }} 11 | 12 | {% endfilter %} 13 | {% endblock form_row %} 14 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/error.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@YesknMain/base.html.twig' %} 2 | 3 | {% block page_wraper %} 4 | 9 | 10 |
11 |
12 | 15 |
16 |
17 | 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/config/services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | Yeskn\AdminBundle\: 4 | public: true 5 | autoconfigure: true 6 | autowire: true 7 | resource: '../../../AdminBundle/*' 8 | bind: 9 | $projectDir: '%kernel.project_dir%' 10 | $rootDir: "%kernel.root_dir%" 11 | exclude: '../../../AdminBundle/{Entity,Repository,Tests,QueryBuilder}' 12 | 13 | Yeskn\AdminBundle\Controller\: 14 | resource: '../../../AdminBundle/Controller' 15 | public: true 16 | tags: ['controller.service_arguments'] 17 | -------------------------------------------------------------------------------- /app/Resources/views/form/vertical-html-textarea.html.twig: -------------------------------------------------------------------------------- 1 | {% block form_row %} 2 | {% filter spaceless %} 3 |
4 | {{ form_label(form, '', {label_attr: {class: 'col-sm-2'}}) }} 5 |
6 |

{{ data|raw }}

7 |
8 | 9 | {{ form_errors(form) }} 10 |
11 | {% endfilter %} 12 | {% endblock form_row %} 13 | -------------------------------------------------------------------------------- /src/Yeskn/Support/ParameterBag.php: -------------------------------------------------------------------------------- 1 | get($name); 19 | } 20 | 21 | public function __set($name, $value) 22 | { 23 | $this->set($name, $value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /web/assets-private/js/admin.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $('.search-container .btn-dropdown').click(function () { 3 | if ($('.panel-body').is(':visible')) { 4 | $('.panel-body').slideUp(); 5 | $('.panel-footer').slideUp(); 6 | $(this).find('i').removeClass('fa-chevron-up').addClass('fa-chevron-down') 7 | } else { 8 | $('.panel-body').slideDown(); 9 | $('.panel-footer').slideDown(); 10 | $(this).find('i').removeClass('fa-chevron-down').addClass('fa-chevron-up') 11 | } 12 | }) 13 | }); 14 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/page/default.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@YesknMain/base.html.twig' %} 2 | 3 | {% block main %} 4 |
5 |
6 |
7 |
8 | {{ pageName|trans }} 9 |
10 |
11 | {{ content|markdown|raw }} 12 |
13 |
14 |
15 |
16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar/hello-stranger.html.twig: -------------------------------------------------------------------------------- 1 | {% if app.user is empty %} 2 |
3 |
4 | {{ 'hello_stranger'|trans }} 5 |
6 |
7 | {{ 'hello_stranger_detail'|trans }} 8 | 9 |
10 |
11 | {{ 'home_now_register'|trans }} 12 |
13 |
14 | {% endif %} -------------------------------------------------------------------------------- /src/Yeskn/Support/Traits/OptionsTrait.php: -------------------------------------------------------------------------------- 1 | getDoctrine()->getRepository('YesknMainBundle:Options')->findOneBy(['name' => $key]); 22 | return $one ? $one->getValue() : ''; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "at.js": "^1.5.4", 4 | "bootstrap": "^3.4.1", 5 | "bootstrap-social": "^5.1.1", 6 | "echarts": "^4.2.1", 7 | "eds-ui": "github:jaggle/eds-ui", 8 | "font-awesome": "^4.7.0", 9 | "jquery": "^3.3.1", 10 | "jquery-pjax": "^2.0.1", 11 | "jquery.caret": "^0.3.1", 12 | "laydate": "github:yeskn-studio/laydate", 13 | "metismenu": "1.1.3", 14 | "nprogress": "^0.2.0", 15 | "popper.js": "^1.14.7", 16 | "socket.io-client": "^2.2.0", 17 | "startbootstrap-sb-admin-2": "3.3.7", 18 | "wangeditor": "^3.1.1" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/EventListener/ResponseListener.php: -------------------------------------------------------------------------------- 1 | getResponse(); 18 | 19 | $response->headers->set('X-PJAX-URL', $event->getRequest()->getRequestUri()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Repository/RepositoryTrait.php: -------------------------------------------------------------------------------- 1 | createQueryBuilder('p'); 22 | $builder->select('COUNT(1)'); 23 | return (int)$builder->getQuery()->getSingleScalarResult(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Yeskn/Support/Http/ApiResponse.php: -------------------------------------------------------------------------------- 1 | $status, 20 | 'message' => $message, 21 | 'detail' => $detail, 22 | ]); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Resources/views/form/vertical-search-field.html.twig: -------------------------------------------------------------------------------- 1 | {% block form_row %} 2 | {% filter spaceless %} 3 |
4 | {{ form_label(form, '', {label_attr: {class: 'col-sm-3'}}) }} 5 |
6 | {{ form_widget(form) }} 7 | {% if attr['help'] is defined %} 8 | {{ attr['help'] }} 9 | {% endif %} 10 |
11 | {{ form_errors(form) }} 12 |
13 | {% endfilter %} 14 | {% endblock form_row %} 15 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/user/notices/comment-post.html.twig: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ notice.createdBy.nickname }} 4 | {{ notice.createdAt|ago }}{{ 'notice_replied_you'|trans }} {{ notice.object.title }}: 5 |
6 | 7 |
8 | {{ notice.content.content|raw }} 9 |
10 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/user/notices/mention-comment.html.twig: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ notice.createdBy.nickname }} 4 | {{ notice.createdAt|ago }} {{ 'notice_comment_mention_you'|trans }} {{ notice.object.title }}: 5 |
6 | 7 |
8 | {{ notice.rowContent|raw }} 9 |
10 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/ProcessEditTagEvent.php: -------------------------------------------------------------------------------- 1 | entity->getId())) { 24 | $this->entity->setCreatedAt(new \DateTime()); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/PingController.php: -------------------------------------------------------------------------------- 1 | entity->getId())) { 24 | $this->entity->setCreatedAt(new \DateTime()); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/AbstractCrudEntityEvent.php: -------------------------------------------------------------------------------- 1 | entity = $entity; 19 | 20 | return $this; 21 | } 22 | 23 | public function getEntity() 24 | { 25 | return $this->entity; 26 | } 27 | 28 | abstract function execute(); 29 | } 30 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/ProcessDeleteTranslationEvent.php: -------------------------------------------------------------------------------- 1 | entity->isCanDelete()) { 24 | throw new \Exception('该词条为系统设置,无法删除'); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/DataTransfer/DatetimeRangeToStringTransformer.php: -------------------------------------------------------------------------------- 1 | 4 | {{ form_label(form, '', {label_attr: {class: 'col-sm-2'}}) }} 5 |
6 | {{ form_widget(form) }} 7 | {% for attrname, attrvalue in attr %} 8 | {% if attrname == 'help' %} 9 | {{ attrvalue }} 10 | {% endif %} 11 | {% endfor %} 12 |
13 | {{ form_errors(form) }} 14 | 15 | {% endfilter %} 16 | {% endblock form_row %} 17 | -------------------------------------------------------------------------------- /app/Resources/views/emails/new-message.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'emails/base.html.twig' %} 2 | 3 | {% block email_title %} 4 | Wpcraft 有人给您发送了私信 5 | {% endblock %} 6 | 7 | {% block email_content %} 8 |
9 | 10 | 11 | {{ message.sender.nickname }} 12 | {{ message.createdAt|ago }}: 13 |
14 | 15 |
16 | {{ message.content|raw }} 17 |
18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/FinishEditTranslationEvent.php: -------------------------------------------------------------------------------- 1 | loadService = $loadService; 21 | } 22 | 23 | public function execute() 24 | { 25 | $this->loadService->execute(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/ProcessEditPageEvent.php: -------------------------------------------------------------------------------- 1 | entity->getId())) { 24 | $this->entity->setCreatedAt(new \DateTime()); 25 | } 26 | 27 | $this->entity->setUpdatedAt(new \DateTime()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: https://vmoex.yeskn.com/contribute 13 | -------------------------------------------------------------------------------- /web/app.php: -------------------------------------------------------------------------------- 1 | loadClassCache(); 13 | } 14 | //$kernel = new AppCache($kernel); 15 | 16 | // When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter 17 | //Request::enableHttpMethodParameterOverride(); 18 | $request = Request::createFromGlobals(); 19 | $response = $kernel->handle($request); 20 | $response->send(); 21 | $kernel->terminate($request, $response); 22 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/javascripts/loading.html.twig: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/ProcessEditAnnounceEvent.php: -------------------------------------------------------------------------------- 1 | entity; 24 | 25 | $content = strip_tags($entityObj->getContent(), 26 | 'b, strong,i,em,font,small,bold,span,p' 27 | ); 28 | 29 | $entityObj->setContent($content); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/Entity/ChangePassword.php: -------------------------------------------------------------------------------- 1 | createQueryBuilder('p') 25 | ->select('COUNT(p)') 26 | ->getQuery() 27 | ->getSingleScalarResult(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/BlogAddCnameType.php: -------------------------------------------------------------------------------- 1 | add('cname'); 21 | $builder->add('confirm_dns', CheckboxType::class, [ 22 | 'required' => true, 23 | 'label' => 'user.blog.i_confirm_that_added_cname_dns' 24 | ]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Yeskn/Support/DependencyInjection/YesknSupportExtension.php: -------------------------------------------------------------------------------- 1 | load('services.yml'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Yeskn/Support/File/UploadedFile.php: -------------------------------------------------------------------------------- 1 | absoluteFileName = $absoluteName; 19 | } 20 | 21 | /** 22 | * @return mixed 23 | */ 24 | public function getAbsoluteFileName() 25 | { 26 | return $this->absoluteFileName; 27 | } 28 | 29 | /** 30 | * @param mixed $absoluteFileName 31 | */ 32 | public function setAbsoluteFileName($absoluteFileName) 33 | { 34 | $this->absoluteFileName = $absoluteFileName; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Resources/views/form/vertical-checkbox-type.html.twig: -------------------------------------------------------------------------------- 1 | {% block checkbox_widget %} 2 | {% filter spaceless %} 3 |
4 |
5 | 14 | {{ form_errors(form) }} 15 |
16 |
17 | {% endfilter %} 18 | {% endblock checkbox_widget %} 19 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Services/VersionStrategyService.php: -------------------------------------------------------------------------------- 1 | varDir = rtrim($projectDir, '/') . '/var'; 21 | } 22 | 23 | public function getVersion($path) 24 | { 25 | return ''; 26 | } 27 | 28 | public function applyVersion($path) 29 | { 30 | return $path . '?v=' . file_get_contents($this->varDir . '/assets_version'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/QueryBuilder/BuilderFactory.php: -------------------------------------------------------------------------------- 1 | 2 | 16 | -------------------------------------------------------------------------------- /app/Resources/views/form/image-input-filed-type.html.twig: -------------------------------------------------------------------------------- 1 | {% block image_input_widget %} 2 | {% filter spaceless %} 3 | {% if data %} 4 |
5 | 9 |
10 | {% endif %} 11 | {{ form_widget(form, {attr: {class: 'form-control'}}) }} 12 | {% if attr['help'] is defined %} 13 | {{ attr['help'] }} 14 | {% endif %} 15 | {{ form_errors(form) }} 16 | {% endfilter %} 17 | {% endblock image_input_widget %} 18 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Tests/Controller/PingTest.php: -------------------------------------------------------------------------------- 1 | request('GET', '/ping'); 27 | 28 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); 29 | $this->assertContains('pong', $crawler->filter('body')->text()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Resources/views/emails/new-comment.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'emails/base.html.twig' %} 2 | 3 | {% block email_title %} 4 | {{ 'site_name'|trans }} 有人评论了您的帖子 5 | {% endblock %} 6 | 7 | {% block email_content %} 8 |
9 | 10 |   11 | {{ notice.createdBy.nickname }} 12 | {{ notice.createdAt|ago }}{{ 'notice_replied_you'|trans }} {{ notice.object.title }}: 13 |
14 | 15 |
16 | {{ notice.content.content|raw }} 17 |
18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/QueryBuilder/VisitQueryBuilder.php: -------------------------------------------------------------------------------- 1 | queryBuilder 22 | ->andWhere('p.createdAt >= :createdAt0')->setParameter('createdAt0', $params['createdAt'][0]) 23 | ->andWhere('p.createdAt <= :createdAt1')->setParameter('createdAt1', $params['createdAt'][1]) 24 | ; 25 | } 26 | 27 | return $this->queryBuilder; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar/recommand-tabs.html.twig: -------------------------------------------------------------------------------- 1 | {% set tabs = tabsWidget() %} 2 | 3 |
4 |
5 | {{ '推荐主题'|trans }} 6 |
7 |
8 | 18 |
19 |
20 | -------------------------------------------------------------------------------- /app/Resources/views/flash_messages.html.twig: -------------------------------------------------------------------------------- 1 | {% if app.session.started and app.session.flashBag.peekAll is not empty %} 2 | {% for type, messages in app.session.flashBag.all %} 3 | {% for message in messages %} 4 | {% if type == 'message' %} 5 | {% set type = 'info' %} 6 | {% endif %} 7 | 19 | {% endfor %} 20 | {% endfor %} 21 | {% endif %} 22 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Repository/ChatRepository.php: -------------------------------------------------------------------------------- 1 | createQueryBuilder('p') 25 | ->select('p') 26 | ->setMaxResults($count) 27 | ->orderBy('p.createdAt', 'DESC') 28 | ->getQuery() 29 | ->getResult(); 30 | 31 | return array_reverse($results); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartEditTabEvent.php: -------------------------------------------------------------------------------- 1 | entity; 27 | 28 | $oldAvatar = $entityObj->getAvatar(); 29 | $entityObj->setAvatar(new File($oldAvatar, false)); 30 | 31 | return self::$oldProperty = [ 32 | 'avatar' => $oldAvatar 33 | ]; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/Yeskn/Support/Http/Session/Flash.php: -------------------------------------------------------------------------------- 1 | container->get('session')) { 26 | throw new \LogicException('You can not use the addFlash method if sessions are disabled. Enable them in "config/packages/framework.yaml".'); 27 | } 28 | 29 | $this->container->get('session')->getFlashBag()->add($type, $message); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Resources/views/emails/mention-comment.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'emails/base.html.twig' %} 2 | 3 | {% block email_title %} 4 | {{ 'site_name'|trans }} 有人在评论中提到了您 5 | {% endblock %} 6 | 7 | {% block email_content %} 8 |
9 | 10 | {{ notice.createdBy.nickname }} 11 | {{ notice.createdAt|ago }} {{ 'notice_comment_mention_you'|trans }} {{ notice.object.title }}: 12 |
13 | 14 |
15 |
16 | {{ notice.rowContent|raw }} 17 |
18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /app/config/services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | _defaults: 3 | autowire: true 4 | autoconfigure: true 5 | public: false 6 | 7 | Yeskn\MainBundle\Twig\WebsiteInfo: 8 | tags: 9 | - { name: twig.extension } 10 | 11 | Yeskn\MainBundle\EventListener\RequestListener: 12 | tags: 13 | - { name: kernel.event_listener, event: kernel.request, priority: 50 } 14 | 15 | Yeskn\MainBundle\EventListener\ControllerListener: 16 | tags: 17 | - { name: kernel.event_listener, event: kernel.controller } 18 | 19 | Yeskn\MainBundle\EventListener\ResponseListener: 20 | tags: 21 | - { name: kernel.event_listener, event: kernel.response } 22 | 23 | Symfony\Bridge\Twig\Extension\AssetExtension: "@twig.extension.assets" 24 | Symfony\Bundle\SecurityBundle\Security\FirewallMap: "@security.firewall.map" 25 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Repository/TabRepository.php: -------------------------------------------------------------------------------- 1 | createQueryBuilder('p') 26 | ->where('p.avatar is not null') 27 | ->andWhere("p.avatar != ''") 28 | ->orderBy('p.id', 'DESC') 29 | ->setMaxResults(12) 30 | ->getQuery() 31 | ->getResult(Query::HYDRATE_SIMPLEOBJECT); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/PageController.php: -------------------------------------------------------------------------------- 1 | getPathInfo(); 21 | 22 | $one = $this->getDoctrine()->getRepository(Page::class) 23 | ->findOneBy(['uri' => $uri]); 24 | 25 | return $this->render('@YesknMain/page/default.html.twig', [ 26 | 'pageName' => $one->getTitle(), 27 | 'content' => $one->getContent() 28 | ]); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Repository/MessageRepository.php: -------------------------------------------------------------------------------- 1 | createQueryBuilder('p') 26 | ->select('p') 27 | ->where('p.receiver = :receiver')->setParameter('receiver', $user) 28 | ->andWhere('p.isRead = false') 29 | ->orderBy('p.createdAt', 'DESC') 30 | ->getQuery() 31 | ->getResult(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/views/modals/confirm-modal.html.twig: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar/topic-author.html.twig: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ '关于作者'|trans }} 4 |
5 | 9 | 16 |
17 |
18 |
19 | {{ post.author.nickname }} 20 |
21 |
-------------------------------------------------------------------------------- /src/Yeskn/Support/EventListener/ExceptionListener.php: -------------------------------------------------------------------------------- 1 | getException(); 20 | $isAjax = $event->getRequest()->isXmlHttpRequest(); 21 | 22 | if ($isAjax) { 23 | $event->allowCustomResponseCode(); 24 | $response = new ApiFail($exception->getMessage()); 25 | $response->setStatusCode(200); 26 | 27 | $event->setResponse($response); 28 | } 29 | 30 | return $exception; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartEditPostEvent.php: -------------------------------------------------------------------------------- 1 | entity; 27 | 28 | if ($oldCover = $entityObj->getCover()) { 29 | $entityObj->setCover(new File($oldCover, false)); 30 | } else { 31 | $oldCover = null; 32 | } 33 | 34 | return self::$oldProperty = [ 35 | 'cover' => $oldCover 36 | ]; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartEditGoodsEvent.php: -------------------------------------------------------------------------------- 1 | entity; 27 | 28 | if ($oldCover = $entityObj->getCover()) { 29 | $entityObj->setCover(new File($oldCover, false)); 30 | } else { 31 | $oldCover = null; 32 | } 33 | 34 | return self::$oldProperty = [ 35 | 'cover' => $oldCover 36 | ]; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartEditPhotoEvent.php: -------------------------------------------------------------------------------- 1 | entity; 27 | 28 | if ($oldCover = $entityObj->getFile()) { 29 | $entityObj->setFile(new File($oldCover, false)); 30 | } else { 31 | $oldCover = null; 32 | } 33 | 34 | return self::$oldProperty = [ 35 | 'file' => $oldCover 36 | ]; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev', true); 19 | $debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption('--no-debug', true) && $env !== 'prod'; 20 | 21 | if ($debug) { 22 | Debug::enable(); 23 | } 24 | 25 | $kernel = new AppKernel($env, $debug); 26 | $application = new Application($kernel); 27 | $application->run($input); 28 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/views/nav.html.twig: -------------------------------------------------------------------------------- 1 | 10 | 21 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/tos.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@YesknMain/base.html.twig' %} 2 | 3 | {% block page_wraper %} 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |

服务条款

12 |
13 |
14 |
15 |
16 |
17 | 欢迎使用这项服务! 18 |
19 |
20 |
21 |
22 |
23 |
24 | {% endblock %} 25 | -------------------------------------------------------------------------------- /app/config/config_test.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config_dev.yml } 3 | 4 | parameters: 5 | test_database_path: var/data/test.sqlite 6 | secret: e01b91e2f072deac5abf039b4f6e6d9149442399 7 | redis_dsn: 'redis://localhost:6379' 8 | 9 | assetic: 10 | debug: '%kernel.debug%' 11 | use_controller: '%kernel.debug%' 12 | filters: ~ 13 | 14 | framework: 15 | test: ~ 16 | session: 17 | storage_id: session.storage.mock_file 18 | profiler: 19 | collect: false 20 | 21 | doctrine: 22 | dbal: 23 | driver: pdo_sqlite 24 | path: '%test_database_path%' 25 | 26 | web_profiler: 27 | toolbar: false 28 | intercept_redirects: false 29 | 30 | swiftmailer: 31 | disable_delivery: true 32 | 33 | services: 34 | _defaults: 35 | autowire: true 36 | autoconfigure: true 37 | public: true 38 | 39 | Symfony\Bundle\AsseticBundle\AsseticBundle: 40 | public: true 41 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Repository/NoticeRepository.php: -------------------------------------------------------------------------------- 1 | createQueryBuilder('p') 23 | ->select('COUNT(p)') 24 | ->where('p.pushTo = :userId') 25 | ->andWhere('p.isRead = false') 26 | ->setParameter('userId', $userId) 27 | ->getQuery() 28 | ->getSingleScalarResult(); 29 | } catch (NoResultException $exception) { 30 | return 0; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartEditUserEvent.php: -------------------------------------------------------------------------------- 1 | entity->setPassword(''); 27 | 28 | $entityObj = $this->entity; 29 | 30 | $oldAvatar = $entityObj->getAvatar(); 31 | $entityObj->setAvatar(new File($oldAvatar, false)); 32 | 33 | return self::$odlProperty = [ 34 | 'avatar' => $oldAvatar, 35 | 'password' => $entityObj->getPassword() 36 | ]; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/cards/blog-card.html.twig: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 | 8 | {{ blog.title }} 9 | 10 |
11 | 12 | {{ blog.user.nickname }} 13 | 创建于{{ blog.createdAt|ago }} 14 | 15 | 16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/views/manage/general.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@YesknAdmin/base.html.twig' %} 2 | 3 | {% block page_wraper %} 4 |
5 |
6 | 7 |
8 |
9 | 10 | {% if form.vars.message is defined %} 11 | {% set message = form.vars.message %} 12 | 13 | {% endif %} 14 | 15 |
16 |
17 |
18 |
{{ groupName }}
19 |
20 | {{ form_start(form) }} 21 | {{ form_widget(form) }} 22 | {{ form_end(form) }} 23 |
24 |
25 |
26 |
27 | 28 | {% endblock %} 29 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/EventListener/RequestListener.php: -------------------------------------------------------------------------------- 1 | getRequest()->query->get('_locale'); 20 | 21 | if (empty($locale)) { 22 | $locale = $event->getRequest()->cookies->get('_locale'); 23 | } 24 | 25 | if (empty($locale)) { 26 | $locale = $defaultLocale; 27 | } 28 | 29 | if (!in_array($locale, ['en', 'zh_CN', 'jp', 'zh_TW'])) { 30 | $locale = $defaultLocale; 31 | } 32 | 33 | $event->getRequest()->setLocale($locale); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Form/SearchForm/DefaultSearchType.php: -------------------------------------------------------------------------------- 1 | setMethod('GET'); 24 | } 25 | 26 | public function configureOptions(OptionsResolver $resolver) 27 | { 28 | $resolver->setDefaults([ 29 | 'data_class' => ParameterBag::class, 30 | 'csrf_protection' => false, 31 | ]); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/DependencyInjection/Configuration.php: -------------------------------------------------------------------------------- 1 | root('yeskn_vmoex'); 22 | 23 | // Here you should define the parameters that are allowed to 24 | // configure your bundle. See the documentation linked above for 25 | // more information on that topic. 26 | 27 | return $treeBuilder; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/config/config_dev.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | framework: 5 | router: 6 | resource: '%kernel.config_dir%/routing_dev.yml' 7 | strict_requirements: true 8 | profiler: { only_exceptions: false } 9 | 10 | web_profiler: 11 | toolbar: true 12 | intercept_redirects: false 13 | 14 | monolog: 15 | handlers: 16 | main: 17 | type: fingers_crossed 18 | level: debug 19 | channels: ['!event'] 20 | handler: nested 21 | nested: 22 | type: rotating_file 23 | path: '%kernel.logs_dir%/%kernel.environment%.log' 24 | level: debug 25 | max_files: 30 26 | console: 27 | type: console 28 | process_psr_3_messages: false 29 | channels: ['!event', '!doctrine', '!console'] 30 | server_log: 31 | type: server_log 32 | process_psr_3_messages: false 33 | host: 127.0.0.1:9911 34 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Form/SearchForm/SearchVisitType.php: -------------------------------------------------------------------------------- 1 | add('ip', SearchType::class, [ 23 | 'label' => 'IP', 24 | 'required' => false 25 | ]); 26 | 27 | $builder->add('createdAt', DatetimeRangeType::class, [ 28 | 'label' => '访问时间', 29 | 'field_type' => 'datetime', 30 | 'required' => false, 31 | ]); 32 | } 33 | 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/base/script.html.twig: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Tests/Framework/ParameterConfigTest.php: -------------------------------------------------------------------------------- 1 | realKernel = static::bootKernel([]); 24 | } 25 | 26 | public function testSecret() 27 | { 28 | $container = $this->realKernel->getContainer(); 29 | 30 | $this->assertEquals('e01b91e2f072deac5abf039b4f6e6d9149442399', $container->getParameter('secret')); 31 | $this->assertEquals('redis://localhost:6379', $container->getParameter('redis_dsn')); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/DependencyInjection/YesknMainExtension.php: -------------------------------------------------------------------------------- 1 | processConfiguration($configuration, $configs); 24 | 25 | $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 26 | $loader->load('services.yml'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar/hot-user.html.twig: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ "hot.users"|trans }} 4 |
5 |
6 | {% set hotUsers = hotUsers() %} 7 | {% if hotUsers is not empty %} 8 | 19 | {% endif %} 20 |
21 | 22 |
23 | -------------------------------------------------------------------------------- /src/Yeskn/Support/Resources/config/services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | bind: 8 | $projectDir: '%kernel.project_dir%' 9 | 10 | Yeskn\Support\: 11 | resource: '../../../Support/*' 12 | 13 | Yeskn\Support\EventListener\ExceptionListener: 14 | tags: 15 | - { name: kernel.event_listener, event: kernel.exception, priority: 990} 16 | 17 | Yeskn\Support\EventListener\MaintainExceptionListener: 18 | tags: 19 | - { name: kernel.event_listener, event: kernel.exception, priority: 980 } 20 | 21 | Yeskn\Support\EventListener\ControllerCheckForMaintenanceMode: 22 | tags: 23 | - { name: kernel.event_listener, event: kernel.controller, priority: 1000 } 24 | 25 | Yeskn\Support\Routing\DynamicRouteLoader: 26 | tags: 27 | - routing.loader 28 | 29 | Yeskn\Support\EventListener\ConsoleCommandListener: 30 | tags: 31 | - { name: kernel.event_listener, event: console.command, method: onConsoleCommand } 32 | -------------------------------------------------------------------------------- /web/assets-private/js/pjax.js: -------------------------------------------------------------------------------- 1 | if ($.support.pjax) { 2 | $(document).pjax('a[data-pjax]', '.content-body', { 3 | fragment: '.content-body', 4 | timeout: 12e3 5 | }); 6 | 7 | $(document).on('pjax:start', function () { 8 | NProgress.start(); 9 | }); 10 | 11 | $(document).on('pjax:send', function () {}); 12 | 13 | $(document).on('pjax:success', function () {}); 14 | 15 | $(document).on('pjax:complete', function () { 16 | NProgress.done(); 17 | $('body > .modal').remove(); 18 | }); 19 | 20 | $(document).on('pjax:error', function () { 21 | NProgress.done(); 22 | }); 23 | 24 | $(document).on('pjax:end', function () { 25 | NProgress.done(); 26 | }); 27 | 28 | /** 29 | * pjax form handler 30 | */ 31 | $(document).onPjax('submit', '[data-pjax-form]', function (event) { 32 | event.preventDefault(); 33 | 34 | $.pjax.submit(event, '.content-body', { 35 | fragment: '.content-body' 36 | }) 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /app/Resources/views/form/datetime-range-field-type.html.twig: -------------------------------------------------------------------------------- 1 | {% block datetime_range_widget %} 2 | {% set id = form.vars.id %} 3 | {% filter spaceless %} 4 | 5 | {% if attr['help'] is defined %} 6 | {{ attr['help'] }} 7 | {% endif %} 8 | {{ form_errors(form) }} 9 | {% endfilter %} 10 | 11 | 24 | {% endblock %} 25 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/views/crud/search-form.html.twig: -------------------------------------------------------------------------------- 1 | {% form_theme form with [ 2 | 'form/vertical-search-field.html.twig', 3 | ] %} 4 | 5 |
6 |
7 |
8 |
搜索 9 |
10 | 13 |
14 |
15 | {{ form_start(form, {attr: {class: 'search-form'}}) }} 16 |
17 | {{ form_widget(form, {attr: {style: "display:flex;flex-wrap:wrap;"}}) }} 18 |
19 | 22 | {{ form_end(form) }} 23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/base/pjax.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {% block title %} {{ 'site_title'|trans }} {% endblock %} 10 | 11 | 12 | 13 | 14 |
15 | {% block page_wraper %} 16 |
17 |
18 | {% block main %}{% endblock %} 19 |
20 | 25 |
26 | {% endblock %} 27 |
28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/Yeskn/Support/Routing/DynamicRouteLoader.php: -------------------------------------------------------------------------------- 1 | em = $manager; 24 | $this->dynamicRoute = $dynamicRoute; 25 | } 26 | 27 | public function load($resource, $type = null) 28 | { 29 | $routes = $this->dynamicRoute->generateRoutes(); 30 | 31 | $this->isLoaded = true; 32 | 33 | return $routes; 34 | } 35 | 36 | public function supports($resource, $type = null) 37 | { 38 | return 'extra' === $type; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/AnnounceController.php: -------------------------------------------------------------------------------- 1 | getDoctrine()->getRepository('YesknMainBundle:Announce') 27 | ->findBy([], [ 28 | 'show' => 'DESC', 29 | 'id' => 'DESc' 30 | ]); 31 | 32 | return $this->render('@YesknMain/announce/list.html.twig', [ 33 | 'list' => $list 34 | ]); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/DataTransfer/UserToUsernameTransformer.php: -------------------------------------------------------------------------------- 1 | em = $em; 23 | } 24 | 25 | public function transform($value) 26 | { 27 | if ($value instanceof User) { 28 | return $value->getUsername(); 29 | } 30 | 31 | return $value; 32 | } 33 | 34 | public function reverseTransform($value) 35 | { 36 | $repo = $this->em->getRepository('YesknMainBundle:User'); 37 | 38 | return $repo->findOneBy(['username' => $value]); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar-login.html.twig: -------------------------------------------------------------------------------- 1 |
2 |
3 | 第三方登录 4 |
5 |
6 | 7 | Github登录 8 | 9 |
10 |
11 |
12 |
13 | 使用条款 14 |
15 |
16 | 这里是使用条款的详细内容。 17 |
18 |
19 | 20 | 21 | 36 | -------------------------------------------------------------------------------- /web/assets/lib/live2d/message.json: -------------------------------------------------------------------------------- 1 | { 2 | "mouseover": [ 3 | { 4 | "selector": "#showInfoBtn", 5 | "text": ["查看最新吐槽和站内信息"] 6 | }, 7 | { 8 | "selector": "#showTalkBtn", 9 | "text": ["要和我聊天吗?"] 10 | }, 11 | { 12 | "selector": "#hideButton", 13 | "text": ["隐藏伊斯特瓦尔,希望隐藏后我们还能再见面!"] 14 | }, 15 | { 16 | "selector": "#musicButton", 17 | "text": ["给页面加点音乐吗?"] 18 | }, 19 | { 20 | "selector": "#youduButton", 21 | "text": ["按钮有毒,癫痫患者不要开启!!!
点一下开启,再点一下可以关闭。"] 22 | }, 23 | { 24 | "selector": ".itemarticle-tips a", 25 | "text": ["要看看 {text} 么?"] 26 | }, 27 | { 28 | "selector": ".searchbox", 29 | "text": ["在找什么东西呢,需要帮忙吗?"] 30 | } 31 | ], 32 | "click": [ 33 | { 34 | "selector": "#landlord #live2d", 35 | "text": ["不要动手动脚的!快把手拿开~~", "真…真的是不知羞耻!","Hentai!", "再摸的话我可要报警了!", "110吗,这里有个变态!"] 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Command/DoctrineDatabaseInitCommand.php: -------------------------------------------------------------------------------- 1 | setName('doctrine:database:init'); 21 | $this->setDescription('caution: only should be executed after installation!'); 22 | } 23 | 24 | protected function execute(InputInterface $input, OutputInterface $output) 25 | { 26 | $conn = $this->em()->getConnection(); 27 | $sql = file_get_contents($this->parameter('kernel.project_dir') . '/var/data/vmoex.sql'); 28 | 29 | $conn->executeQuery($sql); 30 | 31 | 32 | $output->writeln('ok, that\'s awesome!'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/auth/register.html.twig: -------------------------------------------------------------------------------- 1 | {% extends "@YesknMain/base.html.twig" %} 2 | 3 | {% block main %} 4 |
5 |
6 | 23 |
24 |
25 | {% endblock %} 26 | 27 | {% block sidebar %} 28 | {% include '@YesknMain/sidebar-login.html.twig' %} 29 | {% endblock %} -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/modals/form-modal.html.twig: -------------------------------------------------------------------------------- 1 | {% form_theme form 'form/vertical-field-1.html.twig' %} 2 | 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016-2020 Jaggle 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is furnished 8 | to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/EventListener/ControllerListener.php: -------------------------------------------------------------------------------- 1 | firewallMap = $firewallMap; 30 | } 31 | 32 | public function onKernelController(FilterControllerEvent $event) 33 | { 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /web/assets-private/js/sb-admin-2.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2) 3 | * Copyright 2013-2016 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) 5 | */ 6 | $(function () { 7 | $("#side-menu").metisMenu() 8 | }), $(function () { 9 | $(window).bind("load resize", function () { 10 | var i = 50, n = this.window.innerWidth > 0 ? this.window.innerWidth : this.screen.width; 11 | n < 768 ? ($("div.navbar-collapse").addClass("collapse"), i = 100) : $("div.navbar-collapse").removeClass("collapse"); 12 | var e = (this.window.innerHeight > 0 ? this.window.innerHeight : this.screen.height) - 1; 13 | e -= i, e < 1 && (e = 1), e > i && $("#page-wrapper").css("min-height", e + "px") 14 | }); 15 | for (var i = window.location, n = $("ul.nav a").filter(function () { 16 | return this.href == i 17 | }).addClass("active").parent(); ;) { 18 | if (!n.is("li")) break; 19 | n = n.parent().addClass("in").parent().addClass('active') 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/EventListener/AccessDeniedHandler.php: -------------------------------------------------------------------------------- 1 | translator = $translator; 25 | } 26 | 27 | public function handle(Request $request, AccessDeniedException $accessDeniedException) 28 | { 29 | if ($request->isXmlHttpRequest()) { 30 | return new ApiFail($this->translator->trans('access_denied')); 31 | } 32 | 33 | return $accessDeniedException; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/DataTransfer/DatetimeToStringTransfer.php: -------------------------------------------------------------------------------- 1 | withTime = $withTime; 21 | } 22 | 23 | /** 24 | * 把格式化类型转成模板类型 25 | * 26 | * @param \DateTime $value 27 | * 28 | * @return string 29 | */ 30 | public function transform($value) 31 | { 32 | return $value->format($this->withTime 33 | ? 'Y-m-d H:i:s' 34 | : 'Y-m-d' 35 | ); 36 | } 37 | 38 | /** 39 | * 把显示类型转成格式化类型 40 | * 41 | * @param string $value 42 | * @return \DateTime 43 | */ 44 | public function reverseTransform($value) 45 | { 46 | return new \DateTime($value); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar/hot-topics.html.twig: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/modals/send-message-modal.html.twig: -------------------------------------------------------------------------------- 1 | {% form_theme form 'form/no-label-field-1.html.twig' %} 2 | 3 | -------------------------------------------------------------------------------- /src/Yeskn/Support/EventListener/MaintainExceptionListener.php: -------------------------------------------------------------------------------- 1 | templating = $templating; 24 | } 25 | 26 | public function onKernelException(GetResponseForExceptionEvent $event) 27 | { 28 | if ($event->getException() instanceof AccessDeniedHttpException) { 29 | $event->setResponse(new Response( 30 | $this->templating->render('@YesknSupport/maintain.html.twig', [ 31 | 'message' => $event->getException()->getMessage() 32 | ]))); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/DependencyInjection/Configuration.php: -------------------------------------------------------------------------------- 1 | root('yeskn_admin'); 29 | 30 | // Here you should define the parameters that are allowed to 31 | // configure your bundle. See the documentation linked above for 32 | // more information on that topic. 33 | 34 | return $treeBuilder; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/Type/ImageInputType.php: -------------------------------------------------------------------------------- 1 | setDefaults([ 24 | 'width' => null, 25 | 'height' => null 26 | ]); 27 | } 28 | 29 | public function buildView(FormView $view, FormInterface $form, array $options) 30 | { 31 | parent::buildView($view, $form, $options); 32 | 33 | $view->vars += $options; 34 | } 35 | 36 | public function getParent() 37 | { 38 | return FileType::class; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Command/BroadcastCommand.php: -------------------------------------------------------------------------------- 1 | setName('broadcast'); 23 | $this->setDescription('broadcast message to all online users'); 24 | $this->addOption('message', null, InputOption::VALUE_REQUIRED); 25 | } 26 | 27 | protected function execute(InputInterface $input, OutputInterface $output) 28 | { 29 | /** @var SocketPushService $socket */ 30 | $socket = $this->get('socket.push'); 31 | 32 | $socket->pushAll('broadcast', [ 33 | 'message' => $input->getOption('message') 34 | ]); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/PhotoType.php: -------------------------------------------------------------------------------- 1 | getData(); 17 | 18 | $builder 19 | ->add('name',null, array('attr' => array('autofocus' => true), 'label' => '标题',)) 20 | ->add('file',ImageInputType::class, [ 21 | 'label' => '封面图', 22 | 'required' => $entity->getFile() ? false : true 23 | ]); 24 | ; 25 | } 26 | 27 | /** 28 | * @inheritdoc 29 | * @param OptionsResolver $resolver 30 | */ 31 | public function configureOptions(OptionsResolver $resolver) 32 | { 33 | $resolver->setDefaults(array( 34 | 'data_class' => Photo::class, 35 | )); 36 | } 37 | } -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/DependencyInjection/YesknAdminExtension.php: -------------------------------------------------------------------------------- 1 | processConfiguration($configuration, $configs); 31 | 32 | $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 33 | $loader->load('services.yml'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Services/RandomAvatarService.php: -------------------------------------------------------------------------------- 1 | avaDir = $projectDir . '/web/upload/avatar'; 22 | } 23 | 24 | public function handle(User $user) 25 | { 26 | $fileName = md5($user->getUsername() . time()) . '.png'; 27 | $file = $this->avaDir . '/' . $fileName; 28 | 29 | // 使用随机二次元头像 30 | $i = mt_rand(1, 99999); 31 | 32 | file_put_contents($file, 33 | file_get_contents("https://www.thiswaifudoesnotexist.net/example-{$i}.jpg") 34 | ); 35 | 36 | Image::configure(array('driver' => 'gd')); 37 | 38 | $image = Image::make($file); 39 | $image->resize(200, 200)->save(); 40 | 41 | $user->setAvatar('upload/avatar/' . $fileName); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /web/assets-private/js/socket.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | var socket = io(window.Yeskn.socketHost); 3 | 4 | socket.on('connect', function(){ 5 | socket.emit('login', { 6 | username: window.Yeskn.user.username, 7 | token: window.Yeskn.user.socketToken 8 | }); 9 | }); 10 | 11 | // 新的通知 12 | socket.on('comment_mention', handleNewNotification); 13 | socket.on('comment_post', handleNewNotification); 14 | 15 | socket.on('new_message', handleNewMessage); 16 | socket.on('new_follower', handleNewFollower); 17 | socket.on('new_chat', handleNewChat); 18 | socket.on('create_blog_event', handleCreateBlogEvent); 19 | socket.on('update_online_count', function (data) { 20 | data = JSON.parse(data); 21 | 22 | var totalCnt; 23 | 24 | if (data.onlineCount < parseInt($('#memberCnt').text())) { 25 | totalCnt = parseInt($('#memberCnt').text()); 26 | } else { 27 | totalCnt = data.onlineCount; 28 | } 29 | 30 | $('#onlineCnt').text(totalCnt); 31 | }); 32 | socket.on('broadcast', function (data) { 33 | success(data.message); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/views/modals/add-translate-modal.html.twig: -------------------------------------------------------------------------------- 1 | {% form_theme form 'form/vertical-field-1.html.twig' %} 2 | 3 | 22 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/Type/TinyHtmlTextareaType.php: -------------------------------------------------------------------------------- 1 | setDefaults([ 24 | 'height' => null 25 | ]); 26 | 27 | // 设置一个选项为必传 28 | // $resolver->setRequired('width'); 29 | } 30 | 31 | public function buildView(FormView $view, FormInterface $form, array $options) 32 | { 33 | parent::buildView($view, $form, $options); 34 | $view->vars += $options; 35 | } 36 | 37 | public function getParent() 38 | { 39 | return TextareaType::class; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Yeskn/Support/Resources/views/maintain.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Be right back. 5 | 6 | 36 | 37 | 38 |
39 |
40 |
{{ message ?: 'Be right back' }}
41 |
42 |
43 | 44 | 45 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/UsersController.php: -------------------------------------------------------------------------------- 1 | getRepo('YesknMainBundle:User') 23 | ->findBy([], ['gold' => 'DESC'], 100); 24 | 25 | return $this->render('@YesknMain/users/rich.html.twig', [ 26 | 'users' => $users 27 | ]); 28 | 29 | } 30 | 31 | /** 32 | * @Route("/users/rank/checkin", name="users_rank_checkin") 33 | */ 34 | public function rankSignAction() 35 | { 36 | $users = $this->getRepo('YesknMainBundle:User') 37 | ->findBy([], ['signDay' => 'DESC'], 100); 38 | 39 | return $this->render('@YesknMain/users/sign.html.twig', [ 40 | 'users' => $users 41 | ]); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/Support/EventListener/ConsoleCommandListener.php: -------------------------------------------------------------------------------- 1 | varDir = rtrim($projectDir, '/') . '/var'; 21 | } 22 | 23 | public function onConsoleCommand(ConsoleCommandEvent $event) 24 | { 25 | switch ($event->getCommand()->getName()) { 26 | case 'assetic:dump': 27 | $this->onAsseticDump($event); 28 | break; 29 | default: 30 | return ; 31 | } 32 | } 33 | 34 | protected function onAsseticDump(ConsoleCommandEvent $event) 35 | { 36 | $output = $event->getOutput(); 37 | $hash = substr(uniqid(), 0, 8); 38 | 39 | $output->writeln("generated new assets version: {$hash}"); 40 | 41 | file_put_contents($this->varDir . '/assets_version', $hash); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/OptionsGirlType.php: -------------------------------------------------------------------------------- 1 | add('girl_enable', CheckboxType::class, [ 24 | 'label' => '启用看板娘', 25 | 'required' => false, 26 | ]); 27 | $builder->add('submit', SubmitType::class, [ 28 | 'label' => '提交' 29 | ]); 30 | } 31 | 32 | /** 33 | * {@inheritdoc} 34 | */ 35 | public function configureOptions(OptionsResolver $resolver) 36 | { 37 | $resolver->setDefaults(array( 38 | 'data_class' => ParameterBag::class 39 | )); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/TagType.php: -------------------------------------------------------------------------------- 1 | add('name', null, [ 23 | 'label' => '名称', 24 | 'required' => true, 25 | ]); 26 | $builder->add('slug', null, [ 27 | 'label' => '别名', 28 | 'required' => true 29 | ]); 30 | $builder->add('status', CheckboxType::class, [ 31 | 'label' => '启用', 32 | 'required' => false 33 | ]); 34 | } 35 | 36 | public function configureOptions(OptionsResolver $resolver) 37 | { 38 | $resolver->setDefaults([ 39 | 'data_class' => Tag::class, 40 | ]); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/AnnounceType.php: -------------------------------------------------------------------------------- 1 | add('content', TinyHtmlTextareaType::class, [ 24 | 'label' => '内容', 25 | 'height' => '100', 26 | 'required' => true, 27 | ]); 28 | $builder->add('show', CheckboxType::class, [ 29 | 'label' => '启用', 30 | 'required' => false 31 | ]); 32 | } 33 | 34 | public function configureOptions(OptionsResolver $resolver) 35 | { 36 | $resolver->setDefaults([ 37 | 'data_class' => Announce::class, 38 | ]); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | tests 18 | src/*/*/Tests 19 | 20 | 21 | 22 | 23 | 24 | src 25 | 26 | src/*Bundle/Resources 27 | src/*/*Bundle/Resources 28 | src/*/Bundle/*Bundle/Resources 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /web/app_dev.php: -------------------------------------------------------------------------------- 1 | loadClassCache(); 27 | } 28 | $request = Request::createFromGlobals(); 29 | $response = $kernel->handle($request); 30 | $response->send(); 31 | $kernel->terminate($request, $response); 32 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/views/modals/entity-modal.html.twig: -------------------------------------------------------------------------------- 1 | {% form_theme form with [ 2 | 'form/vertical-field-1.html.twig', 3 | 'form/vertical-checkbox-type.html.twig' 4 | ] %} 5 | 6 | {% set formId = formId is defined ? formId : '' %} 7 | 8 | 27 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/CategoryType.php: -------------------------------------------------------------------------------- 1 | add('name', TextType::class, [ 24 | 'label' => '名称' 25 | ]); 26 | 27 | $builder->add('slug', TextType::class, [ 28 | 'label' => '别名' 29 | ]); 30 | 31 | $builder->add('status', CheckboxType::class, [ 32 | 'label' => '启用', 33 | 'required' => false 34 | ]); 35 | } 36 | 37 | public function configureOptions(OptionsResolver $resolver) 38 | { 39 | $resolver->setDefaults([ 40 | 'data_class' => Category::class, 41 | ]); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Tests/Controller/StatusControllerTest.php: -------------------------------------------------------------------------------- 1 | request('GET', $url); 27 | $client->catchExceptions(false); 28 | 29 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); 30 | 31 | $response = $client->getResponse()->getContent(); 32 | 33 | $response = json_decode($response); 34 | 35 | $this->assertNotNull($response); 36 | $this->assertObjectHasAttribute('detail', $response); 37 | $this->assertEquals(1, $response->status); 38 | } 39 | 40 | public function provideUrls() 41 | { 42 | return array( 43 | array('/status'), 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/config/parameters.yml.dist: -------------------------------------------------------------------------------- 1 | # 注意:如果你在安装过程(composer install)中忘记了设置某个配置项,再修改本文件是没有用的, 2 | # 请修改文件app/config/parameter.yml 3 | 4 | parameters: 5 | 6 | # 数据库配置,mysql建议使用5.7版本 7 | database_host: 127.0.0.1 8 | database_port: 3306 9 | database_name: vmoex-framework 10 | database_user: root 11 | database_password: ~ 12 | 13 | # redis配置,下面passwd为redis的密码(请务必设置redis密码!) 14 | redis_dsn: 'redis://@localhost' 15 | 16 | # 邮箱smtp配置,不配置则无法向用户发送验证、通知邮件 17 | mailer_transport: smtp 18 | mailer_host: ~ 19 | mailer_user: ~ 20 | mailer_password: ~ 21 | 22 | # 没有规律的32个左右的字符 23 | secret: i9did8d9Jd8dhs0dkw8d7djKN8dA071A 24 | 25 | # 以下两项用于合并压缩js代码,必填 26 | # 查看命令的执行路径: `which node`,`which uglifyjs` 27 | # uglifyjs(ES版本)的安装命令 `npm install uglify-es -g` 28 | 29 | node_path: /usr/bin/node 30 | uglifyjs2_path: /usr/bin/uglifyjs 31 | 32 | # websocket地址,127.0.0.1为当前网站的域名或者ip,如果为htts,则需要在下面设置证书; 需确保3120端口可外网访问 33 | socket_host: 'http://127.0.0.1:3120' 34 | 35 | # websocket的证书,websocket为https时必填 36 | socket_local_cert: ~ 37 | socket_local_pk: ~ 38 | 39 | # 内部推送地址,无需更改127.0.0.1,因为推送都在服务器上进行; 需确保3121端口可外网访问 40 | socket_push_host: 'http://127.0.0.1:3121' 41 | 42 | # 资源文件的cdn地址,或者直接用当前网站地址 43 | assets_base_url: http://127.0.0.1:8000 44 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/ChangePasswordType.php: -------------------------------------------------------------------------------- 1 | add('oldPassword', PasswordType::class); 24 | $builder->add('newPassword', RepeatedType::class, [ 25 | 'type' => PasswordType::class, 26 | 'required' => true, 27 | 'first_options' => array('label' => 'New Password'), 28 | 'second_options' => array('label' => 'Repeat Password'), 29 | ]); 30 | } 31 | 32 | public function configureOptions(OptionsResolver $resolver) 33 | { 34 | $resolver->setDefaults([ 35 | 'data_class' => ChangePassword::class 36 | ]); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Resources/views/crud/footer-javascript.html.twig: -------------------------------------------------------------------------------- 1 | 40 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Command/TranslationLoadCommand.php: -------------------------------------------------------------------------------- 1 | loadTranslationService = $loadTranslationService; 27 | $this->configure(); 28 | 29 | parent::__construct(); 30 | } 31 | 32 | protected function configure() 33 | { 34 | $this->setName('translation:load'); 35 | $this->setDescription('load translation from db to file'); 36 | } 37 | 38 | protected function execute(InputInterface $input, OutputInterface $output) 39 | { 40 | $this->loadTranslationService->execute(); 41 | $output->writeln('finished!'); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Form/SearchForm/SearchCommentType.php: -------------------------------------------------------------------------------- 1 | add('content', SearchType::class, [ 23 | 'label' => '内容', 24 | 'required' => false 25 | ]); 26 | 27 | $builder->add('title', SearchType::class, [ 28 | 'label' => '文章标题', 29 | 'required' => false 30 | ]); 31 | 32 | $builder->add('createdBy', SearchType::class, [ 33 | 'label' =>'作者', 34 | 'required' => false 35 | ]); 36 | 37 | $builder->add('createdAt', DatetimeRangeType::class, [ 38 | 'label' => '发布时间', 39 | 'field_type' => 'date', 40 | 'date_range' => true, 41 | 'required' => false, 42 | ]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/TabsController.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * created at 2018-06-10 12:05:03 9 | * 10 | * For the full copyright and license information, please view the LICENSE 11 | * file that was distributed with this source code. 12 | */ 13 | 14 | namespace Yeskn\MainBundle\Controller; 15 | 16 | use Symfony\Component\Routing\Annotation\Route; 17 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; 18 | 19 | /** 20 | * Class TabsController 21 | * @package Yeskn\MainBundle\Controller 22 | * 23 | * @Route("/tabs") 24 | */ 25 | class TabsController extends Controller 26 | { 27 | /** 28 | * @Route("", name="tabs_index") 29 | * @throws 30 | */ 31 | public function indexAction() 32 | { 33 | $count = $this->getDoctrine()->getRepository('YesknMainBundle:Tab') 34 | ->createQueryBuilder('p') 35 | ->select('COUNT(p)') 36 | ->getQuery() 37 | ->getSingleScalarResult(); 38 | 39 | $tabs = $this->getDoctrine()->getRepository('YesknMainBundle:Tab')->findAll(); 40 | 41 | 42 | return $this->render('@YesknMain/tabs.html.twig', [ 43 | 'tabs' => $tabs, 44 | 'tab_count' => $count 45 | ]); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/UserLoginType.php: -------------------------------------------------------------------------------- 1 | add('username', TextType::class, ['label' => '用户名', 'translation_domain' => 'messages']) 19 | ->add('email', EmailType::class, ['label' => '邮箱', 'translation_domain' => 'messages']) 20 | ->add('password', PasswordType::class,['label' => '密码', 'translation_domain' => 'messages']) 21 | ->add('submit', SubmitType::class, ['label' => 'register', 'translation_domain' => 'messages']) 22 | ; 23 | } 24 | 25 | public function configureOptions(OptionsResolver $resolver) 26 | { 27 | $resolver->setDefaults([ 28 | 'data_class' => User::class, 29 | ]); 30 | } 31 | } -------------------------------------------------------------------------------- /src/Yeskn/Support/AbstractControllerListener.php: -------------------------------------------------------------------------------- 1 | tokenStorage = $tokenStorage; 31 | $this->em = $em; 32 | } 33 | 34 | /** 35 | * @return UserInterface|null 36 | */ 37 | protected function getUser() 38 | { 39 | if (null === $token = $this->tokenStorage->getToken()) { 40 | return null; 41 | } 42 | 43 | /** @var UserInterface $user */ 44 | if (!is_object($user = $token->getUser())) { 45 | // e.g. anonymous authentication 46 | return null; 47 | } 48 | 49 | return $user; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Form/SearchForm/SearchTranslationType.php: -------------------------------------------------------------------------------- 1 | add('messageId', SearchType::class, [ 22 | 'label' => 'messageId', 23 | 'required' => false 24 | ]); 25 | $builder->add('chinese', SearchType::class, [ 26 | 'label' => '中文', 27 | 'required' => false 28 | ]); 29 | $builder->add('english', SearchType::class, [ 30 | 'label' => '英文', 31 | 'required' => false 32 | ]); 33 | $builder->add('taiwanese', SearchType::class, [ 34 | 'label' => '中文繁体', 35 | 'required' => false 36 | ]); 37 | 38 | $builder->add('japanese', SearchType::class, [ 39 | 'label' => '日语', 40 | 'required' => false 41 | ]); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/QueryBuilder/UserQueryBuilder.php: -------------------------------------------------------------------------------- 1 | queryBuilder->andWhere('p.username LIKE :username'); 22 | $this->queryBuilder->setParameter('username', "%{$params['username']}%"); 23 | } 24 | 25 | if (!empty($params['nickname'])) { 26 | $this->queryBuilder->andWhere('p.nickname LIKE :nickname'); 27 | $this->queryBuilder->setParameter('nickname', "%{$params['nickname']}%"); 28 | } 29 | 30 | if (!empty($params['registerAt'][0])) { 31 | $this->queryBuilder 32 | ->andWhere('p.registerAt >= :createdAt0')->setParameter('createdAt0', $params['registerAt'][0]) 33 | ->andWhere('p.registerAt <= :createdAt1')->setParameter('createdAt1', $params['registerAt'][1]) 34 | ; 35 | } 36 | 37 | return $this->queryBuilder; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/InfoController.php: -------------------------------------------------------------------------------- 1 | getUser(); 24 | 25 | $messages = $this->getDoctrine()->getRepository('YesknMainBundle:Message') 26 | ->getUnReadMessages($user); 27 | 28 | $messageRet = []; 29 | 30 | foreach ($messages as &$message) { 31 | $messageRet[] = [ 32 | 'createdAt' => $message->getCreatedAt()->format('Y-m-d H:i:s'), 33 | 'content' => $message->getContent(), 34 | 'sender' => $message->getSender()->getNickname(), 35 | 'sender_username' => $message->getSender()->getUsername() 36 | ]; 37 | } 38 | 39 | return new JsonResponse([ 40 | 'messages' => $messageRet ?: null 41 | ]); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/NoticeController.php: -------------------------------------------------------------------------------- 1 | getDoctrine()->getRepository('YesknMainBundle:Notice') 28 | ->createQueryBuilder('p') 29 | ->where('p.pushTo = :user')->setParameter('user', $this->getUser()) 30 | ->andWhere('p.isRead = false') 31 | ->orderBy('p.createdAt', 'DESC') 32 | ->getQuery() 33 | ->getResult(5); 34 | 35 | foreach ($notices as $notice) { 36 | $notice->setIsRead(true); 37 | } 38 | 39 | $this->getDoctrine()->getManager()->flush(); 40 | 41 | return new JsonResponse(['ret' => 1]); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/DefaultController.php: -------------------------------------------------------------------------------- 1 | get('tab'); 24 | $page = $request->get('page', 1); 25 | return $this->forward('YesknMainBundle:Common:homeList', [ 26 | 'tab' => $tab, 27 | 'page' => $page, 28 | 'scope' => 'home', 29 | 'sortBy' => $request->get('sortBy', 'com') 30 | ]); 31 | } 32 | 33 | /** 34 | * @Route("/about", name="about") 35 | */ 36 | public function aboutAction() 37 | { 38 | return $this->render('@YesknMain/about.html.twig'); 39 | } 40 | 41 | /** 42 | * @Route("/contribute", name="contribute") 43 | */ 44 | public function contributeAction() 45 | { 46 | return $this->render('@YesknMain/contribute.html.twig'); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/config/security.yml: -------------------------------------------------------------------------------- 1 | security: 2 | encoders: 3 | Yeskn\MainBundle\Entity\User: bcrypt 4 | Symfony\Component\Security\Core\User\User: plaintext 5 | 6 | providers: 7 | database_provider: 8 | entity: 9 | class: YesknMainBundle:User 10 | in_memory: 11 | memory: ~ 12 | 13 | role_hierarchy: 14 | ROLE_ADMIN: ROLE_USER 15 | ROLE_SUPER_ADMIN: ROLE_ADMIN 16 | 17 | firewalls: 18 | dev: 19 | pattern: ^/(_(profiler|wdt)|css|images|js)/ 20 | security: false 21 | 22 | main: 23 | pattern: ^/ 24 | anonymous: true 25 | logout_on_user_change: true 26 | provider: database_provider 27 | access_denied_handler: Yeskn\MainBundle\EventListener\AccessDeniedHandler 28 | form_login: 29 | login_path: login 30 | check_path: do_login 31 | always_use_default_target_path: true 32 | default_target_path: / 33 | logout: 34 | path: /logout 35 | target: / 36 | remember_me: 37 | secret: '%secret%' 38 | name: _token 39 | lifetime: 604800 40 | path: / 41 | 42 | access_control: 43 | - { path: ^/admin, roles: ROLE_ADMIN } 44 | -------------------------------------------------------------------------------- /web/assets/lib/bootoast/css/bootoast.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootoast CSS 3 | * @author odahcam 4 | * @version 1.0.0 5 | **/ 6 | 7 | .bootoast { 8 | opacity: 0; 9 | filter: alpha(opacity=0) 10 | } 11 | 12 | .bootoast>.glyphicon { 13 | display: inline-block; 14 | float: left; 15 | font-size: 20px; 16 | margin-right: 14px; 17 | } 18 | 19 | .bootoast>.bootoast-alert-container { 20 | display: block; 21 | max-width: 100%; 22 | overflow: auto; 23 | } 24 | 25 | .bootoast>.bootoast-alert-container>.bootoast-alert-content { 26 | display: table; 27 | width: 100%; 28 | height: 100% 29 | } 30 | 31 | .bootoast-container { 32 | position: fixed; 33 | left: 20px; 34 | right: 20px; 35 | top: initial; 36 | bottom: initial; 37 | width: 390px; 38 | max-width: 95%; 39 | z-index: 2060 40 | } 41 | 42 | .bootoast-container.top { 43 | top: 20px 44 | } 45 | 46 | .bootoast-container.bottom { 47 | bottom: 20px 48 | } 49 | 50 | .bootoast-container.right { 51 | left: initial 52 | } 53 | 54 | .bootoast-container.left { 55 | right: initial 56 | } 57 | 58 | .bootoast-container.center { 59 | left: 50%; 60 | -webkit-transform: translateX(-50%); 61 | -moz-transform: translateX(-50%); 62 | -ms-transform: translateX(-50%); 63 | -o-transform: translateX(-50%); 64 | transform: translateX(-50%) 65 | } 66 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/LocaleController.php: -------------------------------------------------------------------------------- 1 | get('locale'); 31 | 32 | if (in_array($locale, ['en', 'zh_CN', 'zh_TW', 'jp'])) { 33 | $response = new JsonResponse(['ret' => 1, 'msg' => $this->get('translator')->trans('success')]); 34 | $response->headers->setCookie(new Cookie('_locale', $locale)); 35 | 36 | return $response; 37 | } 38 | 39 | return new ApiFail($trans->trans('locale invalid')); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/SearchController.php: -------------------------------------------------------------------------------- 1 | get('s')); 30 | $count = $request->get('c'); 31 | 32 | $em = $this->getDoctrine()->getManager(); 33 | 34 | $postResults = $em->getRepository('YesknMainBundle:Post')->queryPosts($s, $count); 35 | 36 | $userResults = $em->getRepository('YesknMainBundle:User')->queryUser($s, $count); 37 | 38 | return $this->render('@YesknMain/search/search.html.twig', [ 39 | 'word' => $s, 40 | 'posts' => $postResults, 41 | 'users' => $userResults 42 | ]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /web/assets/lib/live2d/model/nep/motions/tap/smile.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | PARAM_BROW_L_ANGLE=0 4 | PARAM_ANGLE_Z=14,13.79,13.18,12.23,10.96,9.42,7.64,5.72,3.61,1.4,-0.88,-3.12,-5.4,-7.61,-9.72,-11.64,-13.42,-14.96,-16.23,-17.18,-17.79,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18,-18 5 | PARAM_BODY_ANGLE_X=3 6 | PARAM_BODY_ANGLE_Y=0,0.15,0.5,0.94,1.37,1.71,1.93,2,1.97,1.9,1.79,1.65,1.48,1.29,1.1,0.9,0.71,0.52,0.35,0.21,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 7 | PARAM_BODY_ANGLE_Z=1,0.94,0.76,0.48,0.12,-0.3,-0.76,-1.25,-1.75,-2.24,-2.7,-3.12,-3.48,-3.76,-3.94,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4 8 | PARAM_ARM_R_B=0 9 | PARAM_BREATH=0 10 | PARAM_ANGLE_Y=8 11 | PARAM_BROW_R_Y=0 12 | PARAM_ANGLE_X=0 13 | PARAM_BROW_R_X=0 14 | PARAM_MOUTH_FORM=1 15 | PARAM_EYE_L_OPEN=0 16 | PARAM_BUST_Y=0 17 | PARAM_EYE_FORM=0 18 | PARAM_EYE_L_SMILE=1 19 | PARAM_BROW_L_FORM=0 20 | PARAM_EYE_BALL_FORM=0 21 | PARAM_BROW_L_X=0 22 | PARAM_BROW_L_Y=0 23 | PARAM_BROW_R_ANGLE=0 24 | PARAM_EYE_R_SMILE=1 25 | PARAM_ARM_R_A=1 26 | PARAM_BROW_R_FORM=0 27 | PARAM_EYE_R_OPEN=0 28 | PARAM_TERE=0 29 | PARAM_HAIR_BACK=0 30 | PARAM_HAIR_FRONT=0 31 | PARAM_ARM_L_A=1 32 | PARAM_EYE_BALL_X=0 33 | PARAM_EYE_BALL_Y=0 34 | PARAM_ARM_L_B=0 -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Form/SearchForm/SearchUserType.php: -------------------------------------------------------------------------------- 1 | add('id', SearchType::class, [ 23 | 'label' => 'ID', 24 | 'required' => false 25 | ]); 26 | $builder->add('username', SearchType::class, [ 27 | 'label' => '用户名', 28 | 'required' => false 29 | ]); 30 | $builder->add('registerAt', DatetimeRangeType::class, [ 31 | 'label' => '注册时间', 32 | 'field_type' => 'date', 33 | 'required' => false, 34 | ]); 35 | $builder->add('nickname', SearchType::class, [ 36 | 'label' => '昵称', 37 | 'required' => false, 38 | ]); 39 | $builder->add('email', SearchType::class, [ 40 | 'label' => '邮箱', 41 | 'required' => false, 42 | ]); 43 | 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Routing/DynamicRoutesGenerator.php: -------------------------------------------------------------------------------- 1 | em = $em; 25 | } 26 | 27 | /** 28 | * @return RouteCollection 29 | * @throws \UnexpectedValueException 30 | */ 31 | public function generateRoutes() 32 | { 33 | $routes = new RouteCollection(); 34 | 35 | $pages = $this->em->getRepository(Page::class)->findBy(['status' => 1]); 36 | 37 | $defaults = array( 38 | '_controller' => 'YesknMainBundle:Page:render', 39 | ); 40 | 41 | foreach ($pages as $page) { 42 | $route = new Route($page->getUri(), $defaults, []); 43 | $routeName = 'extraRoute_' . md5($page->getId()); 44 | $routes->add($routeName, $route); 45 | } 46 | 47 | return $routes; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/TranslationType.php: -------------------------------------------------------------------------------- 1 | getData(); 24 | 25 | $builder->add('messageId', TextType::class, [ 26 | 'label' => '词条Id', 27 | 'attr' => [ 28 | 'readonly' => $entity ? (!$entity->isCanDelete()) : false 29 | ] 30 | ]); 31 | $builder->add('chinese', null, ['label' => '中文']); 32 | $builder->add('english', null, ['label' => '英文']); 33 | $builder->add('japanese', null, ['label' => '日文']); 34 | $builder->add('taiwanese', null, ['label' => '中文繁体']); 35 | } 36 | 37 | public function configureOptions(OptionsResolver $resolver) 38 | { 39 | $resolver->setDefaults([ 40 | 'data_class' => Translation::class 41 | ]); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/UserMessageType.php: -------------------------------------------------------------------------------- 1 | em = $entityManager; 28 | } 29 | 30 | public function buildForm(FormBuilderInterface $builder, array $options) 31 | { 32 | $builder->add('content', TextareaType::class); 33 | $builder->add( 34 | $builder->create('receiver', HiddenType::class) 35 | ->addModelTransformer(new UserToUsernameTransformer($this->em)) 36 | ); 37 | } 38 | 39 | public function configureOptions(OptionsResolver $resolver) 40 | { 41 | $resolver->setDefaults([ 42 | 'data_class' => Message::class 43 | ]); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/QueryBuilder/TranslationQueryBuilder.php: -------------------------------------------------------------------------------- 1 | queryBuilder->andWhere('p.messageId LIKE :messageId'); 22 | $this->queryBuilder->setParameter('messageId', "%{$params['messageId']}%"); 23 | } 24 | 25 | if (!empty($params['chinese'])) { 26 | $this->queryBuilder->andWhere('p.chinese LIKE :chinese'); 27 | $this->queryBuilder->setParameter('chinese', "%{$params['chinese']}%"); 28 | } 29 | 30 | if (!empty($params['japanese'])) { 31 | $this->queryBuilder->andWhere('p.japanese LIKE :japanese'); 32 | $this->queryBuilder->setParameter('japanese', "%{$params['japanese']}%"); 33 | } 34 | 35 | if (!empty($params['taiwanese'])) { 36 | $this->queryBuilder->andWhere('p.taiwanese LIKE :taiwanese'); 37 | $this->queryBuilder->setParameter('taiwanese', "%{$params['taiwanese']}%"); 38 | } 39 | 40 | return $this->queryBuilder; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartRenderPageListEvent.php: -------------------------------------------------------------------------------- 1 | globalValue = $globalValue; 26 | $this->router = $router; 27 | } 28 | 29 | public function execute() 30 | { 31 | $result = []; 32 | $ids = []; 33 | 34 | foreach ($this->list as $item) { 35 | $ids[] = $item->getId(); 36 | 37 | $result[] = [ 38 | $item->getId(), 39 | sprintf("%s", $item->getUri(), $item->getTitle()), 40 | $item->getStatus() ? '启用' : '未启用', 41 | $this->globalValue->ago($item->getCreatedAt()) 42 | ]; 43 | } 44 | 45 | return [ 46 | 'columns' => ['ID', '标题', '状态', '创建时间'], 47 | 'entitySubTitle' => '可动态为网站添加路由。', 48 | 'list' => $result, 49 | 'ids' => $ids 50 | ]; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartRenderPhotoListEvent.php: -------------------------------------------------------------------------------- 1 | globalValue = $globalValue; 30 | $this->asset = $asset; 31 | } 32 | 33 | public function execute() 34 | { 35 | $ids = $result = []; 36 | 37 | foreach ($this->list as $photo) { 38 | $ids[] = $photo->getId(); 39 | 40 | $result[] = [ 41 | $photo->getId(), 42 | $photo->getName(), 43 | $this->imgColumn($photo->getFile()), 44 | $this->globalValue->ago($photo->getCreatedAt()) 45 | ]; 46 | } 47 | 48 | return [ 49 | 'columns' => ['ID', '名称', '文件', '发布日期'], 50 | 'entitySubTitle' => '上传图片用于在其他地方插入', 51 | 'list' => $result, 52 | 'ids' => $ids, 53 | ]; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/PageType.php: -------------------------------------------------------------------------------- 1 | add('title', TextType::class, [ 25 | 'label' => '标题', 26 | ]); 27 | 28 | $builder->add('uri', TextType::class, [ 29 | 'label' => '路径' 30 | ]); 31 | 32 | $builder->add('status', CheckboxType::class, [ 33 | 'label' => '启用', 34 | 'required'=>false 35 | ]); 36 | 37 | $builder->add('content', TinyHtmlTextareaType::class, [ 38 | 'label' => '内容', 39 | 'required' => true, 40 | 'height' => 300 41 | ]); 42 | } 43 | 44 | public function configureOptions(OptionsResolver $resolver) 45 | { 46 | $resolver->setDefaults([ 47 | 'data_class' => Page::class 48 | ]); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/AbstractCrudListEvent.php: -------------------------------------------------------------------------------- 1 | list = $list; 32 | 33 | return $this; 34 | } 35 | 36 | protected function getList() 37 | { 38 | return $this->list; 39 | } 40 | 41 | public function imgColumn($val, $width = 100) 42 | { 43 | if (empty($val)) return ''; 44 | 45 | $val = $this->asset->getAssetUrl($val); 46 | return sprintf('', $width, $width, $val); 47 | } 48 | 49 | public function linkColumn($text, $route, $params = null) 50 | { 51 | if (is_null($params)) { 52 | return sprintf("%s", $route, $text); 53 | } 54 | 55 | return sprintf("%s", $this->router->generate($route, $params), $text); 56 | } 57 | 58 | abstract function execute(); 59 | } 60 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/config/services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | bind: 8 | $socketHost: "%socket_host%" 9 | $projectDir: "%kernel.project_dir%" 10 | $emailUser: "%mailer_user%" 11 | 12 | Yeskn\MainBundle\: 13 | resource: '../../../MainBundle/*' 14 | exclude: '../../../MainBundle/{Entity,Repository,Tests,Form/DataTransfer}' 15 | 16 | Yeskn\Support\Routing\DynamicRoutesGeneratorInterface: '@Yeskn\MainBundle\Routing\DynamicRoutesGenerator' 17 | 18 | Yeskn\MainBundle\Controller\: 19 | resource: '../../../MainBundle/Controller' 20 | public: true 21 | tags: ['controller.service_arguments'] 22 | 23 | Yeskn\MainBundle\Twig\Render: 24 | tags: 25 | - { name: twig.extension } 26 | 27 | socket.push: 28 | public: true 29 | class: Yeskn\MainBundle\Services\SocketPushService 30 | 31 | Yeskn\MainBundle\Twig\GlobalValue: 32 | tags: 33 | - { name: twig.extension } 34 | 35 | Yeskn\MainBundle\EventListener\AjaxAuthenticationListener: 36 | tags: 37 | - { name: kernel.event_listener, event: kernel.exception, method: onCoreException, priority: 1000 } 38 | 39 | Knp\Bundle\MarkdownBundle\Parser\MarkdownParser: 40 | arguments: 41 | - { header: false, list: false, table: false } 42 | 43 | Yeskn\MainBundle\EventListener\TerminateListener: 44 | tags: 45 | - { name: kernel.event_listener, event: kernel.terminate, method: onTerminate } 46 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/ProcessEditTabEvent.php: -------------------------------------------------------------------------------- 1 | webRoot = $projectDir . '/web'; 32 | $this->oldAvatar = StartEditTabEvent::$oldProperty['avatar']; 33 | 34 | $imageHandler->setHeight(200); 35 | $imageHandler->setWidth(200); 36 | $this->imageHandler = $imageHandler; 37 | } 38 | 39 | public function execute() 40 | { 41 | $entityObj = $this->entity; 42 | 43 | if ($entityObj->getLevel() == 1) { 44 | $entityObj->setParent(null); 45 | } 46 | 47 | if ($entityObj->getAvatar() instanceof File) { 48 | $this->imageHandler->handle($entityObj, 'avatar'); 49 | } else if (!empty($this->oldAvatar)) { 50 | $entityObj->setAvatar($this->oldAvatar); 51 | } else { 52 | throw new \Exception('板块标志不能为空'); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/FooterLinkType.php: -------------------------------------------------------------------------------- 1 | add('name', TextType::class, [ 25 | 'label' => '文本', 26 | 'required' => true 27 | ]); 28 | 29 | $builder->add('link', TextType::class, [ 30 | 'label' => '链接', 31 | 'required' => true, 32 | ]); 33 | 34 | $builder->add('priority', IntegerType::class, [ 35 | 'label' => '权重', 36 | 'required' => true, 37 | ]); 38 | 39 | $builder->add('isPjax', CheckboxType::class, [ 40 | 'label' => '是否站内', 41 | 'required' => false, 42 | ]); 43 | } 44 | 45 | public function configureOptions(OptionsResolver $resolver) 46 | { 47 | $resolver->setDefaults([ 48 | 'data_class' => FooterLink::class 49 | ]); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/modals/add-cname-modal.html.twig: -------------------------------------------------------------------------------- 1 | {% form_theme form with [ 2 | 'form/vertical-field-1.html.twig', 3 | 'form/vertical-checkbox-type.html.twig' 4 | ] %} 5 | 6 | 31 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Form/Type/DatetimeType.php: -------------------------------------------------------------------------------- 1 | setDefaults([ 32 | 'field_type' => 'datetime', 33 | ]); 34 | } 35 | 36 | public function buildForm(FormBuilderInterface $builder, array $options) 37 | { 38 | $builder->addViewTransformer(new DatetimeToStringTransfer()); 39 | } 40 | 41 | public function buildView(FormView $view, FormInterface $form, array $options) 42 | { 43 | parent::buildView($view, $form, $options); // TODO: Change the autogenerated stub 44 | $view->vars += $options; 45 | } 46 | 47 | 48 | public function getParent() 49 | { 50 | return TextType::class; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/QueryBuilder/PostQueryBuilder.php: -------------------------------------------------------------------------------- 1 | queryBuilder->andWhere('p.title LIKE :title'); 22 | $this->queryBuilder->setParameter('title', "%{$params['title']}%"); 23 | } 24 | 25 | if (!empty($params['author'])) { 26 | $this->queryBuilder->leftJoin('p.author', 'u') 27 | ->andWhere('u.nickname LIKE :author') 28 | ->setParameter('author', "%{$params['author']}%"); 29 | } 30 | 31 | if (!empty($params['createdAt'][0])) { 32 | $this->queryBuilder 33 | ->andWhere('p.createdAt >= :createdAt0 and p.createdAt <= :createdAt1') 34 | ->setParameter('createdAt0', $params['createdAt'][0]) 35 | ->setParameter('createdAt1', $params['createdAt'][1]); 36 | } 37 | 38 | if (!empty($params['tabName'])) { 39 | $this->queryBuilder->leftJoin('p.tab', 't') 40 | ->andWhere('t.name LIKE :tab') 41 | ->setParameter('tab', "%{$params['tabName']}%"); 42 | } 43 | 44 | return $this->queryBuilder; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartRenderCategoryListEvent.php: -------------------------------------------------------------------------------- 1 | router = $router; 31 | $this->globalValue = $globalValue; 32 | $this->translator = $translator; 33 | } 34 | 35 | public function execute() 36 | { 37 | $ids = $result = []; 38 | 39 | foreach ($this->list as $category) { 40 | $ids[] = $category->getId(); 41 | 42 | $result[] = [ 43 | $category->getId(), 44 | $category->getName(), 45 | $category->getSlug(), 46 | $this->translator->trans($category->getStatus() ? '启用' : '不启用') 47 | ]; 48 | } 49 | 50 | return [ 51 | 'columns' => ['ID', '名称', '别名', '状态'], 52 | 'list' => $result, 53 | 'ids' => $ids 54 | ]; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/CrudEvent/StartRenderTagListEvent.php: -------------------------------------------------------------------------------- 1 | router = $router; 31 | $this->globalValue = $globalValue; 32 | $this->translator = $translator; 33 | } 34 | 35 | public function execute() 36 | { 37 | $ids = $result = []; 38 | 39 | foreach ($this->list as $tag) { 40 | $ids[] = $tag->getId(); 41 | 42 | $result[] = [ 43 | $tag->getId(), 44 | $tag->getName(), 45 | $tag->getSlug(), 46 | $this->globalValue->ago($tag->getCreatedAt()), 47 | $this->translator->trans($tag->getStatus() ? '启用' : '不启用') 48 | ]; 49 | } 50 | 51 | return [ 52 | 'columns' => ['ID', '名称', '别名', '创建时间', '状态'], 53 | 'list' => $result, 54 | 'ids' => $ids 55 | ]; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Controller/UploadController.php: -------------------------------------------------------------------------------- 1 | get('name', 'file'); 36 | 37 | $file = $request->files->get($name); 38 | 39 | $extension = $file->guessExtension(); 40 | $fileName = 'upload/images/' . time() . mt_rand(1000, 9999) . '.' . $extension; 41 | 42 | $targetPath = $this->getParameter('kernel.project_dir') . '/web/' . $fileName; 43 | 44 | $fs = new Filesystem(); 45 | $fs->copy($file->getRealPath(), $targetPath); 46 | 47 | return new JsonResponse([ 48 | 'errno' => '0', 49 | 'data' => [ 50 | $this->getParameter('assets_base_url') . '/' . $fileName 51 | ] 52 | ]); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Controller/StatusController.php: -------------------------------------------------------------------------------- 1 | getDoctrine()->getRepository('YesknMainBundle:Translation') 26 | ->findOneBy(['messageId' => 'site_name']); 27 | 28 | return new ApiOk([ 29 | 'site_name' => $one->getChinese() 30 | ]); 31 | } 32 | 33 | /** 34 | * @Route("/status/close-alert", name="status_close_alert") 35 | */ 36 | public function closeAnnounceAlert() 37 | { 38 | $response = new ApiOk(); 39 | 40 | $announce = $this->getDoctrine()->getRepository('YesknMainBundle:Announce') 41 | ->findOneBy(['show' => 1], ['id' => 'DESC']); 42 | 43 | $response->headers->setCookie(new Cookie('_announce', $announce->getId())); 44 | 45 | return $response; 46 | } 47 | 48 | /** 49 | * @Route("/am-i-logged-in") 50 | * @Security("has_role('ROLE_USER')") 51 | * 52 | */ 53 | public function amILoggedInAction() 54 | { 55 | return new ApiOk(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/Form/SearchForm/SearchPostType.php: -------------------------------------------------------------------------------- 1 | add('title', SearchType::class, [ 24 | 'label' => '标题', 25 | 'required' => false 26 | ]); 27 | $builder->add('author', SearchType::class, [ 28 | 'label' => '作者', 29 | 'required' => false 30 | ]); 31 | $builder->add('createdAt', DatetimeRangeType::class, [ 32 | 'label' => '发布时间', 33 | 'field_type' => 'date', 34 | 'date_range' => true, 35 | 'required' => false, 36 | ]); 37 | $builder->add('status', ChoiceType::class, [ 38 | 'label' => '状态', 39 | 'required' => false, 40 | 'choices' => [ 41 | '所有' => '', 42 | '已发布' => 'published', 43 | '草稿' => 'draft' 44 | ] 45 | ]); 46 | $builder->add('tabName', SearchType::class, [ 47 | 'label' => '板块', 48 | 'required' => false 49 | ]); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/Yeskn/AdminBundle/QueryBuilder/CommentQueryBuilder.php: -------------------------------------------------------------------------------- 1 | queryBuilder->andWhere('p.content LIKE :content'); 22 | $this->queryBuilder->setParameter('content', "%{$params['content']}%"); 23 | } 24 | 25 | if (!empty($params['createdBy'])) { 26 | $this->queryBuilder->leftJoin('p.user', 'u'); 27 | $this->queryBuilder->andWhere('u.nickname LIKE :nickname'); 28 | $this->queryBuilder->setParameter('nickname', "%{$params['createdBy']}%"); 29 | } 30 | 31 | if (!empty($params['title'])) { 32 | $this->queryBuilder->leftJoin('p.post', 'po'); 33 | $this->queryBuilder->andWhere('po.title LIKE :title'); 34 | $this->queryBuilder->setParameter('title', "%{$params['title']}%"); 35 | } 36 | 37 | if (!empty($params['createdAt'])) { 38 | $this->queryBuilder 39 | ->andWhere('p.createdAt >= :createdAt0 and p.createdAt <= :createdAt1') 40 | ->setParameter('createdAt0', $params['createdAt'][0]) 41 | ->setParameter('createdAt1', $params['createdAt'][1]); 42 | } 43 | 44 | return $this->queryBuilder; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /web/assets/css/admin.css: -------------------------------------------------------------------------------- 1 | a, .pagination>li>a, .pagination>li>span { 2 | color: #737373; 3 | } 4 | .pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover { 5 | background: #5bc0de; 6 | border-color: #46b8da; 7 | } 8 | 9 | h3.page-header{ 10 | margin-top: 15px; 11 | } 12 | .hot-tags{ 13 | padding-top: 10px; 14 | } 15 | .hot-tags a{ 16 | padding: 4px 4px; 17 | display: inline-block; 18 | background: #dd4b39; 19 | color: #fff; 20 | border-radius: 4px; 21 | border: 1px solid #eee; 22 | } 23 | .hot-tags a:hover{ 24 | cursor: pointer; 25 | text-decoration: none; 26 | color:#dd4b39; 27 | background: #fff; 28 | } 29 | .x-small-font { 30 | font-size: 12px; 31 | } 32 | .small-font { 33 | font-size: 14px; 34 | } 35 | 36 | h3.page-header { 37 | margin-top: 20px; 38 | padding-bottom: 20px; 39 | } 40 | table.table { 41 | table-layout: fixed; 42 | } 43 | table.table td{ 44 | vertical-align: middle !important; 45 | overflow-x: hidden; 46 | } 47 | 48 | @media (min-width: 768px) { 49 | .navbar-header { 50 | width: 250px; 51 | text-align: center; 52 | } 53 | .navbar-brand { 54 | line-height: 50px; 55 | float: none; 56 | } 57 | } 58 | 59 | .search-form label{ 60 | padding-top: 7px; 61 | } 62 | 63 | .search-form .pagination-container { 64 | float: right; 65 | } 66 | 67 | .search-form .pagination-container ul { 68 | margin: 0 !important; 69 | } 70 | input[type="search"]::-webkit-search-cancel-button { 71 | -webkit-appearance: searchfield-cancel-button; 72 | } 73 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/contribute.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@YesknMain/base.html.twig' %} 2 | 3 | {% block page_wraper %} 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |

谢谢你让我把Vmoex做的更好!

12 |
13 |
14 |
15 |
16 |
17 | 18 |
19 |
20 | 21 |
22 | 23 |
24 |
25 |
26 |
27 |
28 |

赞助记录

29 | 30 | 31 |
32 |
33 |
34 |
35 |
36 |
37 | 38 | {% endblock %} 39 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/EventListener/AjaxAuthenticationListener.php: -------------------------------------------------------------------------------- 1 | translator = $translator; 19 | } 20 | 21 | /** 22 | * Handles security related exceptions. 23 | * 24 | * @param GetResponseForExceptionEvent $event An GetResponseForExceptionEvent instance 25 | */ 26 | public function onCoreException(GetResponseForExceptionEvent $event) 27 | { 28 | $exception = $event->getException(); 29 | $request = $event->getRequest(); 30 | 31 | if ($request->isXmlHttpRequest()) { 32 | if ($exception instanceof AuthenticationException 33 | || $exception instanceof AccessDeniedException 34 | || $exception instanceof AuthenticationCredentialsNotFoundException 35 | ) { 36 | $response = new ApiFail($this->translator->trans('please_login')); 37 | $response->setStatusCode(200); 38 | 39 | $event->allowCustomResponseCode(); 40 | $event->setResponse($response); 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/Yeskn/MainBundle/Resources/views/sidebar/community-state.html.twig: -------------------------------------------------------------------------------- 1 | {% set site = siteState() %} 2 | 3 | 36 | --------------------------------------------------------------------------------