├── 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 |
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 |
13 | {{ message|raw }}
14 |
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 |
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 |
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 |
13 | {% endfilter %}
14 | {% endblock form_row %}
15 |
--------------------------------------------------------------------------------
/src/Yeskn/MainBundle/Resources/views/user/notices/comment-post.html.twig:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 | {{ notice.content.content|raw }}
9 |
10 |
--------------------------------------------------------------------------------
/src/Yeskn/MainBundle/Resources/views/user/notices/mention-comment.html.twig:
--------------------------------------------------------------------------------
1 |
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 |
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 |
6 | {{ label }}
7 |
8 | {% for attrname, attrvalue in attr %}
9 | {% if attrname == 'help' %}
10 | {{ attrvalue }}
11 | {% endif %}
12 | {% endfor %}
13 |
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 |
3 |
4 |
8 |
9 | {{ message }}
10 |
11 |
14 |
15 |
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 |
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 |
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 |
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 |
2 |
3 |
4 |
8 |
9 | {{ message }}
10 |
11 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/Yeskn/MainBundle/Resources/views/sidebar/topic-author.html.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ '关于作者'|trans }}
4 |
5 |
7 |
8 |
9 |
16 |
17 |
18 |
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 |
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 |
19 |
--------------------------------------------------------------------------------
/src/Yeskn/AdminBundle/Resources/views/manage/general.html.twig:
--------------------------------------------------------------------------------
1 | {% extends '@YesknAdmin/base.html.twig' %}
2 |
3 | {% block page_wraper %}
4 |
9 |
10 | {% if form.vars.message is defined %}
11 | {% set message = form.vars.message %}
12 | {{ message.content }}
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 |
11 |
12 |
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 |
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 |
7 |
8 | {{ 'register'|trans }}{{ 'site_name'|trans }}
9 |
10 |
11 |
12 |
13 |
14 | {% include 'flash_messages.html.twig' %}
15 |
16 | {{ form_start(form) }}
17 | {{ form_widget(form) }}
18 | {{ form_end(form) }}
19 |
20 |
21 |
22 |
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 |
2 |
3 | {{ 'today.hot.topics'|trans }}
4 |
5 |
6 |
7 | {% for post in hotPosts() %}
8 |
9 |
10 |
11 |
12 |
13 |
16 |
{{ post.comments.count }}
17 |
18 |
19 | {% endfor %}
20 |
21 |
22 |
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 |
4 |
5 |
6 | {{ form_start(form, {attr: {class: 'form-horizontal', id: 'messageForm', action: path('send_message')}}) }}
7 |
8 |
12 |
13 | {{ form_widget(form) }}
14 |
15 |
19 | {{ form_end(form) }}
20 |
21 |
22 |
--------------------------------------------------------------------------------
/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 |
4 |
5 |
6 | {{ form_start(form, {attr: {class: 'form-horizontal', id: 'addTranslateForm', action: path('admin_translation_add')}}) }}
7 |
11 |
12 | {{ form_widget(form) }}
13 |
14 |
18 | {{ form_end(form) }}
19 |
20 |
21 |
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 |
7 |
8 |
9 | {{ form_start(form, {attr: {class: 'form-horizontal', id: 'addCnameForm', action: path('homepage')}}) }}
10 |
11 |
15 |
16 |
17 |
18 | 请确认您的域名已经通过cname解析到
,否则您的博客将无法正常打开;如果您不是很确定,请参考
此文章
19 |
20 |
21 | {{ form_widget(form) }}
22 |
23 |
27 | {{ form_end(form) }}
28 |
29 |
30 |
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 |
4 |
5 | {{ 'site_state'|trans }}
6 |
7 |
35 |
36 |
--------------------------------------------------------------------------------