├── .gitignore ├── .idea ├── fisher.iml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── modules.xml └── workspace.xml ├── Pipfile ├── Pipfile.lock ├── __pycache__ └── fisher.cpython-36.pyc ├── app ├── __init__.py ├── __pycache__ │ └── __init__.cpython-36.pyc ├── forms │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ └── book.cpython-36.pyc │ ├── auth.py │ └── book.py ├── libs │ ├── __init__.py │ ├── email.py │ ├── enums.py │ ├── helper.py │ └── httper.py ├── models │ ├── __init__.py │ ├── base.py │ ├── book.py │ ├── drift.py │ ├── gift.py │ ├── user.py │ └── wish.py ├── secure.py ├── settings.py ├── spider │ ├── __init__.py │ └── yushu_book.py ├── static │ ├── 3rd │ │ ├── application.js │ │ ├── bootstrap.min.js │ │ ├── flat-ui.min.js │ │ ├── jquery-3.2.1.min.js │ │ ├── jquery.twbsPagination.min.js │ │ ├── remodal.min.js │ │ ├── ui │ │ │ ├── bootflat.css │ │ │ ├── bootstrap.min.1.css │ │ │ ├── bootstrap.min.css │ │ │ ├── flat-ui-ok.css │ │ │ ├── flat-ui.css │ │ │ ├── flat-ui.min.css │ │ │ ├── remodal-default-theme.css │ │ │ ├── remodal.css │ │ │ └── site.min.css │ │ └── validator.min.js │ ├── css │ │ ├── base.css │ │ ├── book-detail.css │ │ ├── drift.css │ │ ├── index.css │ │ ├── login.css │ │ ├── normal.css │ │ ├── not-enough.css │ │ ├── pending.css │ │ ├── personal.css │ │ ├── register.css │ │ └── search-result.css │ ├── images │ │ ├── fish.png │ │ ├── fish1@subnav.png │ │ ├── fish2@subnav.png │ │ ├── fish3.png │ │ ├── fish@subnav.png │ │ ├── flow.png │ │ ├── gift.png │ │ ├── gift@subnav.png │ │ ├── gift@subnav1.png │ │ ├── gift@subnav111.png │ │ ├── icon.png │ │ ├── logo-yushu.png │ │ ├── upload.png │ │ ├── upload111@subnav.png │ │ ├── upload@subnav.png │ │ ├── upload@subnav111.png │ │ ├── wish.png │ │ ├── wish1111@subnav.png │ │ ├── wish1@subnav.png │ │ └── wish@subnav.png │ ├── js │ │ ├── base.js │ │ ├── book-detail.js │ │ ├── drift.js │ │ ├── gifts.js │ │ ├── http.js │ │ ├── register.js │ │ ├── register.model.js │ │ ├── search_result.js │ │ └── util.js │ ├── less │ │ ├── base.less │ │ ├── book-detail.less │ │ ├── drift.less │ │ ├── gifts.less │ │ ├── index.less │ │ ├── login.less │ │ ├── normal.less │ │ ├── not_enough.less │ │ ├── pending.less │ │ ├── personal.less │ │ └── search-result.less │ └── temp │ │ ├── bootflat │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.markdown │ │ ├── _config.yml │ │ ├── angularicons │ │ │ ├── angularicons.eot │ │ │ ├── angularicons.svg │ │ │ ├── angularicons.ttf │ │ │ └── angularicons.woff │ │ ├── bootflat │ │ │ ├── css │ │ │ │ ├── bootflat.css │ │ │ │ ├── bootflat.css.map │ │ │ │ └── bootflat.min.css │ │ │ ├── img │ │ │ │ └── check_flat │ │ │ │ │ ├── default.png │ │ │ │ │ └── default.psd │ │ │ ├── js │ │ │ │ ├── icheck.min.js │ │ │ │ ├── jquery.fs.selecter.min.js │ │ │ │ └── jquery.fs.stepper.min.js │ │ │ └── scss │ │ │ │ ├── .csscomb.json │ │ │ │ ├── .csslintrc │ │ │ │ ├── bootflat.scss │ │ │ │ └── bootflat │ │ │ │ ├── _accordion.scss │ │ │ │ ├── _alert.scss │ │ │ │ ├── _breadcrumb.scss │ │ │ │ ├── _button.scss │ │ │ │ ├── _button_group.scss │ │ │ │ ├── _calendar.scss │ │ │ │ ├── _checkbox_radio.scss │ │ │ │ ├── _dropdown.scss │ │ │ │ ├── _footer.scss │ │ │ │ ├── _form.scss │ │ │ │ ├── _global.scss │ │ │ │ ├── _jumbotron.scss │ │ │ │ ├── _label_badge.scss │ │ │ │ ├── _list.scss │ │ │ │ ├── _media_list.scss │ │ │ │ ├── _modal.scss │ │ │ │ ├── _navbar.scss │ │ │ │ ├── _pager.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _panel.scss │ │ │ │ ├── _pill.scss │ │ │ │ ├── _popover.scss │ │ │ │ ├── _pricing.scss │ │ │ │ ├── _progress.scss │ │ │ │ ├── _selecter.scss │ │ │ │ ├── _stepper.scss │ │ │ │ ├── _tab.scss │ │ │ │ ├── _thumbnail.scss │ │ │ │ ├── _timeline.scss │ │ │ │ ├── _toggle.scss │ │ │ │ ├── _tooltip.scss │ │ │ │ ├── _typography.scss │ │ │ │ └── _well.scss │ │ ├── bower.json │ │ ├── color-picker-blue.html │ │ ├── color-picker-gray.html │ │ ├── color-picker-green.html │ │ ├── color-picker-pink.html │ │ ├── color-picker-purple.html │ │ ├── color-picker-red.html │ │ ├── color-picker-yellow.html │ │ ├── color-picker.html │ │ ├── composer.json │ │ ├── css │ │ │ ├── bootstrap.min.css │ │ │ ├── site.css │ │ │ └── site.min.css │ │ ├── documentation.html │ │ ├── favicon_16.ico │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ ├── free-psd.html │ │ ├── getting-started.html │ │ ├── google45b338b882fada75.html │ │ ├── img │ │ │ ├── Jumbotron.jpg │ │ │ ├── ascii-logo.gif │ │ │ ├── bootflat-ui-kit.jpg │ │ │ ├── design.png │ │ │ ├── divider.png │ │ │ ├── fast.png │ │ │ ├── feature-bootstrap.png │ │ │ ├── feature-css.png │ │ │ ├── feature-lightweight.png │ │ │ ├── feature-mobile.png │ │ │ ├── footer-logo.png │ │ │ ├── github.png │ │ │ ├── index.png │ │ │ ├── logo-index.png │ │ │ ├── logo.png │ │ │ ├── photo-1.jpg │ │ │ ├── photo-2.jpg │ │ │ ├── photo-3.jpg │ │ │ ├── photo-4.jpg │ │ │ ├── prototyping.png │ │ │ ├── share.gif │ │ │ ├── slider1.jpg │ │ │ ├── slider2.jpg │ │ │ ├── slider3.jpg │ │ │ ├── thumbnail-1.jpg │ │ │ ├── thumbnail-2.jpg │ │ │ ├── thumbnail-3.jpg │ │ │ ├── thumbnail-4.jpg │ │ │ ├── together.png │ │ │ └── wild_flowers.png │ │ ├── index.html │ │ ├── js │ │ │ ├── application.js │ │ │ ├── bootstrap.min.js │ │ │ ├── html5shiv.js │ │ │ ├── jquery-1.10.1.min.js │ │ │ ├── respond.min.js │ │ │ ├── site.min.js │ │ │ └── site.min.map │ │ ├── package.json │ │ └── sitemap.xml │ │ ├── flat │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bower.json │ │ ├── css │ │ │ ├── flat-ui.css │ │ │ ├── mixins.css │ │ │ ├── spaces.css │ │ │ └── variables.css │ │ ├── docs │ │ │ ├── assets │ │ │ │ ├── css │ │ │ │ │ ├── css │ │ │ │ │ │ ├── demo.css │ │ │ │ │ │ ├── docs.css │ │ │ │ │ │ └── prettyprint.css │ │ │ │ │ ├── demo.css │ │ │ │ │ ├── demo.css.map │ │ │ │ │ ├── docs.css │ │ │ │ │ ├── docs.css.map │ │ │ │ │ └── src │ │ │ │ │ │ ├── demo.less │ │ │ │ │ │ ├── docs.less │ │ │ │ │ │ └── prettyprint.less │ │ │ │ ├── img │ │ │ │ │ ├── demo │ │ │ │ │ │ ├── browser-2x.png │ │ │ │ │ │ ├── browser-author.jpg │ │ │ │ │ │ ├── browser-pic-1.jpg │ │ │ │ │ │ ├── browser-pic-2.jpg │ │ │ │ │ │ ├── browser-pic-3.jpg │ │ │ │ │ │ ├── browser-pic-4.jpg │ │ │ │ │ │ ├── browser-pic-5.jpg │ │ │ │ │ │ ├── browser-pic-6.jpg │ │ │ │ │ │ ├── browser.png │ │ │ │ │ │ ├── html-icon.png │ │ │ │ │ │ ├── logo-mask-2x.png │ │ │ │ │ │ ├── logo-mask.png │ │ │ │ │ │ └── video.jpg │ │ │ │ │ ├── example-image.jpg │ │ │ │ │ ├── footer │ │ │ │ │ │ └── logo.png │ │ │ │ │ ├── getting-started │ │ │ │ │ │ └── icomoon_import.jpg │ │ │ │ │ └── video │ │ │ │ │ │ └── poster.jpg │ │ │ │ └── js │ │ │ │ │ ├── application.js │ │ │ │ │ └── prettify.js │ │ │ ├── components.html │ │ │ ├── examples │ │ │ │ ├── buttons.html │ │ │ │ ├── dropdowns.html │ │ │ │ ├── forms.html │ │ │ │ ├── navbar-fixed-top.html │ │ │ │ ├── navbar-static-top.html │ │ │ │ ├── navbars-with-elements.html │ │ │ │ ├── navbars.html │ │ │ │ ├── pagination.html │ │ │ │ ├── radiocheck.html │ │ │ │ ├── select.html │ │ │ │ ├── switches.html │ │ │ │ ├── tagsinput.html │ │ │ │ ├── thumbnails.html │ │ │ │ ├── tiles.html │ │ │ │ ├── todo-list.html │ │ │ │ ├── tooltips.html │ │ │ │ ├── typography.html │ │ │ │ └── vertical-slider.html │ │ │ ├── getting-started.html │ │ │ └── template.html │ │ ├── fonts │ │ │ ├── glyphicons │ │ │ │ ├── flat-ui-icons-regular.eot │ │ │ │ ├── flat-ui-icons-regular.svg │ │ │ │ ├── flat-ui-icons-regular.ttf │ │ │ │ ├── flat-ui-icons-regular.woff │ │ │ │ └── selection.json │ │ │ └── lato │ │ │ │ ├── lato-black.eot │ │ │ │ ├── lato-black.svg │ │ │ │ ├── lato-black.ttf │ │ │ │ ├── lato-black.woff │ │ │ │ ├── lato-bold.eot │ │ │ │ ├── lato-bold.svg │ │ │ │ ├── lato-bold.ttf │ │ │ │ ├── lato-bold.woff │ │ │ │ ├── lato-bolditalic.eot │ │ │ │ ├── lato-bolditalic.svg │ │ │ │ ├── lato-bolditalic.ttf │ │ │ │ ├── lato-bolditalic.woff │ │ │ │ ├── lato-italic.eot │ │ │ │ ├── lato-italic.svg │ │ │ │ ├── lato-italic.ttf │ │ │ │ ├── lato-italic.woff │ │ │ │ ├── lato-light.eot │ │ │ │ ├── lato-light.svg │ │ │ │ ├── lato-light.ttf │ │ │ │ ├── lato-light.woff │ │ │ │ ├── lato-regular.eot │ │ │ │ ├── lato-regular.svg │ │ │ │ ├── lato-regular.ttf │ │ │ │ └── lato-regular.woff │ │ ├── img │ │ │ ├── favicon.ico │ │ │ ├── icons │ │ │ │ ├── png │ │ │ │ │ ├── Book.png │ │ │ │ │ ├── Calendar.png │ │ │ │ │ ├── Chat.png │ │ │ │ │ ├── Clipboard.png │ │ │ │ │ ├── Compas.png │ │ │ │ │ ├── Gift-Box.png │ │ │ │ │ ├── Infinity-Loop.png │ │ │ │ │ ├── Mail.png │ │ │ │ │ ├── Map.png │ │ │ │ │ ├── Pensils.png │ │ │ │ │ ├── Pocket.png │ │ │ │ │ ├── Retina-Ready.png │ │ │ │ │ ├── Toilet-Paper.png │ │ │ │ │ └── Watches.png │ │ │ │ └── svg │ │ │ │ │ ├── book.svg │ │ │ │ │ ├── calendar.svg │ │ │ │ │ ├── chat.svg │ │ │ │ │ ├── clipboard.svg │ │ │ │ │ ├── clocks.svg │ │ │ │ │ ├── compas.svg │ │ │ │ │ ├── gift-box.svg │ │ │ │ │ ├── loop.svg │ │ │ │ │ ├── mail.svg │ │ │ │ │ ├── map.svg │ │ │ │ │ ├── paper-bag.svg │ │ │ │ │ ├── pencils.svg │ │ │ │ │ ├── retina.svg │ │ │ │ │ ├── ribbon.svg │ │ │ │ │ └── toilet-paper.svg │ │ │ ├── login │ │ │ │ ├── icon.png │ │ │ │ ├── imac-2x.png │ │ │ │ └── imac.png │ │ │ └── tile │ │ │ │ ├── ribbon-2x.png │ │ │ │ └── ribbon.png │ │ ├── index.html │ │ ├── index.js │ │ ├── js │ │ │ ├── .jscs.json │ │ │ ├── .jshintrc │ │ │ └── radiocheck.js │ │ ├── less │ │ │ ├── .csscomb.json │ │ │ ├── .csslintrc │ │ │ ├── css │ │ │ │ ├── background-clip.css │ │ │ │ ├── background-variant.css │ │ │ │ ├── border-radius.css │ │ │ │ ├── buttons.css │ │ │ │ ├── center-block.css │ │ │ │ ├── clearfix.css │ │ │ │ ├── forms.css │ │ │ │ ├── gradients.css │ │ │ │ ├── grid.css │ │ │ │ ├── hide-text.css │ │ │ │ ├── image.css │ │ │ │ ├── nav-divider.css │ │ │ │ ├── navbar-vertical-align.css │ │ │ │ ├── opacity.css │ │ │ │ ├── pagination.css │ │ │ │ ├── pallets.css │ │ │ │ ├── print.css │ │ │ │ ├── reset-filter.css │ │ │ │ ├── resize.css │ │ │ │ ├── responsive-visibility.css │ │ │ │ ├── select.css │ │ │ │ ├── size.css │ │ │ │ ├── switches.css │ │ │ │ ├── tab-focus.css │ │ │ │ ├── text-emphasis.css │ │ │ │ ├── text-overflow.css │ │ │ │ └── vendor-prefixes.css │ │ │ ├── flat-ui.less │ │ │ ├── mixins.less │ │ │ ├── mixins │ │ │ │ ├── background-clip.less │ │ │ │ ├── background-variant.less │ │ │ │ ├── border-radius.less │ │ │ │ ├── buttons.less │ │ │ │ ├── center-block.less │ │ │ │ ├── clearfix.less │ │ │ │ ├── forms.less │ │ │ │ ├── gradients.less │ │ │ │ ├── grid.less │ │ │ │ ├── hide-text.less │ │ │ │ ├── image.less │ │ │ │ ├── nav-divider.less │ │ │ │ ├── navbar-vertical-align.less │ │ │ │ ├── opacity.less │ │ │ │ ├── pagination.less │ │ │ │ ├── pallets.less │ │ │ │ ├── reset-filter.less │ │ │ │ ├── resize.less │ │ │ │ ├── responsive-visibility.less │ │ │ │ ├── select.less │ │ │ │ ├── size.less │ │ │ │ ├── switches.less │ │ │ │ ├── tab-focus.less │ │ │ │ ├── text-emphasis.less │ │ │ │ ├── text-overflow.less │ │ │ │ └── vendor-prefixes.less │ │ │ ├── modules │ │ │ │ ├── button-groups.less │ │ │ │ ├── buttons.less │ │ │ │ ├── code.less │ │ │ │ ├── dropdowns.less │ │ │ │ ├── footer.less │ │ │ │ ├── forms.less │ │ │ │ ├── glyphicons.less │ │ │ │ ├── input-groups.less │ │ │ │ ├── local-fonts.less │ │ │ │ ├── login.less │ │ │ │ ├── navbar.less │ │ │ │ ├── pager.less │ │ │ │ ├── pagination.less │ │ │ │ ├── palette.less │ │ │ │ ├── print.less │ │ │ │ ├── progress-bars.less │ │ │ │ ├── radiocheck.less │ │ │ │ ├── scaffolding.less │ │ │ │ ├── select.less │ │ │ │ ├── share.less │ │ │ │ ├── slider.less │ │ │ │ ├── switch.less │ │ │ │ ├── tagsinput.less │ │ │ │ ├── thumbnails.less │ │ │ │ ├── tiles.less │ │ │ │ ├── todo-list.less │ │ │ │ ├── tooltip.less │ │ │ │ ├── type.less │ │ │ │ ├── typeahead.less │ │ │ │ └── video.less │ │ │ ├── spaces.less │ │ │ └── variables.less │ │ └── package.json │ │ └── fonts │ │ ├── glyphicons │ │ ├── flat-ui-icons-regular.eot │ │ ├── flat-ui-icons-regular.svg │ │ ├── flat-ui-icons-regular.ttf │ │ ├── flat-ui-icons-regular.woff │ │ └── selection.json │ │ └── lato │ │ ├── lato-black.eot │ │ ├── lato-black.svg │ │ ├── lato-black.ttf │ │ ├── lato-black.woff │ │ ├── lato-bold.eot │ │ ├── lato-bold.svg │ │ ├── lato-bold.ttf │ │ ├── lato-bold.woff │ │ ├── lato-bolditalic.eot │ │ ├── lato-bolditalic.svg │ │ ├── lato-bolditalic.ttf │ │ ├── lato-bolditalic.woff │ │ ├── lato-italic.eot │ │ ├── lato-italic.svg │ │ ├── lato-italic.ttf │ │ ├── lato-italic.woff │ │ ├── lato-light.eot │ │ ├── lato-light.svg │ │ ├── lato-light.ttf │ │ ├── lato-light.woff │ │ ├── lato-regular.eot │ │ ├── lato-regular.svg │ │ ├── lato-regular.ttf │ │ └── lato-regular.woff ├── templates │ ├── 404.html │ ├── 500.html │ ├── auth │ │ ├── change_password.html │ │ ├── forget_password.html │ │ ├── forget_password_request.html │ │ ├── login.html │ │ └── register.html │ ├── base.html │ ├── book_detail.html │ ├── drift.html │ ├── email │ │ ├── get_gift.html │ │ ├── reset_password.html │ │ └── satisify_wish.html │ ├── email_has_send.html │ ├── gifts.html │ ├── index.html │ ├── my_gifts.html │ ├── my_wish.html │ ├── not_enough_beans.html │ ├── pending.html │ ├── personal.html │ └── search_result.html ├── test │ ├── __init__.py │ ├── test-with.py │ ├── test.py │ ├── test_callable.py │ └── test_contextmanager.py ├── view_models │ ├── __init__.py │ ├── book.py │ ├── drift.py │ ├── gift.py │ ├── trade.py │ └── wish.py └── web │ ├── __init__.py │ ├── __pycache__ │ ├── __init__.cpython-36.pyc │ └── book.cpython-36.pyc │ ├── auth.py │ ├── book.py │ ├── drift.py │ ├── gift.py │ ├── main.py │ └── wish.py └── fisher.py /.gitignore: -------------------------------------------------------------------------------- 1 | ### STS ### 2 | .apt_generated 3 | .classpath 4 | .factorypath 5 | .project 6 | .settings 7 | .springBeans 8 | 9 | ### IntelliJ IDEA ### 10 | .idea 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### NetBeans ### 16 | nbproject/private/ 17 | build/ 18 | nbbuild/ 19 | dist/ 20 | nbdist/ 21 | .nb-gradle/ 22 | -------------------------------------------------------------------------------- /.idea/fisher.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | 19 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | flask = "*" 8 | wtforms = "*" 9 | flask-sqlalchemy = "*" 10 | cymysql = "*" 11 | flask-login = "*" 12 | flask-mail = "*" 13 | 14 | [dev-packages] 15 | 16 | [requires] 17 | python_version = "3.6" 18 | -------------------------------------------------------------------------------- /__pycache__/fisher.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/__pycache__/fisher.cpython-36.pyc -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from app.models.base import db 3 | from flask_login import LoginManager 4 | from flask_mail import Mail 5 | 6 | __author__ = "gaowenfeng" 7 | 8 | login_manager = LoginManager() 9 | mail = Mail() 10 | 11 | 12 | def create_app(): 13 | app = Flask(__name__) 14 | app.config.from_object("app.secure") 15 | app.config.from_object("app.settings") 16 | # 注册蓝图 17 | register_blueprint(app) 18 | 19 | # 注册SQLAlchemy 20 | db.init_app(app) 21 | # 创建所有表 22 | with app.app_context(): 23 | db.create_all() 24 | 25 | # 注册LoginManager 26 | login_manager.init_app(app) 27 | login_manager.login_view = 'web.login' 28 | login_manager.login_message = '请先登录或注册' 29 | 30 | # 注册Mail 31 | mail.init_app(app) 32 | 33 | return app 34 | 35 | 36 | def register_blueprint(app): 37 | from app.web import web 38 | app.register_blueprint(web) 39 | -------------------------------------------------------------------------------- /app/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /app/forms/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | -------------------------------------------------------------------------------- /app/forms/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/forms/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /app/forms/__pycache__/book.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/forms/__pycache__/book.cpython-36.pyc -------------------------------------------------------------------------------- /app/forms/auth.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | from wtforms import StringField, PasswordField, Form 5 | from wtforms.validators import DataRequired, Length, ValidationError, EqualTo 6 | 7 | from app.models.user import User 8 | 9 | __author__ = "gaowenfeng" 10 | 11 | 12 | class EmailForm(Form): 13 | email = StringField(validators=[ 14 | DataRequired(), Length(8, 64, message='电子邮箱不符合规范')]) 15 | 16 | 17 | class RegisterForm(EmailForm): 18 | nickname = StringField('昵称', validators=[ 19 | DataRequired(), Length(2, 10, message='昵称至少需要两个字符,最多10个字符')]) 20 | 21 | password = PasswordField('密码', validators=[ 22 | DataRequired(), Length(6, 20)]) 23 | 24 | def validate_email(self, field): 25 | if User.query.filter_by(email=field.data).first(): 26 | raise ValidationError('电子邮件已被注册') 27 | 28 | def validate_nickname(self, field): 29 | if User.query.filter_by(nickname=field.data).first(): 30 | raise ValidationError('昵称已存在') 31 | 32 | 33 | class LoginForm(EmailForm): 34 | password = PasswordField('密码', validators=[ 35 | DataRequired(), Length(6, 20)]) 36 | 37 | 38 | class ResetPasswordForm(Form): 39 | password1 = PasswordField('新密码', validators=[ 40 | DataRequired(), Length(6, 20, message='密码长度至少需要在6到20个字符之间'), 41 | EqualTo('password2', message='两次输入的密码不相同')]) 42 | password2 = PasswordField('确认新密码', validators=[ 43 | DataRequired(), Length(6, 20)]) 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/forms/book.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | from wtforms import Form, StringField, IntegerField 6 | from wtforms.validators import Length, NumberRange, DataRequired, Regexp 7 | 8 | __author__ = "gaowenfeng" 9 | 10 | 11 | class SearchForm(Form): 12 | q = StringField(validators=[DataRequired(), Length(min=1, max=30, message="查询关键字长度必须在1-30之间")], ) 13 | page = IntegerField(validators=[NumberRange(min=1, max=99)], default=1) 14 | 15 | 16 | class DriftForm(Form): 17 | recipient_name = StringField( 18 | '收件人姓名', validators=[DataRequired(), Length(min=2, max=20, 19 | message='收件人姓名长度必须在2到20个字符之间')]) 20 | mobile = StringField('手机号', validators=[DataRequired(), 21 | Regexp('^1[0-9]{10}$', 0, '请输入正确的手机号')]) 22 | message = StringField('留言') 23 | address = StringField( 24 | '邮寄地址', validators=[DataRequired(), 25 | Length(min=10, max=70, message='地址还不到10个字吗?尽量写详细一些吧')]) 26 | -------------------------------------------------------------------------------- /app/libs/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | -------------------------------------------------------------------------------- /app/libs/email.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | from threading import Thread 5 | 6 | from app import mail 7 | from flask_mail import Message 8 | from flask import current_app, render_template 9 | 10 | __author__ = "gaowenfeng" 11 | 12 | 13 | def send_mail_async(app, msg): 14 | with app.app_context(): 15 | try: 16 | mail.send(msg) 17 | except: 18 | print('邮件发送失败') 19 | 20 | 21 | def send_mail(to, subject, template, **kwargs): 22 | msg = Message( 23 | '[鱼书]'+' '+subject, 24 | sender=current_app.config['MAIL_USERNAME'], 25 | recipients=[to]) 26 | msg.html = render_template(template, **kwargs) 27 | app = current_app._get_current_object() 28 | thr = Thread(target=send_mail_async, args=[app,msg]) 29 | thr.start() 30 | -------------------------------------------------------------------------------- /app/libs/enums.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | from enum import Enum 5 | 6 | __author__ = "gaowenfeng" 7 | 8 | 9 | class PendingStatus(Enum): 10 | Waiting = 1 11 | Success = 2 12 | Reject = 3 13 | Redraw = 4 14 | 15 | @classmethod 16 | def pending_str(cls, status, key): 17 | key_map = { 18 | cls.Waiting: { 19 | 'requester': '等待对方邮寄', 20 | 'gifter': '等待你邮寄' 21 | }, 22 | cls.Reject: { 23 | 'requester': '对方已拒绝', 24 | 'gifter': '你已拒绝' 25 | }, 26 | cls.Redraw: { 27 | 'requester': '你已撤销', 28 | 'gifter': '对方已撤销' 29 | }, 30 | cls.Success: { 31 | 'requester': '对方已邮寄', 32 | 'gifter': '你已邮寄,交易完成' 33 | } 34 | } 35 | return key_map[status][key] 36 | -------------------------------------------------------------------------------- /app/libs/helper.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 2018/6/1 3 | """ 4 | __author__ = "gaowenfeng" 5 | 6 | 7 | def is_isbn_or_key(word): 8 | """ 9 | 判断word是isbn号还是查询关键字key 10 | isbn isbn13 由13个0-9在数字组成 11 | isbn10 由10表0-9表数字组组成,中间可能包含' - ' 12 | :param word: 13 | :return: key or isbn 14 | """ 15 | isbn_or_key = 'key' 16 | if len(word) == 13 and word.isdigit(): 17 | isbn_or_key = 'isbn' 18 | short_word = word.replace('-', '') 19 | if '-' in word and len(short_word) == 10 and short_word.isdigit(): 20 | isbn_or_key = 'isbn' 21 | return isbn_or_key 22 | -------------------------------------------------------------------------------- /app/libs/httper.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 2018/6/1 3 | """ 4 | import requests 5 | __author__ = "gaowenfeng" 6 | 7 | 8 | class HTTP: 9 | @staticmethod 10 | def get(url, return_json=True): 11 | """ 12 | 发送get请求 13 | :param url: 请求路径 14 | :param return_json: 是否返回json格式的结果 15 | :return: 16 | """ 17 | # r 是对这次HTTP请求调用结果的一个封装,并不是我们直接想要的结果,而是想要返回的内容 18 | r = requests.get(url) 19 | if r.status_code != 200: 20 | return {} if return_json else '' 21 | return r.json() if return_json else r.text 22 | -------------------------------------------------------------------------------- /app/models/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | from .base import * 6 | 7 | __author__ = "gaowenfeng" 8 | -------------------------------------------------------------------------------- /app/models/base.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | from flask_sqlalchemy import SQLAlchemy as _SQLAlcmemy, BaseQuery 6 | from sqlalchemy import SmallInteger, Column, Integer 7 | from contextlib import contextmanager 8 | from datetime import datetime 9 | 10 | __author__ = "gaowenfeng" 11 | 12 | 13 | class SQLAlchemy(_SQLAlcmemy): 14 | @contextmanager 15 | def auto_commit(self): 16 | try: 17 | yield 18 | self.session.commit() 19 | except Exception as e: 20 | self.session.rollback() 21 | raise e 22 | 23 | 24 | class Query(BaseQuery): 25 | 26 | def filter_by(self, **kwargs): 27 | if 'status' not in kwargs: 28 | kwargs['status'] = 1 29 | return super(Query, self).filter_by(**kwargs) 30 | 31 | 32 | db = SQLAlchemy(query_class=Query) 33 | 34 | 35 | class Base(db.Model): 36 | __abstract__ = True 37 | create_time = Column(Integer) 38 | status = Column(SmallInteger, default=1) 39 | 40 | def __init__(self): 41 | self.create_time = int(datetime.now().timestamp()) 42 | 43 | def set_attrs(self, attrs_dict): 44 | for key, value in attrs_dict.items(): 45 | if hasattr(self, key) and key != 'id': 46 | setattr(self, key, value) 47 | 48 | def delete(self): 49 | self.status = 0 50 | 51 | @property 52 | def create_datetime(self): 53 | if self.create_time: 54 | return datetime.fromtimestamp(self.create_time) 55 | else: 56 | return None 57 | -------------------------------------------------------------------------------- /app/models/book.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | from sqlalchemy import Column, Integer, String 6 | 7 | from app.models.base import Base 8 | 9 | __author__ = "gaowenfeng" 10 | 11 | 12 | class Book(Base): 13 | id = Column(Integer, primary_key=True, autoincrement=True) 14 | title = Column(String(50), nullable=True) 15 | author = Column(String(30), default="未名") 16 | binding = Column(String(20)) 17 | publisher = Column(String(50)) 18 | price = Column(String(20)) 19 | pages = Column(Integer) 20 | isbn = Column(String(15), nullable=True, unique=True) 21 | summary = Column(String(1000)) 22 | image = Column(String(50)) 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/models/drift.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | from sqlalchemy import Column, String, Integer , SmallInteger 6 | 7 | from app.libs.enums import PendingStatus 8 | from app.models.base import Base 9 | 10 | __author__ = "gaowenfeng" 11 | 12 | 13 | class Drift(Base): 14 | """ 15 | 一次具体的交易信息 16 | """ 17 | __tablename__ = 'drift' 18 | 19 | id = Column(Integer, primary_key=True) 20 | 21 | # 邮寄信息 22 | recipient_name = Column(String(20), nullable=False) 23 | address = Column(String(100), nullable=False) 24 | message = Column(String(200)) 25 | mobile = Column(String(20), nullable=False) 26 | 27 | # 书籍信息 28 | isbn = Column(String(13)) 29 | book_title = Column(String(50)) 30 | book_author = Column(String(30)) 31 | book_img = Column(String(50)) 32 | 33 | # 请求者信息 34 | requester_id = Column(Integer) 35 | requester_nickname = Column(String(20)) 36 | 37 | # 赠送者信息 38 | gifter_id = Column(Integer) 39 | gift_id = Column(Integer) 40 | gifter_nickname = Column(String(20)) 41 | 42 | # 状态 43 | _pending = Column('pending', SmallInteger, default=1) 44 | 45 | @property 46 | def pending(self): 47 | return PendingStatus(self._pending) 48 | 49 | @pending.setter 50 | def pending(self, status): 51 | self._pending = status.value 52 | -------------------------------------------------------------------------------- /app/secure.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 2018/5/31 3 | """ 4 | __author__ = "gaowenfeng" 5 | 6 | DEBUG = True 7 | HOST = "0.0.0.0" 8 | PORT = 8090 9 | 10 | SQLALCHEMY_DATABASE_URI = "mysql+cymysql://root:root@localhost:3306/fisher" 11 | # SQLALCHEMY_TRACK_MODIFICATIONS = False 12 | 13 | SECRET_KEY = "" 14 | 15 | # email配置 16 | MAIL_SERVER = 'smtp.qq.com' 17 | MAIL_PORT = 465 18 | MAIL_USE_SSL = True 19 | MAIL_USE_TSL = False 20 | MAIL_USERNAME = '1152057576@qq.com' 21 | # QQ邮箱->设置->账户->[POP3...]->生成授权码->发送短信->获取授权码 22 | MAIL_PASSWORD = '' 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | 7 | PRE_PAGE = 15 8 | BEANS_UPLOAD_ONE_BOOK = 0.5 9 | -------------------------------------------------------------------------------- /app/spider/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | -------------------------------------------------------------------------------- /app/spider/yushu_book.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 2018/6/1 3 | """ 4 | from app.libs.httper import HTTP 5 | from flask import current_app 6 | 7 | __author__ = "gaowenfeng" 8 | 9 | 10 | class YuShuBook: 11 | 12 | search_by_isbn_url = "http://t.yushu.im/v2/book/isbn/{}" 13 | 14 | search_by_key_url = "http://t.yushu.im/v2/book/search?q={}&count={}&start={}" 15 | 16 | def __init__(self): 17 | self.total = 0 18 | self.books = [] 19 | 20 | def search_by_isbn(self, isbn): 21 | url = self.search_by_isbn_url.format(isbn) 22 | result = HTTP.get(url) 23 | self.__fill_single(result) 24 | 25 | def search_by_key(self, q, page=1): 26 | url = self.search_by_key_url.format(q, current_app.config["PRE_PAGE"], 27 | self.__calculate_start(page)) 28 | result = HTTP.get(url) 29 | self.__fill_collection(result) 30 | 31 | def __fill_single(self, data): 32 | if data: 33 | self.books = [data] 34 | self.total = 1 35 | 36 | def __fill_collection(self, data): 37 | self.books = data['books'] 38 | self.total = data['total'] 39 | 40 | def __calculate_start(self, page): 41 | return (page-1) * current_app.config["PRE_PAGE"] 42 | 43 | @property 44 | def first(self): 45 | return self.books[0] if self.total >= 1 else None 46 | -------------------------------------------------------------------------------- /app/static/3rd/ui/remodal.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Remodal - v1.1.1 3 | * Responsive, lightweight, fast, synchronized with CSS animations, fully customizable modal window plugin with declarative configuration and hash tracking. 4 | * http://vodkabears.github.io/remodal/ 5 | * 6 | * Made by Ilya Makarov 7 | * Under MIT License 8 | */ 9 | 10 | /* ========================================================================== 11 | Remodal's necessary styles 12 | ========================================================================== */ 13 | 14 | /* Hide scroll bar */ 15 | 16 | html.remodal-is-locked { 17 | overflow: hidden; 18 | 19 | -ms-touch-action: none; 20 | touch-action: none; 21 | } 22 | 23 | /* Anti FOUC */ 24 | 25 | .remodal, 26 | [data-remodal-id] { 27 | display: none; 28 | } 29 | 30 | /* Necessary styles of the overlay */ 31 | 32 | .remodal-overlay { 33 | position: fixed; 34 | z-index: 9999; 35 | top: -5000px; 36 | right: -5000px; 37 | bottom: -5000px; 38 | left: -5000px; 39 | 40 | display: none; 41 | } 42 | 43 | /* Necessary styles of the wrapper */ 44 | 45 | .remodal-wrapper { 46 | position: fixed; 47 | z-index: 10000; 48 | top: 0; 49 | right: 0; 50 | bottom: 0; 51 | left: 0; 52 | 53 | display: none; 54 | overflow: auto; 55 | 56 | text-align: center; 57 | 58 | -webkit-overflow-scrolling: touch; 59 | } 60 | 61 | .remodal-wrapper:after { 62 | display: inline-block; 63 | 64 | height: 100%; 65 | margin-left: -0.05em; 66 | 67 | content: ""; 68 | } 69 | 70 | /* Fix iPad, iPhone glitches */ 71 | 72 | .remodal-overlay, 73 | .remodal-wrapper { 74 | -webkit-backface-visibility: hidden; 75 | backface-visibility: hidden; 76 | } 77 | 78 | /* Necessary styles of the modal dialog */ 79 | 80 | .remodal { 81 | position: relative; 82 | 83 | outline: none; 84 | 85 | -webkit-text-size-adjust: 100%; 86 | -ms-text-size-adjust: 100%; 87 | text-size-adjust: 100%; 88 | } 89 | 90 | .remodal-is-initialized { 91 | /* Disable Anti-FOUC */ 92 | display: inline-block; 93 | } 94 | -------------------------------------------------------------------------------- /app/static/css/book-detail.css: -------------------------------------------------------------------------------- 1 | .book-img { 2 | box-shadow: 0 5px 9.5px 0.5px rgba(184, 187, 192, 0.75); 3 | /* For IE 8 */ 4 | -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#000000')"; 5 | /* For IE 5.5 - 7 */ 6 | filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#000000'); 7 | height: 240px; 8 | width: 160px; 9 | } 10 | .book-container { 11 | margin-top: 55px; 12 | } 13 | .description-font-margin { 14 | color: #8e8E8E; 15 | font-size: 14px; 16 | font-weight: normal; 17 | margin-top: 12px; 18 | } 19 | .description-font-margin div { 20 | margin-bottom: 3px; 21 | } 22 | .description-font-margin .color-count { 23 | color: #826762; 24 | font-weight: 500; 25 | } 26 | .diag-title { 27 | margin-bottom: 30px; 28 | font-weight: 700; 29 | color: #826762; 30 | } 31 | .remodal-confirm, 32 | .remodal-cancel { 33 | padding: 5px; 34 | min-width: 80px; 35 | border-radius: 3px; 36 | } 37 | .remodal-confirm { 38 | margin-right: 30px; 39 | color: #fff; 40 | background: #826762; 41 | } 42 | .remodal-confirm:hover, 43 | .remodal-confirm:focus { 44 | background: #66bb6a; 45 | } 46 | .remodal-cancel { 47 | color: #fff; 48 | background: #41464B; 49 | } 50 | .remodal-cancel:hover, 51 | .remodal-cancel:focus { 52 | background: #ef5350; 53 | } 54 | -------------------------------------------------------------------------------- /app/static/css/drift.css: -------------------------------------------------------------------------------- 1 | .drift-title { 2 | font-size: 29px; 3 | color: #ffffff; 4 | line-height: 70px; 5 | } 6 | .gifter-container { 7 | padding: 15px; 8 | background-color: #f2f5f7; 9 | } 10 | -------------------------------------------------------------------------------- /app/static/css/index.css: -------------------------------------------------------------------------------- 1 | .module-title { 2 | margin-top: 50px; 3 | } 4 | #books { 5 | padding: 0 !important; 6 | } 7 | #books > div:nth-of-type(2n) { 8 | margin-left: 100px; 9 | } 10 | .book-container { 11 | padding: 0 !important; 12 | background-color: #FFFFFF; 13 | margin-top: 60px; 14 | border: 1px solid #d0d0d0; 15 | border-radius: 2px; 16 | } 17 | .book-img { 18 | height: 166px; 19 | width: 111px; 20 | position: relative; 21 | top: -30px; 22 | left: 10px; 23 | box-shadow: 0 5px 9.5px 0.5px rgba(184, 187, 192, 0.75); 24 | /* For IE 8 */ 25 | -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#000000')"; 26 | /* For IE 5.5 - 7 */ 27 | filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#000000'); 28 | } 29 | .book-info { 30 | color: #666; 31 | padding-top: 20px; 32 | padding-left: 30px; 33 | padding-right: 5px; 34 | height: 166px; 35 | } 36 | .book-info .summary { 37 | height: 70px; 38 | padding-top: 8px; 39 | overflow: hidden; 40 | text-overflow: ellipsis; 41 | } 42 | -------------------------------------------------------------------------------- /app/static/css/login.css: -------------------------------------------------------------------------------- 1 | .password-box { 2 | background-color: #EBEBEB; 3 | } 4 | #forget-password:before { 5 | content: ''; 6 | border-left: 1px solid #999; 7 | margin-right: 15px; 8 | } 9 | -------------------------------------------------------------------------------- /app/static/css/not-enough.css: -------------------------------------------------------------------------------- 1 | .bg { 2 | background-color: #8BACA1; 3 | padding: 15px; 4 | color: #ffffff; 5 | margin-left: 15px; 6 | } 7 | .bg-opacity { 8 | background-color: #8BACA1; 9 | padding: 15px; 10 | color: #ffffff; 11 | margin-left: 15px; 12 | background-color: rgba(139, 172, 161, 0.3); 13 | color: #323232; 14 | margin-left: 0; 15 | } 16 | -------------------------------------------------------------------------------- /app/static/css/pending.css: -------------------------------------------------------------------------------- 1 | .drift-container { 2 | border: 1px solid #e0e0e0; 3 | padding: 20px 0 0 0; 4 | color: #333; 5 | } 6 | .message-container { 7 | padding: 10px 0 0 0; 8 | background-color: #e8ebef; 9 | } 10 | .message-flag { 11 | color: #8BACA1; 12 | } 13 | .description div { 14 | margin-bottom: 5px; 15 | } 16 | .description div > span:first-child { 17 | color: #8e8E8E; 18 | } 19 | .status-color { 20 | color: #FB7C85; 21 | } 22 | -------------------------------------------------------------------------------- /app/static/css/personal.css: -------------------------------------------------------------------------------- 1 | .outer-container { 2 | margin-top: 150px; 3 | } 4 | .personal-container { 5 | margin-top: 15px; 6 | background-color: #ffffff; 7 | padding-bottom: 300px; 8 | } 9 | .personal-detail { 10 | color: #323232; 11 | font-size: 15px; 12 | } 13 | .personal-detail div { 14 | display: flex; 15 | justify-content: space-between; 16 | margin-bottom: 10px; 17 | } 18 | .personal-detail div > span:first-child { 19 | color: #8e8E8E; 20 | } 21 | -------------------------------------------------------------------------------- /app/static/css/register.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | } 5 | .box { 6 | width: 100%; 7 | height: 100%; 8 | display: flex; 9 | align-items: center; 10 | justify-content: center; 11 | } 12 | -------------------------------------------------------------------------------- /app/static/css/search-result.css: -------------------------------------------------------------------------------- 1 | .col-padding { 2 | padding-top: 50px; 3 | } 4 | .summary { 5 | margin-top: 12px; 6 | height: 70px; 7 | padding-top: 8px; 8 | overflow: hidden; 9 | text-overflow: ellipsis; 10 | } 11 | #pagination { 12 | margin-top: 80px; 13 | } 14 | #pagination li { 15 | background-color: transparent; 16 | } 17 | #pagination a { 18 | color: #826762; 19 | } 20 | #pagination li.active > a { 21 | color: #FFFFFF; 22 | } 23 | #pagination li > a:hover { 24 | color: #826762; 25 | } 26 | #pagination > .active > a { 27 | background-color: #826762; 28 | border-color: #826762; 29 | color: #ffffff; 30 | } 31 | -------------------------------------------------------------------------------- /app/static/images/fish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/fish.png -------------------------------------------------------------------------------- /app/static/images/fish1@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/fish1@subnav.png -------------------------------------------------------------------------------- /app/static/images/fish2@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/fish2@subnav.png -------------------------------------------------------------------------------- /app/static/images/fish3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/fish3.png -------------------------------------------------------------------------------- /app/static/images/fish@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/fish@subnav.png -------------------------------------------------------------------------------- /app/static/images/flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/flow.png -------------------------------------------------------------------------------- /app/static/images/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/gift.png -------------------------------------------------------------------------------- /app/static/images/gift@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/gift@subnav.png -------------------------------------------------------------------------------- /app/static/images/gift@subnav1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/gift@subnav1.png -------------------------------------------------------------------------------- /app/static/images/gift@subnav111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/gift@subnav111.png -------------------------------------------------------------------------------- /app/static/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/icon.png -------------------------------------------------------------------------------- /app/static/images/logo-yushu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/logo-yushu.png -------------------------------------------------------------------------------- /app/static/images/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/upload.png -------------------------------------------------------------------------------- /app/static/images/upload111@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/upload111@subnav.png -------------------------------------------------------------------------------- /app/static/images/upload@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/upload@subnav.png -------------------------------------------------------------------------------- /app/static/images/upload@subnav111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/upload@subnav111.png -------------------------------------------------------------------------------- /app/static/images/wish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/wish.png -------------------------------------------------------------------------------- /app/static/images/wish1111@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/wish1111@subnav.png -------------------------------------------------------------------------------- /app/static/images/wish1@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/wish1@subnav.png -------------------------------------------------------------------------------- /app/static/images/wish@subnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/images/wish@subnav.png -------------------------------------------------------------------------------- /app/static/js/base.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | url = window.location.pathname 3 | if (url == '/my/gifts'){ 4 | $('#gifts').addClass('linking') 5 | } 6 | if (url == '/'){ 7 | $('#recent').addClass('linking') 8 | } 9 | if (url== '/my/gifts'){ 10 | $('#gifts').addClass('linking') 11 | } 12 | if (url == '/my/wish'){ 13 | $('#wishes').addClass('linking') 14 | } 15 | if (url == '/pending'){ 16 | $('#pending').addClass('linking') 17 | } 18 | })() -------------------------------------------------------------------------------- /app/static/js/book-detail.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | $(document).on('confirmation', '.remodal', function () { 4 | var isbn = $('#isbn').text() 5 | window.location.href='/gifts/book/' + isbn 6 | }); -------------------------------------------------------------------------------- /app/static/js/drift.js: -------------------------------------------------------------------------------- 1 | 2 | (function (){ 3 | historyLength = window.history.length 4 | var a = $('#nav_url') 5 | if (historyLength > 1){ 6 | a.text('返回') 7 | a.attr('href', '#') 8 | a.click(function(){ 9 | window.history.back(-1) 10 | }) 11 | } 12 | else{ 13 | a.text('去首页') 14 | a.attr('href', '/') 15 | } 16 | console.log(window.history.length) 17 | })() 18 | 19 | -------------------------------------------------------------------------------- /app/static/js/gifts.js: -------------------------------------------------------------------------------- 1 | class MyGift { 2 | 3 | constructor(isbn) { 4 | this.isbn = isbn 5 | this.douban_url = 'https://api.douban.com/v2/book/isbn/' + isbn 6 | } 7 | 8 | data_from_douban(book_element) { 9 | this.book_element = book_element 10 | HTTP.get(this.douban_url, this.when_data_success, this.when_data_error) 11 | } 12 | 13 | when_data_success(result){ 14 | let c = 1 15 | // this.$(book_element).('#title').html(result.title) 16 | } 17 | 18 | when_data_error(errors){ 19 | alert(errors) 20 | } 21 | } 22 | 23 | (function() { 24 | $('#book').each(function(index, element){ 25 | book_isbn = $(element).data('isbn') 26 | gift = new MyGift(book_isbn) 27 | gift.data_from_douban(element) 28 | }) 29 | })() -------------------------------------------------------------------------------- /app/static/js/http.js: -------------------------------------------------------------------------------- 1 | class HTTP { 2 | static post(url, data,success,error) { 3 | $.ajax({ 4 | type: 'POST', 5 | url: url, 6 | data:data, 7 | success:success, 8 | error:error, 9 | headers: { 10 | Accept: 'application/json' 11 | } 12 | }) 13 | } 14 | 15 | static get(url, success, error){ 16 | $.ajax({ 17 | type:'GET', 18 | url:url, 19 | success:success, 20 | error:error 21 | }) 22 | } 23 | } -------------------------------------------------------------------------------- /app/static/js/register.model.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/js/register.model.js -------------------------------------------------------------------------------- /app/static/js/search_result.js: -------------------------------------------------------------------------------- 1 | class Pagination { 2 | constructor() { 3 | self.that = this 4 | } 5 | 6 | onPageClick(event, page) { 7 | window.location.href = $SCRIPT_ROOT + '/book/search?q=' + self.that.keyword + '&page=' + page 8 | } 9 | 10 | pagination(total, visbleCount, startPage) { 11 | $('#pagination').twbsPagination({ 12 | initiateStartPageClick: false, 13 | hideOnlyOnePage: false, 14 | startPage: startPage, 15 | totalPages: total, 16 | visiblePages: visbleCount, 17 | onPageClick: self.that.onPageClick, 18 | first: '首页', 19 | last: '尾页', 20 | next:'后页>', 21 | prev:'<前页' 22 | }) 23 | } 24 | 25 | initForSearch() { 26 | var page = getQueryString('page') 27 | if (!page) { 28 | page = 1 29 | } 30 | else{ 31 | page = parseInt(page) 32 | } 33 | self.that.keyword = $('#keyword').text() 34 | var total = $('#total').text() 35 | total = Math.floor(parseInt(total) / 15) + 1 36 | self.that.pagination(total, 6, page) 37 | } 38 | } 39 | 40 | new Pagination().initForSearch() 41 | 42 | -------------------------------------------------------------------------------- /app/static/js/util.js: -------------------------------------------------------------------------------- 1 | 2 | function getAllFormFields(formID){ 3 | var fields = {} 4 | var target = $('#' + formID).serializeArray() 5 | $.each(target, function() { 6 | fields[this.name] = this.value 7 | }) 8 | return fields 9 | } 10 | 11 | 12 | function getQueryString(name) 13 | { 14 | var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); 15 | var r = window.location.search.substr(1).match(reg); 16 | if(r!=null)return unescape(r[2]); return null; 17 | } 18 | 19 | (function (){ 20 | console.log(window.history.length) 21 | })() 22 | 23 | -------------------------------------------------------------------------------- /app/static/less/base.less: -------------------------------------------------------------------------------- 1 | @import "normal.less"; 2 | 3 | @media screen and (min-width: 1200px) { 4 | .container { 5 | width: 970px; 6 | } 7 | } 8 | 9 | a:link, a:visited, a:hover { 10 | text-decoration: none; 11 | } 12 | 13 | .nav-self { 14 | background-color: @nav-color; 15 | width: 100%; 16 | height: @nav-height; 17 | //border-bottom: 1px solid @shadow-1-color; 18 | } 19 | 20 | .slogan { 21 | color: #ffffff; 22 | font-size: 20px; 23 | font-weight: 700; 24 | } 25 | 26 | .sub-nav { 27 | width: 100%; 28 | background-color: #505E69; 29 | height: 110px; 30 | img { 31 | width: 30px; 32 | height: 30px; 33 | } 34 | span { 35 | margin-top: 8px; 36 | } 37 | a { 38 | color: @white-color; 39 | } 40 | } 41 | 42 | html { 43 | overflow-y: scroll; 44 | } 45 | 46 | body { 47 | font-size: @title-small; 48 | background-color: #F2F5F7; 49 | } 50 | 51 | p { 52 | font-size: @title-small; 53 | } 54 | 55 | .container { 56 | //padding-top: 30px; 57 | } 58 | 59 | .float-menu { 60 | //display: inline-block; 61 | line-height: @nav-height; 62 | position: absolute; 63 | z-index: 999; 64 | top: 0; 65 | right: 0; 66 | width: 20%; 67 | padding-right: 100px; 68 | height: @nav-height; 69 | 70 | a { 71 | color: #FFFFFF; 72 | font-size: 14px; 73 | } 74 | } 75 | 76 | .linking { 77 | span { 78 | color: @logo-color; 79 | font-weight: normal; 80 | } 81 | } 82 | 83 | #footer { 84 | margin-top: 180px; 85 | margin-bottom: 50px; 86 | color: @shadow-2-color; 87 | } 88 | 89 | .big-title { 90 | display: block; 91 | color: @fake-main-color; 92 | font-size: 50px; 93 | padding: 90px 0 70px 0; 94 | } 95 | 96 | .bg-container { 97 | margin-top: 15px; 98 | background-color: #ffffff; 99 | padding-bottom: 300px; 100 | padding-left: 15px; 101 | padding-right: 15px; 102 | } 103 | 104 | .btn-search{ 105 | .bg-info; 106 | border-radius: 0; 107 | padding-left: 10px; 108 | padding-right:10px; 109 | } 110 | -------------------------------------------------------------------------------- /app/static/less/book-detail.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | 3 | .book-img{ 4 | .shadow; 5 | height:240px; 6 | width:160px; 7 | } 8 | 9 | .book-container{ 10 | margin-top:55px; 11 | } 12 | 13 | .description-font-margin{ 14 | .description-font; 15 | margin-top:12px; 16 | div{ 17 | margin-bottom:3px; 18 | } 19 | .color-count{ 20 | color:@main-color; 21 | font-weight: 500; 22 | } 23 | } 24 | 25 | .diag-title{ 26 | margin-bottom:30px; 27 | font-weight:700; 28 | color:@main-color; 29 | } 30 | 31 | .remodal-confirm, 32 | .remodal-cancel{ 33 | padding:5px; 34 | min-width:80px; 35 | border-radius: 3px; 36 | } 37 | 38 | .remodal-confirm { 39 | margin-right:30px; 40 | color: #fff; 41 | background: @main-color; 42 | } 43 | 44 | .remodal-confirm:hover, 45 | .remodal-confirm:focus { 46 | background: #66bb6a; 47 | } 48 | 49 | .remodal-cancel { 50 | color: #fff; 51 | background: @dark-color; 52 | } 53 | 54 | .remodal-cancel:hover, 55 | .remodal-cancel:focus { 56 | background: #ef5350; 57 | } 58 | 59 | -------------------------------------------------------------------------------- /app/static/less/drift.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | 3 | .drift-title{ 4 | font-size:29px; 5 | color:#ffffff; 6 | line-height: 70px; 7 | } 8 | 9 | .gifter-container{ 10 | padding:15px; 11 | background-color: @shadow-color-6; 12 | } 13 | -------------------------------------------------------------------------------- /app/static/less/gifts.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/less/gifts.less -------------------------------------------------------------------------------- /app/static/less/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | 3 | .module-title{ 4 | margin-top:50px; 5 | } 6 | 7 | #books{ 8 | padding:0 !important; 9 | } 10 | 11 | #books > div:nth-of-type(2n){ 12 | //background-color: #1abc9c; 13 | margin-left:100px; 14 | //margin-left:60px; 15 | } 16 | 17 | .book-container{ 18 | padding:0 !important; 19 | background-color: #FFFFFF; 20 | margin-top: 60px; 21 | border:1px solid @shadow-color-3; 22 | //.shadow; 23 | border-radius: 2px; 24 | } 25 | 26 | .book-img{ 27 | .book-img-base; 28 | position:relative; 29 | top: -30px; 30 | left: 10px; 31 | .shadow; 32 | } 33 | 34 | 35 | .book-info{ 36 | color: #666; 37 | padding-top:20px; 38 | padding-left:30px; 39 | padding-right:5px; 40 | .summary{ 41 | height:70px; 42 | padding-top:8px; 43 | //padding-bottom: 20px; 44 | overflow:hidden; 45 | text-overflow:ellipsis; 46 | } 47 | height: 166px; 48 | //white-space:nowrap; 49 | } 50 | -------------------------------------------------------------------------------- /app/static/less/login.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | .password-box { 3 | //padding-left:0; 4 | //padding-right:0; 5 | background-color: #EBEBEB; 6 | } 7 | 8 | #forget-password:before{ 9 | content:''; 10 | border-left:1px solid #999; 11 | margin-right:15px; 12 | //height:20px; 13 | } 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/static/less/not_enough.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | 3 | .bg{ 4 | background-color: @fake-main-color; 5 | padding:15px; 6 | color:@white-color; 7 | margin-left:15px; 8 | //padding:0; 9 | } 10 | 11 | .bg-opacity{ 12 | .bg; 13 | .bg-fake-rgba(0.3); 14 | color:@normal-black-color; 15 | margin-left:0; 16 | } 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/static/less/pending.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | 3 | .drift-container{ 4 | border: 1px solid @shadow-color-4; 5 | padding: 20px 0 0 0; 6 | color: #333; 7 | } 8 | 9 | .message-container{ 10 | padding:10px 0 0 0; 11 | background-color: #e8ebef; 12 | } 13 | 14 | .message-flag{ 15 | color:@fake-main-color; 16 | } 17 | 18 | .description{ 19 | div { 20 | margin-bottom: 5px; 21 | } 22 | 23 | div > span:first-child{ 24 | color: @shadow-color-2; 25 | } 26 | 27 | } 28 | 29 | .status-color{ 30 | color:@high-color; 31 | } -------------------------------------------------------------------------------- /app/static/less/personal.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | 3 | .outer-container{ 4 | margin-top:150px; 5 | } 6 | 7 | .personal-container{ 8 | margin-top:15px; 9 | background-color:#ffffff; 10 | padding-bottom: 300px; 11 | } 12 | 13 | 14 | .personal-detail{ 15 | color:@normal-black-color; 16 | font-size:15px; 17 | div{ 18 | display: flex; 19 | justify-content: space-between; 20 | margin-bottom:10px; 21 | } 22 | div > span:first-child{ 23 | color:@shadow-color-2; 24 | } 25 | } -------------------------------------------------------------------------------- /app/static/less/search-result.less: -------------------------------------------------------------------------------- 1 | @import (reference) "normal.less"; 2 | .col-padding { 3 | padding-top: 50px; 4 | } 5 | 6 | .summary { 7 | margin-top:12px; 8 | height: 70px; 9 | padding-top: 8px; 10 | //padding-bottom: 20px; 11 | overflow: hidden; 12 | text-overflow: ellipsis; 13 | } 14 | 15 | #pagination { 16 | margin-top: 80px; 17 | } 18 | 19 | #pagination li { 20 | background-color: transparent; 21 | } 22 | 23 | #pagination a { 24 | color: @main-color; 25 | } 26 | 27 | #pagination li.active > a { 28 | color: #FFFFFF; 29 | } 30 | 31 | #pagination li > a:hover { 32 | color: @main-color; 33 | } 34 | 35 | #pagination>.active>a{ 36 | background-color: @main-color; 37 | border-color:@main-color; 38 | color:@white-color; 39 | } 40 | 41 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/.gitattributes: -------------------------------------------------------------------------------- 1 | # Enforce Unix newlines 2 | *.css text eol=lf 3 | *.html text eol=lf 4 | *.js text eol=lf 5 | *.json text eol=lf 6 | *.md text eol=lf 7 | *.scss text eol=lf 8 | *.svg text eol=lf 9 | *.yml text eol=lf 10 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore docs files 2 | .ruby-version 3 | .sass-cache 4 | 5 | # Numerous always-ignore extensions 6 | *.diff 7 | *.err 8 | *.orig 9 | *.log 10 | *.rej 11 | *.swo 12 | *.swp 13 | *.zip 14 | *.vi 15 | *~ 16 | 17 | # OS or Editor folders 18 | .DS_Store 19 | ._* 20 | Thumbs.db 21 | .cache 22 | .project 23 | .settings 24 | .tmproj 25 | *.esproj 26 | nbproject 27 | *.sublime-project 28 | *.sublime-workspace 29 | .idea 30 | 31 | # grunt-html-validation 32 | validation-status.json 33 | validation-report.json 34 | 35 | # Folders to ignore 36 | node_modules 37 | 38 | # Composer 39 | composer.lock 40 | /vendor 41 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.10" 4 | before_install: 5 | - rvm use 1.9.3 6 | install: 7 | - travis_retry npm install -g grunt-cli 8 | - travis_retry npm install 9 | - travis_retry gem install "sass:~>3.3.5" 10 | matrix: 11 | fast_finish: true 12 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 bootflat 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /app/static/temp/bootflat/_config.yml: -------------------------------------------------------------------------------- 1 | # Meta data 2 | name: Bootflat 3 | authors: flathemes 4 | description: BOOTFLAT is an open source Flat UI KIT based on Bootstrap 3.3.0 CSS framework. And, for the designers, we offer a free PSD Download. It provides a faster, easier and less repetitive way for web developers or designers to create elegant web apps. 5 | 6 | # Dependencies 7 | pygments: true 8 | 9 | # Permalinks 10 | permalink: pretty 11 | 12 | # Server 13 | source: docs 14 | url: http://bootflat.github.io 15 | encoding: UTF-8 16 | 17 | # Custom vars 18 | current_version: 2.0.4 19 | repo: https://github.com/bootflat/bootflat.github.io 20 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/angularicons/angularicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/angularicons/angularicons.eot -------------------------------------------------------------------------------- /app/static/temp/bootflat/angularicons/angularicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/angularicons/angularicons.ttf -------------------------------------------------------------------------------- /app/static/temp/bootflat/angularicons/angularicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/angularicons/angularicons.woff -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/img/check_flat/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/bootflat/img/check_flat/default.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/img/check_flat/default.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/bootflat/img/check_flat/default.psd -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/.csslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "adjoining-classes": false, 3 | "box-sizing": false, 4 | "box-model": false, 5 | "compatible-vendor-prefixes": false, 6 | "fallback-colors": false, 7 | "font-sizes": false, 8 | "important": false, 9 | "known-properties": false, 10 | "outline-none": false, 11 | "qualified-headings": false, 12 | "unique-headings": false, 13 | "universal-selector": false, 14 | "unqualified-attributes": false 15 | } 16 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | @import 4 | 5 | // Variables, Extends, Mixins 6 | "bootflat/global", 7 | 8 | // Base 9 | "bootflat/typography", 10 | "bootflat/button", 11 | "bootflat/button_group", 12 | "bootflat/label_badge", 13 | "bootflat/tooltip", 14 | "bootflat/popover", 15 | "bootflat/progress", 16 | "bootflat/breadcrumb", 17 | "bootflat/pagination", 18 | "bootflat/pager", 19 | "bootflat/form", 20 | "bootflat/stepper", 21 | "bootflat/selecter", 22 | "bootflat/checkbox_radio", 23 | "bootflat/toggle", 24 | "bootflat/calendar", 25 | "bootflat/pricing", 26 | "bootflat/alert", 27 | "bootflat/tab", 28 | "bootflat/pill", 29 | "bootflat/navbar", 30 | "bootflat/list", 31 | "bootflat/media_list", 32 | "bootflat/modal", 33 | "bootflat/well", 34 | "bootflat/thumbnail", 35 | "bootflat/jumbotron", 36 | "bootflat/panel", 37 | "bootflat/accordion", 38 | "bootflat/footer", 39 | "bootflat/timeline", 40 | "bootflat/dropdown"; 41 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_checkbox_radio.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $img-src: "../bootflat/img/check_flat/default.png" !default; 4 | 5 | // Exports 6 | //------------------------------------------------------ 7 | 8 | @include exports("checkbox-radio") { 9 | 10 | /** 11 | * checkbox and radio 12 | * -------------------------------------------------- 13 | */ 14 | .checkbox, .radio { 15 | margin-top: 0; 16 | padding-left: 0; 17 | } 18 | .checkbox label, .radio label { 19 | position: relative; 20 | top: 2px; 21 | padding-left: 5px; 22 | } 23 | .icheckbox_flat, 24 | .iradio_flat { 25 | display: inline-block; 26 | *display: inline; 27 | vertical-align: middle; 28 | margin: 0; 29 | padding: 0 !important; 30 | width: 20px; 31 | height: 20px; 32 | background: url($img-src) no-repeat; 33 | border: none; 34 | cursor: pointer; 35 | } 36 | 37 | .icheckbox_flat { 38 | background-position: 0 0; 39 | 40 | &.checked { 41 | background-position: -22px 0; 42 | } 43 | &.disabled { 44 | background-position: -44px 0; 45 | cursor: default; 46 | } 47 | &.checked.disabled { 48 | background-position: -66px 0; 49 | } 50 | } 51 | 52 | .iradio_flat { 53 | background-position: -88px 0; 54 | 55 | &.checked { 56 | background-position: -110px 0; 57 | } 58 | &.disabled { 59 | background-position: -132px 0; 60 | cursor: default; 61 | } 62 | &.checked.disabled { 63 | background-position: -154px 0; 64 | } 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_footer.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $footer-background-color: $darkgray-dark !default; 4 | $footer-menu-title-color: $lightgray-dark !default; 5 | $footer-menu-item-color: $mediumgray-dark !default; 6 | $footer-menu-item-color-hover: $mediumgray-light !default; 7 | $footer-logo-color: $white !default; 8 | 9 | 10 | 11 | // Exports 12 | //------------------------------------------------------ 13 | 14 | @include exports("footer") { 15 | 16 | /** 17 | * footer 18 | * -------------------------------------------------- 19 | */ 20 | 21 | .footer { 22 | padding: 40px 0; 23 | background-color: $footer-background-color; 24 | 25 | &-logo, 26 | &-nav { 27 | float: left; 28 | padding: 0 20px; 29 | width: 20%; 30 | } 31 | @media (max-width: 768px) { 32 | &-logo { 33 | margin-bottom: 20px; 34 | } 35 | &-logo, 36 | &-nav { 37 | float: none; 38 | display: block; 39 | width: 100%; 40 | } 41 | } 42 | &-logo { 43 | margin-top: -5px; 44 | height: 32px; 45 | line-height: 32px; 46 | 47 | & img { 48 | margin-right: 10px; 49 | } 50 | & a { 51 | font-size: 20px; 52 | font-weight: bold; 53 | color: $footer-logo-color; 54 | } 55 | & a:hover, 56 | & a:active { 57 | text-decoration: none; 58 | } 59 | } 60 | &-nav .nav-title { 61 | margin-bottom: 15px; 62 | color: $footer-menu-title-color; 63 | } 64 | &-nav .nav-item { 65 | line-height: 28px; 66 | & > a { 67 | color: $footer-menu-item-color; 68 | } 69 | & > a:hover, 70 | & > a:active { 71 | color: $footer-menu-item-color-hover; 72 | text-decoration: none; 73 | } 74 | } 75 | &-copyright { 76 | color: $footer-menu-item-color; 77 | } 78 | } 79 | 80 | } 81 | 82 | 83 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_label_badge.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $label-normal: $mediumgray-dark !default; 4 | $label-default: $white !default; 5 | $label-primary: $aqua-dark !default; 6 | $label-success: $grass-dark !default; 7 | $label-danger: $grapefruit-dark !default; 8 | $label-warning: $sunflower-dark !default; 9 | $label-info: $mint-dark !default; 10 | 11 | $label-default-font-color: $darkgray-dark !default; 12 | 13 | // Exports 14 | //------------------------------------------------------ 15 | 16 | @include exports("label-badge") { 17 | 18 | /** 19 | * labels and badges 20 | * -------------------------------------------------- 21 | */ 22 | .label, 23 | .badge { 24 | background-color: $label-normal; 25 | } 26 | 27 | .label-default, 28 | .badge-default { 29 | border: 1px solid $button-normal; 30 | background-color: $label-default; 31 | color: $label-default-font-color; 32 | } 33 | 34 | .label-primary, 35 | .badge-primary { 36 | border-color: $label-primary; 37 | background-color: $label-primary; 38 | } 39 | 40 | .label-success, 41 | .badge-success { 42 | border-color: $label-success; 43 | background-color: $label-success; 44 | } 45 | 46 | .label-danger, 47 | .badge-danger { 48 | border-color: $label-danger; 49 | background-color: $label-danger; 50 | } 51 | 52 | .label-warning, 53 | .badge-warning { 54 | border-color: $label-warning; 55 | background-color: $label-warning; 56 | } 57 | 58 | .label-info, 59 | .badge-info { 60 | border-color: $label-info; 61 | background-color: $label-info; 62 | } 63 | } 64 | 65 | 66 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_media_list.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $media-list-font-color-head: $darkgray-dark !default; 4 | $media-list-font-color-body: $mediumgray-dark !default; 5 | 6 | 7 | // Exports 8 | //------------------------------------------------------ 9 | 10 | @include exports("media-list") { 11 | 12 | /** 13 | * media list 14 | * -------------------------------------------------- 15 | */ 16 | .media-list { 17 | color: $media-list-font-color-body; 18 | @at-root .media-heading { 19 | font-size: 14px; 20 | color: $media-list-font-color-head; 21 | } 22 | } 23 | 24 | } 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_modal.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $modal-font-color: $darkgray-dark !default; 4 | 5 | $modal-radius: 4px; 6 | $modal-shadow: 0 1px 2px rgba(0, 0, 0, .2) !default; 7 | 8 | 9 | // Exports 10 | //------------------------------------------------------ 11 | 12 | @include exports("modal") { 13 | 14 | /** 15 | * modal 16 | * -------------------------------------------------- 17 | */ 18 | 19 | .modal { 20 | &-content { 21 | border: none; 22 | @include radius($type: border-radius, $value: $modal-radius); 23 | color: $modal-font-color; 24 | @include box-shadow($value: $modal-shadow); 25 | } 26 | &-header { 27 | border-bottom: none; 28 | } 29 | &-body { 30 | padding: 0 15px; 31 | } 32 | &-footer { 33 | border-top: none; 34 | } 35 | } 36 | 37 | } 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_pager.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $paper-background-color: $grass-dark !default; 4 | $paper-background-color-hover: $grass-light !default; 5 | 6 | $paper-font-color: $white !default; 7 | $paper-font-color-disabled: $lightgray-dark !default; 8 | 9 | // Exports 10 | //------------------------------------------------------ 11 | 12 | @include exports("pager") { 13 | 14 | /** 15 | * pager 16 | * -------------------------------------------------- 17 | */ 18 | .pager { 19 | 20 | & li > a, 21 | & li > span { 22 | color: $paper-font-color; 23 | background-color: $paper-background-color; 24 | border-color: $paper-background-color; 25 | } 26 | & li > a:hover, 27 | & li > a:focus { 28 | background-color: $paper-background-color-hover; 29 | border-color: $paper-background-color-hover; 30 | } 31 | & .disabled > a, 32 | & .disabled > a:hover, 33 | & .disabled > a:focus, 34 | & .disabled > span { 35 | color: $paper-font-color-disabled; 36 | background-color: $paper-font-color; 37 | border-color: $paper-font-color-disabled; 38 | } 39 | } 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $pagination-background-color: $white !default; 4 | $pagination-background-color-hover: $mediumgray-light !default; 5 | $pagination-background-color-active: $grass-dark !default; 6 | 7 | $pagination-font-color: $darkgray-dark !default; 8 | $pagination-font-color-hover: $white !default; 9 | $pagination-font-color-disabled: $lightgray-dark !default; 10 | 11 | // Exports 12 | //------------------------------------------------------ 13 | 14 | @include exports("pagination") { 15 | 16 | /** 17 | * pagination 18 | * -------------------------------------------------- 19 | */ 20 | .pagination { 21 | 22 | & > li > a, 23 | & > li > span { 24 | color: $pagination-font-color; 25 | background-color: $pagination-background-color; 26 | border-color: $pagination-background-color-hover; 27 | } 28 | & > li > a:hover, 29 | & > li > span:hover, 30 | & > li > a:focus, 31 | & > li > span:focus { 32 | color: $pagination-font-color-hover; 33 | background-color: $pagination-background-color-hover; 34 | border-color: $pagination-background-color-hover; 35 | } 36 | & > .active > a, 37 | & > .active > span, 38 | & > .active > a:hover, 39 | & > .active > span:hover, 40 | & > .active > a:focus, 41 | & > .active > span:focus { 42 | color: $pagination-font-color-hover; 43 | background-color: $pagination-background-color-active; 44 | border-color: $pagination-background-color-active; 45 | } 46 | & > .disabled > span, 47 | & > .disabled > span:hover, 48 | & > .disabled > span:focus, 49 | & > .disabled > a, 50 | & > .disabled > a:hover, 51 | & > .disabled > a:focus { 52 | color: $pagination-font-color-disabled; 53 | background-color: $pagination-background-color; 54 | border-color: $pagination-background-color-hover; 55 | } 56 | } 57 | } 58 | 59 | 60 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_pill.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $pill-background-color: $aqua-dark !default; 4 | $pill-background-color-hover: $lightgray-dark !default; 5 | $pill-font-color: $darkgray-dark !default; 6 | $pill-font-color-active: $white !default; 7 | 8 | 9 | // Exports 10 | //------------------------------------------------------ 11 | 12 | @include exports("pill") { 13 | 14 | /** 15 | * pill 16 | * -------------------------------------------------- 17 | */ 18 | .nav-pills { 19 | & > li.active > a, 20 | & > li.active > a:hover, 21 | & > li.active > a:focus { 22 | color: $pill-font-color-active; 23 | background-color: $pill-background-color; 24 | } 25 | & > li > a { 26 | color: $pill-background-color; 27 | } 28 | & > li > a:hover { 29 | color: $pill-font-color; 30 | background-color: $pill-background-color-hover; 31 | } 32 | & > .active > a > .badge { 33 | color: $pill-background-color; 34 | } 35 | & .open > a, 36 | & .open > a:focus, 37 | & .open > a:hover { 38 | color: $pill-font-color; 39 | background-color: $pill-background-color-hover; 40 | } 41 | } 42 | 43 | } 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_popover.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $popover-background-color: $darkgray-dark !default; 4 | $popover-font-color: $white !default; 5 | $popover-title-font-color: $mediumgray-dark !default; 6 | 7 | 8 | // Exports 9 | //------------------------------------------------------ 10 | 11 | @include exports("popover") { 12 | 13 | /** 14 | * popover 15 | * -------------------------------------------------- 16 | */ 17 | 18 | .popover { 19 | background-color: $popover-background-color; 20 | color: $popover-font-color; 21 | border-color: $popover-background-color; 22 | 23 | @at-root &-title { 24 | padding-bottom: 0; 25 | font-weight: bold; 26 | color: $popover-title-font-color; 27 | background-color: transparent; 28 | border-bottom: none; 29 | } 30 | &.top .arrow, 31 | &.top .arrow:after { 32 | border-top-color: $popover-background-color; 33 | } 34 | &.right .arrow, 35 | &.right .arrow:after { 36 | border-right-color: $popover-background-color; 37 | } 38 | &.bottom .arrow, 39 | &.bottom .arrow:after { 40 | border-bottom-color: $popover-background-color; 41 | } 42 | &.left .arrow, 43 | &.left .arrow:after { 44 | border-left-color: $popover-background-color; 45 | } 46 | } 47 | 48 | } 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_progress.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $progress-primary: $aqua-dark !default; 4 | $progress-success: $grass-dark !default; 5 | $progress-danger: $grapefruit-dark !default; 6 | $progress-warning: $sunflower-dark !default; 7 | $progress-info: $mint-dark !default; 8 | 9 | $progress-background-color: $lightgray-dark !default; 10 | 11 | // Exports 12 | //------------------------------------------------------ 13 | @include exports("progress") { 14 | 15 | /** 16 | * progress 17 | * -------------------------------------------------- 18 | */ 19 | .progress { 20 | background-color: $progress-background-color; 21 | @include box-shadow($value: none); 22 | 23 | &-bar { 24 | background-color: $progress-primary; 25 | @include box-shadow($value: none); 26 | } 27 | &-bar-success { 28 | background-color: $progress-success; 29 | } 30 | &-bar-info { 31 | background-color: $progress-info; 32 | } 33 | &-bar-warning { 34 | background-color: $progress-warning; 35 | } 36 | &-bar-danger { 37 | background-color: $progress-danger; 38 | } 39 | } 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_stepper.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $stepper-primary: $aqua-dark !default; 4 | $stepper-primary-hover: $aqua-light !default; 5 | 6 | $stepper-arrow-width: 20px !default; 7 | 8 | 9 | // Exports 10 | //------------------------------------------------------ 11 | 12 | @include exports("stepper") { 13 | 14 | /** 15 | * stepper 16 | * -------------------------------------------------- 17 | */ 18 | .stepper { 19 | & .stepper-input { 20 | overflow: hidden; 21 | -moz-appearance: textfield; 22 | 23 | &::-webkit-inner-spin-button, 24 | &::-webkit-outer-spin-button { 25 | -webkit-appearance: none; 26 | margin: 0; 27 | } 28 | } 29 | 30 | & .stepper-arrow { 31 | background-color: $stepper-primary; 32 | cursor: pointer; 33 | display: block; 34 | height: 50%; 35 | position: absolute; 36 | right: 15px; 37 | text-indent: -99999px; 38 | width: $stepper-arrow-width; 39 | 40 | &:hover, 41 | &:active { 42 | background-color: $stepper-primary-hover; 43 | } 44 | } 45 | & .up { 46 | @include prefixer($property: border-top-right-radius, $value: 3px, $prefixes: webkit moz spec); 47 | border: 1px solid darken($stepper-primary, 7%); 48 | top: 0; 49 | } 50 | & .down { 51 | @include prefixer($property: border-bottom-right-radius, $value: 3px, $prefixes: webkit moz spec); 52 | bottom: 0; 53 | } 54 | & .up::before, 55 | & .down::before { 56 | content: ""; 57 | position: absolute; 58 | width: 0; 59 | height: 0; 60 | border-left: 4px solid transparent; 61 | border-right: 4px solid transparent; 62 | } 63 | & .up::before { 64 | top: 5px; 65 | left: 5px; 66 | border-bottom: 4px solid $white; 67 | } 68 | & .down:before { 69 | bottom: 5px; 70 | left: 6px; 71 | border-top: 4px solid $white; 72 | } 73 | &.disabled .stepper-arrow { 74 | background-color: $stepper-primary; 75 | @include opacity($opacity: 45, $filter: true); 76 | } 77 | } 78 | 79 | } 80 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_thumbnail.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $media-font-color: $darkgray-dark !default; 4 | 5 | 6 | $thumbnail-shadow: 0 1px 2px rgba(0, 0, 0, .2) !default; 7 | 8 | 9 | // Exports 10 | //------------------------------------------------------ 11 | 12 | @include exports("thumbnail") { 13 | 14 | /** 15 | * thumbnail 16 | * -------------------------------------------------- 17 | */ 18 | .thumbnail { 19 | border: none; 20 | @include box-shadow($value: $list-shadow); 21 | 22 | & a > img, & > img { 23 | width: 100%; 24 | } 25 | 26 | & .caption { 27 | font-size: 14px; 28 | } 29 | 30 | & .caption h1, 31 | & .caption h2, 32 | & .caption h3, 33 | & .caption h4, 34 | & .caption h5, 35 | & .caption h6 { 36 | margin: 5px 0 10px; 37 | font-size: 16px; 38 | } 39 | } 40 | 41 | } 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_tooltip.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $tooltip-background-color: $darkgray-dark !default; 4 | $tooltip-font-color: $white !default; 5 | 6 | 7 | // Exports 8 | //------------------------------------------------------ 9 | 10 | @include exports("tooltip") { 11 | 12 | /** 13 | * tooltip 14 | * -------------------------------------------------- 15 | */ 16 | 17 | .tooltip { 18 | @at-root &-inner { 19 | color: $tooltip-font-color; 20 | background-color: $tooltip-background-color; 21 | } 22 | &.top &-arrow, 23 | &.top-left &-arrow, 24 | &.top-right &-arrow { 25 | border-top-color: $tooltip-background-color; 26 | } 27 | &.right &-arrow { 28 | border-right-color: $tooltip-background-color; 29 | } 30 | &.left &-arrow { 31 | border-left-color: $tooltip-background-color; 32 | } 33 | &.bottom &-arrow, 34 | &.bottom-left &-arrow, 35 | &.bottom-right &-arrow { 36 | border-bottom-color: $tooltip-background-color; 37 | } 38 | } 39 | 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bootflat/scss/bootflat/_well.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | //------------------------------------------------------ 3 | $well-font-color: $darkgray-dark !default; 4 | $well-background-color: $white !default; 5 | 6 | $well-blockquote-color: $mediumgray-light !default; 7 | 8 | $well-radius: 4px; 9 | $well-shadow: 0 1px 2px rgba(0, 0, 0, .2) !default; 10 | 11 | 12 | // Exports 13 | //------------------------------------------------------ 14 | 15 | @include exports("well") { 16 | 17 | /** 18 | * well 19 | * -------------------------------------------------- 20 | */ 21 | 22 | .well { 23 | padding: 10px; 24 | border: none; 25 | @include radius($type: border-radius, $value: $well-radius); 26 | color: $modal-font-color; 27 | background-color: $well-background-color; 28 | @include box-shadow($value: $well-shadow); 29 | 30 | & blockquote { 31 | border-color: $well-blockquote-color; 32 | } 33 | @at-root &-lg { 34 | padding: 20px; 35 | } 36 | @at-root &-sm { 37 | padding: 5px; 38 | } 39 | } 40 | 41 | } 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Bootflat", 3 | "homepage": "http://bootflat.github.io", 4 | "authors": [ 5 | "flathemes " 6 | ], 7 | "description": "BOOTFLAT is an open source Flat UI KIT based on Bootstrap 3.3.0 CSS framework. It provides a faster, easier and less repetitive way for web developers to create elegant web apps.", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/bootflat/bootflat.github.io.git" 11 | }, 12 | "main": [ 13 | "bootflat/css/*", 14 | "bootflat/scss/*", 15 | "bootflat/fonts/*", 16 | "bootflat/js/*", 17 | "bootflat/img/*" 18 | ], 19 | "keywords": [ 20 | "mobile", 21 | "html5", 22 | "css3", 23 | "scss", 24 | "bootflat", 25 | "bootstrap", 26 | "flat", 27 | "flat ui", 28 | "ui" 29 | ], 30 | "license": "MIT", 31 | "ignore": [ 32 | "**/.*", 33 | "node_modules", 34 | "bower_components", 35 | "angularicons", 36 | "free-psd.html", 37 | "documentation.html", 38 | "getting-started.html", 39 | "index.html", 40 | "test", 41 | "tests" 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootflat/bootflat", 3 | "description": "An open source Flat UI KIT based on Bootstrap (3.3.0). A faster, easier and less repetitive way for web developers to create elegant web apps.", 4 | "version": "2.0.4", 5 | "keywords": [ 6 | "mobile", 7 | "html5", 8 | "css3", 9 | "scss", 10 | "bootflat", 11 | "bootstrap", 12 | "flat", 13 | "flat ui", 14 | "ui" 15 | ], 16 | "homepage": "http://bootflat.github.io/", 17 | "authors": [ 18 | { 19 | "name": "Bootflat", 20 | "email": "info@flathemes.com" 21 | } 22 | ], 23 | "support": { 24 | "issues": "https://github.com/bootflat/bootflat.github.io/issues" 25 | }, 26 | "license": "MIT" 27 | } 28 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/favicon_16.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/favicon_16.ico -------------------------------------------------------------------------------- /app/static/temp/bootflat/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /app/static/temp/bootflat/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /app/static/temp/bootflat/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /app/static/temp/bootflat/google45b338b882fada75.html: -------------------------------------------------------------------------------- 1 | google-site-verification: google45b338b882fada75.html -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/Jumbotron.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/Jumbotron.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/ascii-logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/ascii-logo.gif -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/bootflat-ui-kit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/bootflat-ui-kit.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/design.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/divider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/divider.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/fast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/fast.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/feature-bootstrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/feature-bootstrap.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/feature-css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/feature-css.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/feature-lightweight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/feature-lightweight.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/feature-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/feature-mobile.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/footer-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/footer-logo.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/github.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/index.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/logo-index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/logo-index.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/logo.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/photo-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/photo-1.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/photo-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/photo-2.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/photo-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/photo-3.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/photo-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/photo-4.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/prototyping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/prototyping.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/share.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/share.gif -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/slider1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/slider1.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/slider2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/slider2.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/slider3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/slider3.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/thumbnail-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/thumbnail-1.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/thumbnail-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/thumbnail-2.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/thumbnail-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/thumbnail-3.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/thumbnail-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/thumbnail-4.jpg -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/together.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/together.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/img/wild_flowers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/bootflat/img/wild_flowers.png -------------------------------------------------------------------------------- /app/static/temp/bootflat/js/application.js: -------------------------------------------------------------------------------- 1 | // NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT 2 | // IT'S ALL JUST JUNK FOR OUR DOCS! 3 | // ++++++++++++++++++++++++++++++++++++++++++ 4 | 5 | !function ($) { 6 | $(function(){ 7 | 8 | $('.tooltip-demo').tooltip({ 9 | selector: "[data-toggle=tooltip]", 10 | container: "body" 11 | }); 12 | 13 | $("input[type='number']").stepper(); 14 | 15 | $(".selecter_1").selecter(); 16 | 17 | $(".selecter_2").selecter(); 18 | 19 | $(".selecter_3").selecter(); 20 | 21 | $(".selecter_4").selecter(); 22 | 23 | $(".selecter_5").selecter(); 24 | 25 | $(".selecter_6").selecter(); 26 | 27 | $('.checkbox input').iCheck({ 28 | checkboxClass: 'icheckbox_flat', 29 | increaseArea: '20%' 30 | }); 31 | 32 | $('.radio input').iCheck({ 33 | radioClass: 'iradio_flat', 34 | increaseArea: '20%' 35 | }); 36 | $('#accordion1').collapse(); 37 | $('#accordion2').collapse(); 38 | }) 39 | }(window.jQuery) 40 | -------------------------------------------------------------------------------- /app/static/temp/bootflat/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootflat", 3 | "private": false, 4 | "version": "2.0.4", 5 | "description": "BOOTFLAT is an open source Flat UI KIT based on Bootstrap 3.3.0 CSS framework. It provides a faster, easier and less repetitive way for web developers to create elegant web apps.", 6 | "author": "Flathemes ", 7 | "homepage": "http://bootflat.github.com/", 8 | "keywords": [ 9 | "mobile", 10 | "html5", 11 | "css3", 12 | "scss", 13 | "bootflat", 14 | "bootstrap", 15 | "flat", 16 | "flat ui", 17 | "ui" 18 | ], 19 | "bugs": { 20 | "url": "https://github.com/bootflat/bootflat.github.io/issues" 21 | }, 22 | "license": "MIT", 23 | "repository": { 24 | "type": "git", 25 | "url": "https://github.com/bootflat/bootflat.github.io.git" 26 | }, 27 | "devDependencies": { 28 | "grunt": "^0.4.5", 29 | "grunt-contrib-clean": "^0.6.0", 30 | "grunt-contrib-csslint": "^0.3.1", 31 | "grunt-contrib-cssmin": "~0.9.0", 32 | "grunt-contrib-htmlmin": "^0.3.0", 33 | "grunt-contrib-imagemin": "^0.9.2", 34 | "grunt-contrib-jshint": "^0.10.0", 35 | "grunt-contrib-sass": "~0.7.3", 36 | "grunt-contrib-uglify": "~0.4.0", 37 | "grunt-csscomb": "^3.0.0", 38 | "grunt-html-validation": "^0.1.18", 39 | "grunt-sed": "^0.1.1", 40 | "load-grunt-tasks": "^1.0.0", 41 | "time-grunt": "^1.0.0" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/static/temp/flat/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.py] 14 | indent_size = 4 -------------------------------------------------------------------------------- /app/static/temp/flat/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore docs files 2 | _gh_pages 3 | _site 4 | .ruby-version 5 | 6 | # Numerous always-ignore extensions 7 | *.diff 8 | *.err 9 | *.orig 10 | *.log 11 | *.rej 12 | *.swo 13 | *.swp 14 | *.zip 15 | *.vi 16 | *~ 17 | 18 | # OS or Editor folders 19 | .DS_Store 20 | ._* 21 | Thumbs.db 22 | .cache 23 | .project 24 | .settings 25 | .tmproj 26 | *.esproj 27 | nbproject 28 | *.sublime-project 29 | *.sublime-workspace 30 | .idea 31 | .local 32 | ehthumbs.db 33 | Desktop.ini 34 | $RECYCLE.BIN/ 35 | .AppleDouble 36 | .LSOverride 37 | Icon 38 | .Spotlight-V100 39 | .Trashes 40 | node_server.js 41 | 42 | # Komodo 43 | *.komodoproject 44 | .komodotools 45 | 46 | 47 | # Folders to ignore 48 | node_modules 49 | bower_components 50 | -------------------------------------------------------------------------------- /app/static/temp/flat/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013-2016 Designmodo 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a 4 | copy of this software and associated documentation files (the "Software"), 5 | to deal in the Software without restriction, including without limitation 6 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 7 | and/or sell copies of the Software, and to permit persons to whom the 8 | Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 14 | OR 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 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19 | DEALINGS IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /app/static/temp/flat/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flat-ui", 3 | "main": [ 4 | "less/flat-ui.less", 5 | "dist/css/flat-ui.css", 6 | "dist/js/flat-ui.js", 7 | "dist/fonts/glyphicons/flat-ui-icons-regular.eot", 8 | "dist/fonts/glyphicons/flat-ui-icons-regular.svg", 9 | "dist/fonts/glyphicons/flat-ui-icons-regular.ttf", 10 | "dist/fonts/glyphicons/flat-ui-icons-regular.woff" 11 | ], 12 | "ignore": [ 13 | ".*" 14 | ], 15 | "devDependencies": { 16 | "jquery": "~1.11.1", 17 | "jquery-ui": "~1.10.4", 18 | "bootstrap": "~3.2.0", 19 | "bootstrap-switch": "~3.0.2", 20 | "holderjs": "~2.4.0", 21 | "html5shiv": "~3.7.2", 22 | "jquery-ui-touch-punch": "*", 23 | "respond": "~1.4.2", 24 | "typeahead.js": "~0.10.5", 25 | "google-code-prettify": "~1.0.3", 26 | "bootstrap-tagsinput": "~0.4.2", 27 | "select2": "~3.5.1" 28 | }, 29 | "dependencies": { 30 | "videojs": "~4.7.2" 31 | }, 32 | "resolutions": { 33 | "jquery": "~1.11.1" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/static/temp/flat/css/mixins.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/css/mixins.css -------------------------------------------------------------------------------- /app/static/temp/flat/css/variables.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/css/variables.css -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/css/css/prettyprint.css: -------------------------------------------------------------------------------- 1 | /* Prettyfy Theme */ 2 | .prettyprint { 3 | background-color: #F7F7F9; 4 | font-family: Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, Consolas, monospace; 5 | border: 2px solid #E1E1E8; 6 | padding: 15px 21px; 7 | } 8 | .pln { 9 | color: #333333; 10 | } 11 | @media screen { 12 | .str { 13 | color: #dd1144; 14 | } 15 | .kwd { 16 | color: #333333; 17 | } 18 | .com { 19 | color: #999988; 20 | } 21 | .typ { 22 | color: #445588; 23 | } 24 | .lit { 25 | color: #445588; 26 | } 27 | .pun { 28 | color: #333333; 29 | } 30 | .opn { 31 | color: #333333; 32 | } 33 | .clo { 34 | color: #333333; 35 | } 36 | .tag { 37 | color: navy; 38 | } 39 | .atn { 40 | color: teal; 41 | } 42 | .atv { 43 | color: #dd1144; 44 | } 45 | .dec { 46 | color: #333333; 47 | } 48 | .var { 49 | color: teal; 50 | } 51 | .fun { 52 | color: #990000; 53 | } 54 | } 55 | @media print, projection { 56 | .str { 57 | color: #006600; 58 | } 59 | .kwd { 60 | color: #006; 61 | font-weight: bold; 62 | } 63 | .com { 64 | color: #600; 65 | font-style: italic; 66 | } 67 | .typ { 68 | color: #404; 69 | font-weight: bold; 70 | } 71 | .lit { 72 | color: #004444; 73 | } 74 | .pun, 75 | .opn, 76 | .clo { 77 | color: #444400; 78 | } 79 | .tag { 80 | color: #006; 81 | font-weight: bold; 82 | } 83 | .atn { 84 | color: #440044; 85 | } 86 | .atv { 87 | color: #006600; 88 | } 89 | } 90 | /* Specify class=linenums on a pre to get line numbering */ 91 | ol.linenums { 92 | margin-top: 0; 93 | margin-bottom: 0; 94 | } 95 | -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/css/src/prettyprint.less: -------------------------------------------------------------------------------- 1 | /* Prettyfy Theme */ 2 | .prettyprint { 3 | background-color: #F7F7F9; 4 | font-family: Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, Consolas, monospace; 5 | border: 2px solid #E1E1E8; 6 | padding: 15px 21px; 7 | } 8 | 9 | .pln { 10 | color: #333333; 11 | } 12 | 13 | @media screen { 14 | .str { 15 | color: #dd1144; 16 | } 17 | 18 | .kwd { 19 | color: #333333; 20 | } 21 | 22 | .com { 23 | color: #999988; 24 | } 25 | 26 | .typ { 27 | color: #445588; 28 | } 29 | 30 | .lit { 31 | color: #445588; 32 | } 33 | 34 | .pun { 35 | color: #333333; 36 | } 37 | 38 | .opn { 39 | color: #333333; 40 | } 41 | 42 | .clo { 43 | color: #333333; 44 | } 45 | 46 | .tag { 47 | color: navy; 48 | } 49 | 50 | .atn { 51 | color: teal; 52 | } 53 | 54 | .atv { 55 | color: #dd1144; 56 | } 57 | 58 | .dec { 59 | color: #333333; 60 | } 61 | 62 | .var { 63 | color: teal; 64 | } 65 | 66 | .fun { 67 | color: #990000; 68 | } 69 | } 70 | @media print, projection { 71 | .str { 72 | color: #006600; 73 | } 74 | 75 | .kwd { 76 | color: #006; 77 | font-weight: bold; 78 | } 79 | 80 | .com { 81 | color: #600; 82 | font-style: italic; 83 | } 84 | 85 | .typ { 86 | color: #404; 87 | font-weight: bold; 88 | } 89 | 90 | .lit { 91 | color: #004444; 92 | } 93 | 94 | .pun, .opn, .clo { 95 | color: #444400; 96 | } 97 | 98 | .tag { 99 | color: #006; 100 | font-weight: bold; 101 | } 102 | 103 | .atn { 104 | color: #440044; 105 | } 106 | 107 | .atv { 108 | color: #006600; 109 | } 110 | } 111 | /* Specify class=linenums on a pre to get line numbering */ 112 | ol.linenums { 113 | margin-top: 0; 114 | margin-bottom: 0; 115 | } 116 | -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-2x.png -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-author.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-author.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-pic-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-pic-1.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-pic-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-pic-2.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-pic-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-pic-3.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-pic-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-pic-4.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-pic-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-pic-5.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser-pic-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser-pic-6.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/browser.png -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/html-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/html-icon.png -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/logo-mask-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/logo-mask-2x.png -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/logo-mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/logo-mask.png -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/demo/video.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/demo/video.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/example-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/example-image.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/footer/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/footer/logo.png -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/getting-started/icomoon_import.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/getting-started/icomoon_import.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/assets/img/video/poster.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/docs/assets/img/video/poster.jpg -------------------------------------------------------------------------------- /app/static/temp/flat/docs/examples/vertical-slider.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Flat UI Free 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 |
24 |

Vertical Slider

25 |
26 |
27 |
28 |
29 |
30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/static/temp/flat/docs/template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Flat UI Free 101 Template 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 |
24 |

Hello, world!

25 |
26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/glyphicons/flat-ui-icons-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/glyphicons/flat-ui-icons-regular.eot -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/glyphicons/flat-ui-icons-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/glyphicons/flat-ui-icons-regular.ttf -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/glyphicons/flat-ui-icons-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/glyphicons/flat-ui-icons-regular.woff -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-black.eot -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-black.ttf -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-black.woff -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-bold.eot -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-bold.ttf -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-bold.woff -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-bolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-bolditalic.eot -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-bolditalic.ttf -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-bolditalic.woff -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-italic.eot -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-italic.ttf -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-italic.woff -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-light.eot -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-light.ttf -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-light.woff -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-regular.eot -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-regular.ttf -------------------------------------------------------------------------------- /app/static/temp/flat/fonts/lato/lato-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/fonts/lato/lato-regular.woff -------------------------------------------------------------------------------- /app/static/temp/flat/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/favicon.ico -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Book.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Calendar.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Chat.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Clipboard.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Compas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Compas.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Gift-Box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Gift-Box.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Infinity-Loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Infinity-Loop.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Mail.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Map.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Pensils.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Pensils.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Pocket.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Retina-Ready.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Retina-Ready.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Toilet-Paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Toilet-Paper.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/png/Watches.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/icons/png/Watches.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/book.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/chat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/clocks.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/loop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/mail.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/map.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/paper-bag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/pencils.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/retina.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/icons/svg/toilet-paper.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/temp/flat/img/login/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/login/icon.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/login/imac-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/login/imac-2x.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/login/imac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/login/imac.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/tile/ribbon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/tile/ribbon-2x.png -------------------------------------------------------------------------------- /app/static/temp/flat/img/tile/ribbon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/img/tile/ribbon.png -------------------------------------------------------------------------------- /app/static/temp/flat/index.js: -------------------------------------------------------------------------------- 1 | // You can require() this file in a CommonJS environment. 2 | require('./dist/js/flat-ui.js'); 3 | -------------------------------------------------------------------------------- /app/static/temp/flat/js/.jscs.json: -------------------------------------------------------------------------------- 1 | { 2 | "disallowEmptyBlocks": true, 3 | "disallowKeywords": ["with"], 4 | "disallowMixedSpacesAndTabs": true, 5 | "disallowMultipleLineStrings": true, 6 | "disallowMultipleVarDecl": true, 7 | "disallowQuotedKeysInObjects": "allButReserved", 8 | "disallowSpaceAfterPrefixUnaryOperators": ["!"], 9 | "disallowSpaceBeforeBinaryOperators": [","], 10 | "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], 11 | "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], 12 | "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true }, 13 | "disallowSpacesInsideArrayBrackets": true, 14 | "disallowSpacesInsideParentheses": true, 15 | "disallowTrailingComma": true, 16 | "requireCamelCaseOrUpperCaseIdentifiers": true, 17 | "requireCapitalizedConstructors": true, 18 | "requireCommaBeforeLineBreak": true, 19 | "requireDotNotation": true, 20 | "requireLineFeedAtFileEnd": true, 21 | "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], 22 | "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], 23 | "requireSpaceAfterLineComment": true, 24 | "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], 25 | "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true }, 26 | "requireSpacesInConditionalExpression": true, 27 | "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true }, 28 | "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true }, 29 | "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true }, 30 | "requireSpacesInsideObjectBrackets": "allButNested", 31 | "validateIndentation": 2, 32 | "validateQuoteMarks": "'" 33 | } -------------------------------------------------------------------------------- /app/static/temp/flat/js/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "asi" : false, 3 | "boss" : true, 4 | "browser" : true, 5 | "curly" : true, 6 | "debug" : true, 7 | "devel" : true, 8 | "eqeqeq" : false, 9 | "eqnull" : true, 10 | "expr" : true, 11 | "laxbreak" : true, 12 | "quotmark" : "single", 13 | "validthis": true 14 | } -------------------------------------------------------------------------------- /app/static/temp/flat/less/.csslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "adjoining-classes": false, 3 | "box-sizing": false, 4 | "box-model": false, 5 | "compatible-vendor-prefixes": false, 6 | "floats": false, 7 | "font-sizes": false, 8 | "gradients": false, 9 | "important": false, 10 | "known-properties": false, 11 | "outline-none": false, 12 | "qualified-headings": false, 13 | "regex-selectors": false, 14 | "shorthand": false, 15 | "text-indent": false, 16 | "unique-headings": false, 17 | "universal-selector": false, 18 | "unqualified-attributes": false, 19 | 20 | "fallback-colors": false, 21 | "font-faces": false 22 | } 23 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/background-clip.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/background-clip.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/background-variant.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/background-variant.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/border-radius.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/border-radius.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/buttons.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/buttons.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/center-block.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/center-block.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/clearfix.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/clearfix.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/forms.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/forms.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/gradients.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/gradients.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/grid.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/grid.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/hide-text.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/hide-text.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/image.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/image.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/nav-divider.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/nav-divider.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/navbar-vertical-align.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/navbar-vertical-align.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/opacity.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/opacity.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/pagination.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/pagination.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/pallets.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/pallets.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/print.css: -------------------------------------------------------------------------------- 1 | /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ 2 | @media print { 3 | .btn { 4 | border-style: solid; 5 | border-width: 2px; 6 | } 7 | .dropdown-menu { 8 | background: #fff !important; 9 | border: 2px solid #ddd; 10 | } 11 | .input-group-rounded .input-group-btn + .form-control, 12 | .input-group-rounded .input-group-btn + .select2-search input[type="text"] { 13 | padding-left: 10px; 14 | } 15 | .form-control { 16 | border: 2px solid #ddd !important; 17 | } 18 | .bootstrap-switch { 19 | height: 33px; 20 | width: 84px; 21 | border: 2px solid #bdc3c7; 22 | } 23 | .tooltip { 24 | border: 2px solid #bdc3c7; 25 | } 26 | .progress, 27 | .ui-slider { 28 | background: #ddd !important; 29 | } 30 | .progress-bar, 31 | .ui-slider-range, 32 | .ui-slider-handle { 33 | background: #bdc3c7 !important; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/reset-filter.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/reset-filter.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/resize.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/resize.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/responsive-visibility.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/responsive-visibility.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/select.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/select.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/size.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/size.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/switches.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/switches.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/tab-focus.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/tab-focus.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/text-emphasis.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/text-emphasis.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/text-overflow.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/text-overflow.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/css/vendor-prefixes.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/flat/less/css/vendor-prefixes.css -------------------------------------------------------------------------------- /app/static/temp/flat/less/flat-ui.less: -------------------------------------------------------------------------------- 1 | // 2 | // Flat UI main stylesheet that aggregates all modules 3 | // -------------------------------------------------- 4 | 5 | // Loading config with variables (changing them leads to changing a color scheme) 6 | @import "variables"; 7 | 8 | // Utility mixins for greater good 9 | @import "mixins"; 10 | 11 | // Loading custom fonts 12 | //@import url("https://fonts.googleapis.com/css?family=Lato:400,700,700italic,900,400italic,300"); 13 | @import "modules/local-fonts"; 14 | @import "modules/glyphicons"; 15 | 16 | // Modules 17 | @import "modules/scaffolding"; 18 | @import "modules/type"; 19 | @import "modules/code"; 20 | @import "modules/thumbnails"; 21 | @import "modules/buttons"; 22 | @import "modules/button-groups"; 23 | @import "modules/forms"; 24 | @import "modules/input-groups"; 25 | @import "modules/radiocheck"; 26 | @import "modules/tagsinput"; 27 | @import "modules/typeahead"; 28 | @import "modules/progress-bars"; 29 | @import "modules/slider"; 30 | @import "modules/pager"; 31 | @import "modules/pagination"; 32 | @import "modules/tooltip"; 33 | @import "modules/dropdowns"; 34 | @import "modules/select"; 35 | @import "modules/tiles"; 36 | @import "modules/navbar"; 37 | @import "modules/switch"; 38 | @import "modules/share"; 39 | @import "modules/video"; 40 | @import "modules/todo-list"; 41 | 42 | // Examples 43 | @import "modules/palette"; 44 | @import "modules/login"; 45 | @import "modules/footer"; 46 | 47 | // Spaces 48 | @import "spaces"; 49 | 50 | //Print styles 51 | @import "modules/print"; 52 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------------------------------- 3 | 4 | // Utilities 5 | @import "mixins/hide-text.less"; 6 | @import "mixins/opacity.less"; 7 | @import "mixins/image.less"; 8 | @import "mixins/reset-filter.less"; 9 | @import "mixins/resize.less"; 10 | @import "mixins/responsive-visibility.less"; 11 | @import "mixins/size.less"; 12 | @import "mixins/tab-focus.less"; 13 | @import "mixins/text-emphasis.less"; 14 | @import "mixins/text-overflow.less"; 15 | @import "mixins/vendor-prefixes.less"; 16 | @import "mixins/background-clip.less"; 17 | 18 | // Components 19 | @import "mixins/buttons.less"; 20 | @import "mixins/select.less"; 21 | @import "mixins/pagination.less"; 22 | @import "mixins/nav-divider.less"; 23 | @import "mixins/forms.less"; 24 | @import "mixins/switches.less"; 25 | @import "mixins/pallets.less"; 26 | 27 | // Skins 28 | @import "mixins/background-variant.less"; 29 | @import "mixins/border-radius.less"; 30 | @import "mixins/gradients.less"; 31 | 32 | // Layout 33 | @import "mixins/clearfix.less"; 34 | @import "mixins/center-block.less"; 35 | @import "mixins/navbar-vertical-align.less"; 36 | @import "mixins/grid.less"; 37 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/background-clip.less: -------------------------------------------------------------------------------- 1 | // Background clip 2 | .background-clip(@clip: border-box) { 3 | -webkit-background-clip: @clip; 4 | -moz-background-clip: @clip; 5 | background-clip: @clip; 6 | } -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/background-variant.less: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | .bg-variant(@color) { 4 | background-color: @color; 5 | a&:hover { 6 | background-color: darken(@color, 10%); 7 | } 8 | } -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/border-radius.less: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | .border-top-radius(@radius) { 4 | border-top-right-radius: @radius; 5 | border-top-left-radius: @radius; 6 | } 7 | .border-right-radius(@radius) { 8 | border-bottom-right-radius: @radius; 9 | border-top-right-radius: @radius; 10 | } 11 | .border-bottom-radius(@radius) { 12 | border-bottom-right-radius: @radius; 13 | border-bottom-left-radius: @radius; 14 | } 15 | .border-left-radius(@radius) { 16 | border-bottom-left-radius: @radius; 17 | border-top-left-radius: @radius; 18 | } 19 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/buttons.less: -------------------------------------------------------------------------------- 1 | // Button variants 2 | // 3 | .button-variant(@color; @background; @hover-background; @active-background; @disabled-background: @gray-light) { 4 | color: @color; 5 | background-color: @background; 6 | 7 | &:hover, 8 | &.hover, 9 | &:focus, 10 | &:active, 11 | &.active, 12 | .open > .dropdown-toggle& { 13 | color: @color; 14 | background-color: @hover-background; 15 | border-color: @hover-background; 16 | } 17 | &:active, 18 | &.active, 19 | .open > .dropdown-toggle& { 20 | background: @active-background; 21 | border-color: @active-background; 22 | } 23 | &.disabled, 24 | &[disabled], 25 | fieldset[disabled] & { 26 | &, 27 | &:hover, 28 | &.hover, 29 | &:focus, 30 | &:active, 31 | &.active { 32 | background-color: @disabled-background; 33 | border-color: @background; 34 | } 35 | } 36 | 37 | .badge { 38 | color: @background; 39 | background-color: @inverse; 40 | } 41 | } 42 | 43 | // Button sizes 44 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 45 | padding: @padding-vertical @padding-horizontal; 46 | font-size: @font-size; 47 | line-height: @line-height; 48 | border-radius: @border-radius; 49 | } 50 | 51 | // Social button variants 52 | .social-button-variant(@color; @background) { 53 | color: @color; 54 | background-color: @background; 55 | 56 | &:hover, 57 | &:focus { 58 | background-color: mix(@background, white, 80%); 59 | } 60 | &:active, 61 | &.active { 62 | background-color: mix(@background, black, 85%); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/center-block.less: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | .center-block() { 4 | display: block; 5 | margin-left: auto; 6 | margin-right: auto; 7 | } 8 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/clearfix.less: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | .clearfix() { 14 | &:before, 15 | &:after { 16 | content: " "; // 1 17 | display: table; // 2 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/hide-text.less: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | // 3 | // Heads up! v3 launched with with only `.hide-text()`, but per our pattern for 4 | // mixins being reused as classes with the same name, this doesn't hold up. As 5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. 6 | // 7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 8 | 9 | // Deprecated as of v3.0.1 (will be removed in v4) 10 | .hide-text() { 11 | font: ~"0/0" a; 12 | color: transparent; 13 | text-shadow: none; 14 | background-color: transparent; 15 | border: 0; 16 | } 17 | 18 | // New mixin to use as of v3.0.1 19 | .text-hide() { 20 | .hide-text(); 21 | } 22 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/image.less: -------------------------------------------------------------------------------- 1 | // Image Mixins 2 | // - Responsive image 3 | // - Retina image 4 | 5 | 6 | // Responsive image 7 | // 8 | // Keep images from scaling beyond the width of their parents. 9 | .img-responsive(@display: block) { 10 | display: @display; 11 | max-width: 100%; // Part 1: Set a maximum relative to the parent 12 | height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching 13 | } 14 | 15 | 16 | // Retina image 17 | // 18 | // Short retina mixin for setting background-image and -size. Note that the 19 | // spelling of `min--moz-device-pixel-ratio` is intentional. 20 | .img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { 21 | background-image: url("@{file-1x}"); 22 | 23 | @media 24 | only screen and (-webkit-min-device-pixel-ratio: 2), 25 | only screen and ( min--moz-device-pixel-ratio: 2), 26 | only screen and ( -o-min-device-pixel-ratio: 2/1), 27 | only screen and ( min-device-pixel-ratio: 2), 28 | only screen and ( min-resolution: 192dpi), 29 | only screen and ( min-resolution: 2dppx) { 30 | background-image: url("@{file-2x}"); 31 | background-size: @width-1x @height-1x; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/nav-divider.less: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | .nav-divider(@color: #e5e5e5) { 6 | height: 2px; 7 | margin: 3px 0; 8 | overflow: hidden; 9 | background-color: @color; 10 | } 11 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/navbar-vertical-align.less: -------------------------------------------------------------------------------- 1 | // Navbar vertical align 2 | // ------------------------- 3 | // Vertically center elements in the navbar. 4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. 5 | 6 | .navbar-vertical-align(@element-height; @navbar-height: @navbar-height-base) { 7 | padding-top: ((@navbar-height - @element-height) / 2); 8 | padding-bottom: ((@navbar-height - @element-height) / 2); 9 | } 10 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/opacity.less: -------------------------------------------------------------------------------- 1 | // Opacity 2 | 3 | .opacity(@opacity) { 4 | opacity: @opacity; 5 | // IE8 filter 6 | @opacity-ie: (@opacity * 100); 7 | filter: ~"alpha(opacity=@{opacity-ie})"; 8 | } 9 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/pagination.less: -------------------------------------------------------------------------------- 1 | // Pagination variants 2 | 3 | .pagination-variant(@color, @hover, @active) { 4 | & { 5 | background-color: @color; 6 | 7 | li { 8 | &.previous { 9 | > a { 10 | border-right-color: mix(@color, white, 66%); 11 | } 12 | } 13 | > a, > span { 14 | border-left-color: mix(@color, white, 66%); 15 | 16 | &:hover, &:focus { 17 | border-left-color: mix(@color, white, 66%); 18 | background-color: @hover; 19 | } 20 | &:active { 21 | background-color: @active; 22 | } 23 | } 24 | &.active { 25 | > a, > span { 26 | background-color: @active; 27 | 28 | &:hover, &:focus { 29 | border-left-color: mix(@color, white, 66%); 30 | background-color: @hover; 31 | } 32 | } 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/pallets.less: -------------------------------------------------------------------------------- 1 | // Pallet color variants 2 | // 3 | 4 | .pallet-variant(@first-color, @second-color) { 5 | .palette-@{first-color} { 6 | background-color: ~"@{@{first-color}}"; 7 | } 8 | .palette-@{second-color} { 9 | background-color: ~"@{@{second-color}}"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/reset-filter.less: -------------------------------------------------------------------------------- 1 | // Reset filters for IE 2 | // 3 | // When you need to remove a gradient background, do not forget to use this to reset 4 | // the IE filter for IE9 and below. 5 | 6 | .reset-filter() { 7 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); 8 | } 9 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/resize.less: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | .resizable(@direction) { 4 | resize: @direction; // Options: horizontal, vertical, both 5 | overflow: auto; // Safari fix 6 | } 7 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/responsive-visibility.less: -------------------------------------------------------------------------------- 1 | // Responsive utilities 2 | 3 | // 4 | // More easily include all the states for responsive-utilities.less. 5 | .responsive-visibility() { 6 | display: block !important; 7 | table& { display: table; } 8 | tr& { display: table-row !important; } 9 | th&, 10 | td& { display: table-cell !important; } 11 | } 12 | 13 | .responsive-invisibility() { 14 | display: none !important; 15 | } 16 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/select.less: -------------------------------------------------------------------------------- 1 | // Select variants 2 | // 3 | 4 | .select-variant(@color; @background; @hover-background; @active-background; @disabled-background: @gray-light; @arrow-color) { 5 | .select2-choice { 6 | color: @color; 7 | background-color: @background; 8 | 9 | &:hover, 10 | &.hover, 11 | &:focus, 12 | &:active { 13 | color: @color; 14 | background-color: @hover-background; 15 | border-color: @hover-background; 16 | } 17 | &:active { 18 | background: @active-background; 19 | border-color: @active-background; 20 | } 21 | .select2-container-disabled& { 22 | &, 23 | &:hover, 24 | &:focus, 25 | &:active { 26 | background-color: @disabled-background; 27 | border-color: @background; 28 | } 29 | } 30 | 31 | .select2-arrow { 32 | border-top-color: @arrow-color; 33 | } 34 | } 35 | } 36 | 37 | .select-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 38 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius); 39 | padding-right: (@padding-horizontal * 2 + 9px); 40 | min-height: round((@line-height*@font-size + 2*@padding-vertical)); // we need min-height for empty ones 41 | } 42 | 43 | .multiple-select-variant(@background; @hover-background; @border-color) { 44 | .select2-container-multi& { 45 | border-color: @border-color; 46 | 47 | .select2-search-choice { 48 | background-color: @background; 49 | 50 | &:hover { 51 | background-color: @hover-background; 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/size.less: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | .size(@width; @height) { 4 | width: @width; 5 | height: @height; 6 | } 7 | 8 | .square(@size) { 9 | .size(@size; @size); 10 | } 11 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/switches.less: -------------------------------------------------------------------------------- 1 | // Switch variants 2 | 3 | .switch-variant(@handle-color, @handle-bg, @label-border, @label-bg) { 4 | color: @handle-color; 5 | background-color: @handle-bg; 6 | 7 | // second handler "label" 8 | ~ .@{switch-name}-handle-off:before { 9 | background-color: @label-bg; 10 | border-color: @label-border; 11 | } 12 | 13 | // second handler inset shadow 14 | .@{switch-name}-on & { 15 | ~ .@{switch-name}-handle-off { 16 | box-shadow: inset 16px 0 0 @handle-bg; 17 | } 18 | } 19 | } 20 | 21 | // Switch handle-off variant 22 | .switch-handle-off-variant(@handle-name, @handle-border, @handle-bg) { 23 | // second heandler outset shadow 24 | & ~ .@{switch-name}-handle-off.@{switch-name}-@{handle-name} { 25 | box-shadow: ~"inset 0 0 transparent, -16px 0 0 @{handle-border}"; 26 | } 27 | // second heandler "label" 28 | ~ .@{switch-name}-handle-off.@{switch-name}-@{handle-name}:before { 29 | border-color: @handle-border; 30 | background-color: @handle-bg; 31 | } 32 | } -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/tab-focus.less: -------------------------------------------------------------------------------- 1 | // WebKit-style focus 2 | 3 | .tab-focus() { 4 | // Default 5 | outline: thin dotted; 6 | // WebKit 7 | outline: 5px auto -webkit-focus-ring-color; 8 | outline-offset: -2px; 9 | } 10 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/text-emphasis.less: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | .text-emphasis-variant(@color) { 4 | color: @color; 5 | a&:hover { 6 | color: darken(@color, 10%); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/mixins/text-overflow.less: -------------------------------------------------------------------------------- 1 | // Text overflow 2 | // Requires inline-block or block for proper styling 3 | 4 | .text-overflow() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and blocK) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 6px; 17 | font-size: 85%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | border-radius: @border-radius-base; 21 | } 22 | 23 | // User input typically entered via keyboard 24 | kbd { 25 | padding: 2px 6px; 26 | font-size: 85%; 27 | color: @kbd-color; 28 | background-color: @kbd-bg; 29 | border-radius: @border-radius-base; 30 | box-shadow: none; 31 | } 32 | 33 | // Blocks of code 34 | pre { 35 | padding: ((@line-height-computed - 6) / 3); 36 | margin: 0 0 (@line-height-computed / 2); 37 | font-size: (@font-size-base - 5); // 18px to 13px 38 | line-height: @line-height-base; 39 | color: @pre-color; 40 | background-color: @pre-bg; 41 | border: 2px solid @pre-border-color; 42 | border-radius: @pre-border-radius; 43 | white-space: pre; 44 | } 45 | 46 | // Enable scrollable blocks of code 47 | .pre-scrollable { 48 | max-height: @pre-scrollable-max-height; 49 | } -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/footer.less: -------------------------------------------------------------------------------- 1 | // 2 | // Footer 3 | // -------------------------------------------------- 4 | 5 | footer { 6 | background-color: mix(@brand-primary, @inverse, 9%); 7 | color: mix(@brand-primary, @inverse, 34%); 8 | font-size: 15px; 9 | padding: 0; 10 | 11 | a { 12 | color: mix(@brand-primary, @inverse, 50%); 13 | font-weight: 700; 14 | } 15 | p { 16 | font-size: 15px; 17 | line-height: 20px; 18 | margin-bottom: 10px; 19 | } 20 | } 21 | 22 | .footer-title { 23 | margin: 0 0 22px; 24 | padding-top: 21px; 25 | font-size: 24px; 26 | line-height: 40px; 27 | } 28 | 29 | .footer-brand { 30 | display: block; 31 | margin-bottom: 26px; 32 | width: 220px; 33 | 34 | img { 35 | width: 216px; 36 | } 37 | } 38 | 39 | // Footer banner 40 | .footer-banner { 41 | background-color: @brand-secondary; 42 | color: mix(@brand-secondary, @inverse, 20%); 43 | margin-left: 42px; 44 | min-height: 316px; 45 | padding: 0 30px 30px; 46 | 47 | .footer-title { 48 | color: @inverse; 49 | } 50 | a { 51 | color: lighten(@brand-secondary, 42%); 52 | text-decoration: underline; 53 | 54 | &:hover { 55 | text-decoration: none; 56 | } 57 | } 58 | ul { 59 | list-style-type: none; 60 | margin: 0 0 26px; 61 | padding: 0; 62 | 63 | li { 64 | border-top: 1px solid lighten(@brand-secondary, 2%); 65 | line-height: 19px; 66 | padding: 6px 0; 67 | 68 | &:first-child { 69 | border-top: none; 70 | padding-top: 1px; 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager 3 | // -------------------------------------------------- 4 | 5 | .pager { 6 | background-color: @pager-bg; 7 | border-radius: @pager-border-radius; 8 | color: @pager-color; 9 | font-size: 16px; 10 | font-weight: 700; 11 | display: inline-block; 12 | 13 | li { 14 | &:first-child { 15 | > a, 16 | > span { 17 | border-left: none; 18 | border-radius: @pager-border-radius 0 0 @pager-border-radius; 19 | } 20 | } 21 | 22 | > a, 23 | > span { 24 | background: none; 25 | border: none; 26 | border-left: 2px solid mix(@brand-primary, black, 85%); 27 | color: @inverse; 28 | padding: @pager-padding; 29 | text-decoration: none; 30 | white-space: nowrap; 31 | border-radius: 0 @pager-border-radius @pager-border-radius 0; 32 | line-height: 1.313; 33 | 34 | &:hover, 35 | &:focus { 36 | background-color: @pager-hover-bg; 37 | } 38 | &:active { 39 | background-color: @pager-active-bg; 40 | } 41 | 42 | // Add some spacing between the icon and text 43 | [class*="fui-"] + span { 44 | margin-left: 8px; 45 | } 46 | span + [class*="fui-"] { 47 | margin-left: 8px; 48 | } 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/palette.less: -------------------------------------------------------------------------------- 1 | // 2 | // Palette 3 | // -------------------------------------------------- 4 | 5 | .pallete-item { 6 | width: 140px; 7 | float: left; 8 | margin: 0 0 20px 20px; 9 | } 10 | .palette { 11 | font-size: ceil((@component-font-size-base * 0.933)); // ~14px 12 | line-height: 1.214; // ~17px 13 | color: @inverse; 14 | margin: 0; 15 | padding: 15px; 16 | text-transform: uppercase; 17 | 18 | dt, 19 | dd { 20 | line-height: 1.429; 21 | } 22 | dt { 23 | display: block; 24 | font-weight: bold; 25 | opacity: .8; 26 | } 27 | dd { 28 | font-weight: 300; 29 | margin-left: 0; 30 | opacity: .8; 31 | -webkit-font-smoothing: subpixel-antialiased; 32 | } 33 | } 34 | 35 | // 36 | // Pallet grid 37 | // -------------------------------------------------- 38 | .pallet-variant(~"turquoise", ~"green-sea"); 39 | .pallet-variant(~"emerald", ~"nephritis"); 40 | .pallet-variant(~"peter-river", ~"belize-hole"); 41 | .pallet-variant(~"amethyst", ~"wisteria"); 42 | .pallet-variant(~"wet-asphalt", ~"midnight-blue"); 43 | 44 | .pallet-variant(~"sun-flower", ~"orange"); 45 | .pallet-variant(~"carrot", ~"pumpkin"); 46 | .pallet-variant(~"alizarin", ~"pomegranate"); 47 | .pallet-variant(~"clouds", ~"silver"); 48 | .pallet-variant(~"concrete", ~"asbestos"); 49 | 50 | .palette-clouds { 51 | color: #bdc3c7; 52 | } 53 | 54 | // Palette paragraph 55 | .palette-paragraph { 56 | color: #7f8c8d; 57 | font-size: 12px; 58 | line-height: 17px; 59 | 60 | span { 61 | color: #bdc3c7; 62 | } 63 | } 64 | 65 | // Headline 66 | .palette-headline { 67 | color: #7f8c8d; 68 | font-size: 13px; 69 | font-weight: 700; 70 | margin-top: -3px; 71 | } 72 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/print.less: -------------------------------------------------------------------------------- 1 | /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ 2 | 3 | // ========================================================================== 4 | // Print styles. 5 | // Inlined to avoid the additional HTTP request: h5bp.com/r 6 | // ========================================================================== 7 | 8 | @media print { 9 | .btn { 10 | border-style: solid; 11 | border-width: 2px; 12 | } 13 | .dropdown-menu { 14 | background: #fff !important; 15 | border: 2px solid #ddd; 16 | } 17 | .input-group-rounded .input-group-btn { 18 | & + .form-control, 19 | & + .select2-search input[type="text"] { 20 | padding-left: 10px; 21 | } 22 | } 23 | .form-control { 24 | border: 2px solid #ddd !important; 25 | } 26 | .bootstrap-switch { 27 | height: 33px; 28 | width: 84px; 29 | border: 2px solid #bdc3c7; 30 | } 31 | .tooltip { 32 | border: 2px solid #bdc3c7; 33 | } 34 | .progress, .ui-slider { 35 | background: #ddd !important; 36 | } 37 | .progress-bar, .ui-slider-range, .ui-slider-handle { 38 | background: #bdc3c7 !important; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/progress-bars.less: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | // Outer container 6 | .progress { 7 | background: mix(@brand-primary, white, 10%); 8 | border-radius: 32px; 9 | height: @progress-height; 10 | box-shadow: none; 11 | } 12 | 13 | // Bar of progress 14 | .progress-bar { 15 | background: @brand-secondary; 16 | line-height: @progress-height; 17 | box-shadow: none; 18 | } 19 | 20 | // Variations 21 | // ------------------------- 22 | 23 | .progress-bar-success { 24 | background-color: @brand-success; 25 | } 26 | .progress-bar-warning { 27 | background-color: @brand-warning; 28 | } 29 | .progress-bar-danger { 30 | background-color: @brand-danger; 31 | } 32 | .progress-bar-info { 33 | background-color: @brand-info; 34 | } 35 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/scaffolding.less: -------------------------------------------------------------------------------- 1 | // 2 | // Scaffolding 3 | // -------------------------------------------------- 4 | 5 | 6 | // Body reset 7 | // ------------------------- 8 | 9 | body { 10 | font-family: @font-family-base; 11 | font-size: @font-size-base; 12 | line-height: @line-height-base; 13 | color: @text-color; 14 | background-color: @body-bg; 15 | } 16 | 17 | // Links 18 | // ------------------------- 19 | 20 | a { 21 | color: @link-color; 22 | text-decoration: none; 23 | transition: .25s; 24 | 25 | &:hover, 26 | &:focus { 27 | color: @link-hover-color; 28 | text-decoration: @link-hover-decoration; 29 | } 30 | &:focus { 31 | outline: none; 32 | } 33 | } 34 | 35 | // Images 36 | // ------------------------- 37 | 38 | // Rounded corners 39 | .img-rounded { 40 | border-radius: @border-radius-large; 41 | } 42 | 43 | // Image thumbnails 44 | // 45 | // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. 46 | .img-thumbnail { 47 | padding: @thumbnail-padding; 48 | line-height: @line-height-base; 49 | background-color: @thumbnail-bg; 50 | border: 2px solid @thumbnail-border; 51 | border-radius: @thumbnail-border-radius; 52 | transition: all .25s ease-in-out; 53 | 54 | // Keep them at most 100% wide 55 | .img-responsive(inline-block); 56 | } 57 | 58 | // Description text under image 59 | .img-comment { 60 | font-size: ceil((@font-size-base * 0.8333)); // ~15px 61 | line-height: 1.2; 62 | font-style: italic; 63 | margin: 24px 0; 64 | } -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/share.less: -------------------------------------------------------------------------------- 1 | // 2 | // Sharing box 3 | // -------------------------------------------------- 4 | 5 | // Module color variable 6 | @share-color: mix(@brand-primary, @inverse, 8%); 7 | 8 | .share { 9 | background-color: @share-color; 10 | position: relative; 11 | border-radius: @border-radius-large; 12 | 13 | ul { 14 | list-style-type: none; 15 | margin: 0; 16 | padding: 15px; 17 | } 18 | li { 19 | font-size: @component-font-size-base; 20 | line-height: 1.4; 21 | padding-top: 11px; 22 | .clearfix(); 23 | 24 | &:first-child { 25 | padding-top: 0; 26 | } 27 | } 28 | .toggle { 29 | float: right; 30 | margin: 0; 31 | } 32 | .btn { 33 | .border-top-radius(0); 34 | } 35 | } 36 | 37 | .share-label { 38 | float: left; 39 | font-size: 15px; 40 | line-height: 1.4; 41 | padding-top: 5px; 42 | width: 50%; 43 | } 44 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: @thumbnail-padding; 10 | margin-bottom: 5px; 11 | line-height: @line-height-base; 12 | background-color: @thumbnail-bg; 13 | border: 2px solid @thumbnail-border; 14 | border-radius: @thumbnail-border-radius; 15 | transition: border .25s ease-in-out; 16 | 17 | > img, 18 | a > img { 19 | .img-responsive(); 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // Add a hover state for linked versions only 25 | a&:hover, 26 | a&:focus, 27 | a&.active { 28 | border-color: @link-color; 29 | } 30 | 31 | // Image captions 32 | .caption { 33 | padding: @thumbnail-caption-padding; 34 | color: @thumbnail-caption-color; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/tiles.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tiles 3 | // ------------------------------------------------- 4 | 5 | .tile { 6 | background-color: @tiles-bg; 7 | border-radius: @tiles-border-radius; 8 | padding: 14px; 9 | margin-bottom: 20px; 10 | position: relative; 11 | text-align: center; 12 | 13 | .tile-hot-ribbon { 14 | display: block; 15 | position: absolute; 16 | right: -4px; 17 | top: -4px; 18 | width: 82px; 19 | } 20 | p { 21 | font-size: 15px; 22 | margin-bottom: 33px; 23 | } 24 | } 25 | .tile-image { 26 | height: 100px; 27 | margin: 31px 0 27px; 28 | vertical-align: bottom; 29 | 30 | &.big-illustration { 31 | height: 111px; 32 | margin-top: 20px; 33 | width: 112px; 34 | } 35 | } 36 | .tile-title { 37 | font-size: 20px; 38 | margin: 0; 39 | } 40 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/tooltip.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | // Base class 6 | .tooltip { 7 | font-size: ceil((@component-font-size-base * 0.933)); // ~14px 8 | line-height: 1.286; // 18px 9 | z-index: @zindex-tooltip; 10 | 11 | &.in { .opacity(@tooltip-opacity); } 12 | &.top { margin-top: -5px; padding: @tooltip-arrow-width 0; } 13 | &.right { margin-left: 5px; padding: 0 @tooltip-arrow-width; } 14 | &.bottom { margin-top: 5px; padding: @tooltip-arrow-width 0; } 15 | &.left { margin-left: -5px; padding: 0 @tooltip-arrow-width; } 16 | } 17 | 18 | // Wrapper for the tooltip content 19 | .tooltip-inner { 20 | max-width: @tooltip-max-width; 21 | line-height: 1.286; // 18px 22 | padding: 12px 12px; 23 | color: @tooltip-color; 24 | background-color: @tooltip-bg; 25 | border-radius: @border-radius-large; 26 | } 27 | 28 | // Arrows 29 | .tooltip { 30 | &.top .tooltip-arrow { 31 | margin-left: -@tooltip-arrow-width; 32 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 33 | border-top-color: @tooltip-arrow-color; 34 | } 35 | &.right .tooltip-arrow { 36 | margin-top: -@tooltip-arrow-width; 37 | border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; 38 | border-right-color: @tooltip-arrow-color; 39 | } 40 | &.left .tooltip-arrow { 41 | margin-top: -@tooltip-arrow-width; 42 | border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; 43 | border-left-color: @tooltip-arrow-color; 44 | } 45 | &.bottom .tooltip-arrow { 46 | margin-left: -@tooltip-arrow-width; 47 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 48 | border-bottom-color: @tooltip-arrow-color; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/static/temp/flat/less/modules/typeahead.less: -------------------------------------------------------------------------------- 1 | // 2 | // Typeahead 3 | // -------------------------------------------------- 4 | 5 | .twitter-typeahead { 6 | width: 100%; 7 | 8 | .tt-dropdown-menu { 9 | width: 100%; 10 | margin-top: 5px; 11 | border: 2px solid @brand-secondary; 12 | padding: 5px 0; 13 | background-color: @inverse; 14 | border-radius: @border-radius-large; 15 | } 16 | 17 | .tt-suggestion { 18 | p { 19 | padding: 6px 14px; 20 | font-size: ceil((@component-font-size-base * 0.933)); 21 | line-height: 1.429; // ~20px 22 | margin: 0; 23 | } 24 | 25 | &:first-child, 26 | &:last-child { 27 | p { 28 | padding: 6px 14px; 29 | } 30 | } 31 | &.tt-is-under-cursor, // Deprecated 32 | &.tt-cursor { 33 | cursor: pointer; 34 | color: #fff; 35 | background-color: mix(@brand-secondary, black, 85%); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/static/temp/flat/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "designmodo-flat-ui", 3 | "shortname": "flat-ui", 4 | "version": "2.3.0", 5 | "description": "Flat UI Free is a beautiful theme for Bootstrap. We have redesigned many of its components to look flat in every pixel", 6 | "author": "Designmodo, Inc.", 7 | "license": "CC BY 3.0 and MIT", 8 | "homepage": "http://designmodo.github.io/Flat-UI/", 9 | "main": "index", 10 | "keywords": [ 11 | "ui", 12 | "flat", 13 | "bootstrap" 14 | ], 15 | "style": "dist/css/flat-ui.css", 16 | "less": "less/flat-ui.less", 17 | "repository": { 18 | "type": "git", 19 | "url": "https://github.com/designmodo/Flat-UI.git" 20 | }, 21 | "bugs": { 22 | "url": "https://github.com/designmodo/Flat-UI/issues" 23 | }, 24 | "devDependencies": { 25 | "grunt": "~0.4.5", 26 | "grunt-autoprefixer": "~1.0.1", 27 | "grunt-banner": "~0.2.3", 28 | "grunt-contrib-clean": "~0.6.0", 29 | "grunt-contrib-concat": "~0.5.0", 30 | "grunt-contrib-connect": "~0.8.0", 31 | "grunt-contrib-copy": "~0.5.0", 32 | "grunt-contrib-csslint": "^0.2.0", 33 | "grunt-contrib-cssmin": "~0.10.0", 34 | "grunt-contrib-jshint": "~0.10.0", 35 | "grunt-contrib-less": "~0.11.4", 36 | "grunt-contrib-uglify": "~0.5.1", 37 | "grunt-contrib-watch": "~0.6.1", 38 | "grunt-csscomb": "~3.0.0", 39 | "grunt-jscs": "~0.7.1", 40 | "load-grunt-tasks": "~0.6.0", 41 | "time-grunt": "~1.0.0" 42 | }, 43 | "engines": { 44 | "node": "~0.10.31" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/static/temp/fonts/glyphicons/flat-ui-icons-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/glyphicons/flat-ui-icons-regular.eot -------------------------------------------------------------------------------- /app/static/temp/fonts/glyphicons/flat-ui-icons-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/glyphicons/flat-ui-icons-regular.ttf -------------------------------------------------------------------------------- /app/static/temp/fonts/glyphicons/flat-ui-icons-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/glyphicons/flat-ui-icons-regular.woff -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-black.eot -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-black.ttf -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-black.woff -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-bold.eot -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-bold.ttf -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-bold.woff -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-bolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-bolditalic.eot -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-bolditalic.ttf -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-bolditalic.woff -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-italic.eot -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-italic.ttf -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-italic.woff -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-light.eot -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-light.ttf -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-light.woff -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-regular.eot -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-regular.ttf -------------------------------------------------------------------------------- /app/static/temp/fonts/lato/lato-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/static/temp/fonts/lato/lato-regular.woff -------------------------------------------------------------------------------- /app/templates/404.html: -------------------------------------------------------------------------------- 1 |

别瞎访问,没这个页面

2 | -------------------------------------------------------------------------------- /app/templates/500.html: -------------------------------------------------------------------------------- 1 |

出错啦,有人要扣工资了

2 | -------------------------------------------------------------------------------- /app/templates/auth/change_password.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | {% endblock %} 5 | {% block navbar %} 6 | {% endblock %} 7 | {% block content %} 8 |
9 |
10 |
11 |
12 |
13 | 鱼 书 14 |
15 |
16 |
17 |
18 |
19 | 22 | 25 | 28 | 31 |
32 |
33 |
34 |
35 |
36 |
37 | {% endblock %} 38 | {% block scripts %} 39 | {{ super() }} 40 | {% endblock %} 41 | -------------------------------------------------------------------------------- /app/templates/auth/forget_password.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | {% endblock %} 5 | {% block navbar %} 6 | {% endblock %} 7 | {% block content %} 8 |
9 |
10 |
11 |
12 |
13 | 鱼 书 14 |
15 |
16 |
17 |
18 |
19 | 22 | 25 | 27 | 28 |
29 |
30 |
31 |
32 |
33 |
34 | {% endblock %} 35 | {% block scripts %} 36 | {{ super() }} 37 | {% endblock %} 38 | -------------------------------------------------------------------------------- /app/templates/auth/forget_password_request.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | {% endblock %} 5 | {% block navbar %} 6 | {% endblock %} 7 | {% block content %} 8 |
9 |
10 |
11 |
12 |
13 | 鱼 书 14 |
15 |
16 |
17 |
18 |
20 | 23 | 25 |
26 |
27 |
28 |
29 |
30 |
31 | {% endblock %} 32 | {% block scripts %} 33 | {{ super() }} 34 | {% endblock %} 35 | -------------------------------------------------------------------------------- /app/templates/email/get_gift.html: -------------------------------------------------------------------------------- 1 |

亲爱的 {{ gift.user.nickname }},

2 |

{{ wisher.nickname }} 想要一本《{{ gift.book.title }}》.你刚好有这本书在鱼书上等待赠送。

3 |

点击这里查看书籍的邮寄地址. 5 |

6 |

无论您是否愿意赠送{{ wisher.nickname }}这本书,都烦请您前往【鱼书】处理此请求。

7 |

如果无法点击,你也可以将下面的地址复制到浏览器中打开:

8 |

{{ url_for('web.pending', _external=True) }}

9 |

你的,鱼书

10 |

11 | 注意,请不要回复此邮件哦 12 |

13 | -------------------------------------------------------------------------------- /app/templates/email/reset_password.html: -------------------------------------------------------------------------------- 1 |

亲爱的 {{ user.nickname }},

2 |

点击这里可以重置你的密码 4 |

5 |

如果无法点击,你也可以将下面的地址复制到浏览器中打开:

6 |

{{ url_for('web.forget_password', token=token, _external=True) }}

7 |

你的,

8 |

鱼书

9 |

10 | 注意,请不要回复此邮件哦 11 |

12 | -------------------------------------------------------------------------------- /app/templates/email/satisify_wish.html: -------------------------------------------------------------------------------- 1 |

亲爱的 {{ wish.user.nickname }},

2 |

{{ gift.user.nickname }} 有一本《{{ wish.book.title }}》可以赠送给你

3 |

点击这里填写书籍邮寄地址, 5 | 等待{{ gift.user.nickname }}将书籍寄送给你 6 |

7 |

如果无法点击,你也可以将下面的地址复制到浏览器中打开:

8 |

{{ url_for('web.send_drift', gid=gift.id, _external=True) }}

9 |

你的,

10 |

鱼书

11 |

12 | 注意,请不要回复此邮件哦 13 |

14 | -------------------------------------------------------------------------------- /app/templates/email_has_send.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 5 | {% endblock %} 6 | {% block content %} 7 |
8 |
9 |
一封邮件已发往你的注册邮箱,请及时查收
10 |
11 |
12 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/gifts.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 5 | {% endblock %} 6 | {% block content %} 7 |
8 |
9 | 最近上传 10 |
11 |
12 |
13 | 31 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 5 | {% endblock %} 6 | {% block content %} 7 |
8 |
9 |
10 |
11 | 28 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/not_enough_beans.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 5 | {% endblock %} 6 | {#{% block navbar %}#} 7 | {# #} 8 | {#{% endblock %}#} 9 | {% block content %} 10 |
11 |
12 | 你没有足够的鱼豆或超过限制 13 | 当前你有{{ beans }}个鱼豆 14 |
15 |
16 |
17 |
18 |
19 | 20 | 温馨提示:每请求1本书,需要消耗1个鱼豆;当你已经请求两本书时,你必须先赠送1本书籍。 21 | 22 |
23 |
24 |
25 |
26 | 以下是获取鱼豆的方式 27 |
28 |
29 |
30 |
31 | 1. 上传图书 32 |
33 |
34 | 在搜索框内搜索书籍,并将书籍“加入到赠送清单” 即可获得0.5个鱼豆。务必确保你愿意赠送此书。 35 |
36 |
37 |
38 |
39 | 2. 赠送图书 40 |
41 |
42 | 每成功赠送一本图书,我们将额外赠送你1个鱼豆。 43 |
44 |
45 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/personal.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 5 | {% endblock %} 6 | {% block navbar %} 7 | {% endblock %} 8 | {% block content %} 9 |
10 |
11 |
12 |
13 | 返回 14 |
15 |
16 |
17 |
18 |
19 | {{ user.nickname }} 20 |
21 |
22 |
23 |
24 |
送出/收到:{{ user.send_receive }}
25 |
当前鱼豆:{{ user.beans }}
26 |
登录邮箱:{{ user.email }}
27 |
登录密码:********* 修改 29 |
30 |
31 |
32 |
33 |
34 |
35 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/search_result.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 5 | {% endblock %} 6 | {% block content %} 7 | {{ super() }} 8 |
9 |
10 | 搜索 {{ books.keyword }}的结果 12 |
13 |
14 | {{ books.total }} 条记录 16 |
17 |
18 |
19 | {% for book in books.books %} 20 | 33 | {% endfor %} 34 |
35 |
36 |
    37 |
    38 |
    39 | {% endblock %} 40 | {% block scripts %} 41 | {{ super() }} 42 | 43 | 44 | 45 | {% endblock %} 46 | -------------------------------------------------------------------------------- /app/test/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | -------------------------------------------------------------------------------- /app/test/test-with.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | from flask import Flask, current_app 6 | 7 | __author__ = "gaowenfeng" 8 | 9 | app = Flask(__name__) 10 | 11 | with app.app_context(): 12 | a = current_app 13 | b = current_app.config["DEBUG"] 14 | 15 | -------------------------------------------------------------------------------- /app/test/test.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | from flask import Flask, current_app 6 | 7 | __author__ = "gaowenfeng" 8 | 9 | app = Flask(__name__) 10 | 11 | # 获取AppContext,里面的代码很简单,就是:return AppContext(self) 12 | ctx = app.app_context() 13 | # 将AppContext入栈 14 | ctx.push() 15 | # 断点调试这里显示current_app=[LocalProxy] 16 | a = current_app 17 | 18 | # RuntimeError: Working outside of application context. 19 | b = current_app.config["DEBUG"] 20 | print(b) 21 | ctx.pop() 22 | -------------------------------------------------------------------------------- /app/test/test_callable.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | 7 | 8 | class A: 9 | def __call__(self): 10 | return object() 11 | 12 | 13 | class B: 14 | def __call__(self): 15 | return object() 16 | 17 | 18 | def func(): 19 | return object() 20 | 21 | 22 | def main(callable): 23 | # 我想在main中传入一个参数,得到一个对象object 24 | callable() 25 | pass 26 | 27 | 28 | main(A()) 29 | main(B()) 30 | main(func) 31 | -------------------------------------------------------------------------------- /app/test/test_contextmanager.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | from contextlib import contextmanager 7 | 8 | 9 | @contextmanager 10 | def book_mark(): 11 | print('《', end='') 12 | yield 13 | print('》', end='') 14 | 15 | 16 | with book_mark(): 17 | print('钢铁',end='') 18 | -------------------------------------------------------------------------------- /app/view_models/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | 5 | __author__ = "gaowenfeng" 6 | -------------------------------------------------------------------------------- /app/view_models/drift.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | from app.libs.enums import PendingStatus 5 | 6 | __author__ = "gaowenfeng" 7 | 8 | 9 | class DriftCollection: 10 | 11 | def __init__(self, drifts, current_user_id): 12 | self.data = [] 13 | 14 | self.data = self._parse(drifts, current_user_id) 15 | 16 | def _parse(self, drifts, current_user_id): 17 | return [DriftViewModel(drift, current_user_id).data for drift in drifts] 18 | 19 | 20 | class DriftViewModel: 21 | 22 | def __init__(self, drift, current_user_id): 23 | self.data = {} 24 | 25 | self.data = self._parse(drift, current_user_id) 26 | 27 | @staticmethod 28 | def requester_or_gifter(drift, current_user_id): 29 | return 'requester' if current_user_id == drift.requester_id else 'gifter' 30 | 31 | def _parse(self, drift, current_user_id): 32 | you_are = DriftViewModel.requester_or_gifter(drift, current_user_id) 33 | pending_status = PendingStatus.pending_str(drift.pending, you_are) 34 | r = { 35 | 'drift_id': drift.id, 36 | 'you_are': you_are, 37 | 'book_title': drift.book_title, 38 | 'book_author': drift.book_author, 39 | 'book_img': drift.book_img, 40 | 'date': drift.create_datetime.strftime('%Y-%m-%d'), 41 | 'operator': drift.requester_nickname if you_are != 'requester' \ 42 | else drift.gifter_nickname, 43 | 'message': drift.message, 44 | 'address': drift.address, 45 | 'status_str': pending_status, 46 | 'recipient_name': drift.recipient_name, 47 | 'mobile': drift.mobile, 48 | 'status': drift.pending 49 | } 50 | 51 | return r 52 | -------------------------------------------------------------------------------- /app/view_models/gift.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | from app.view_models.book import BookViewModel 5 | 6 | __author__ = "gaowenfeng" 7 | 8 | 9 | class Gifts: 10 | 11 | def __init__(self, gifts_of_mine, wish_count_list): 12 | self.gifts = [] 13 | self.__gifts_of_mine = gifts_of_mine 14 | self.__wish_count_list = wish_count_list 15 | 16 | self.gifts = self.__parse() 17 | 18 | def __parse(self): 19 | temp_gifts = [] 20 | for gift in self.__gifts_of_mine: 21 | my_gift = self.__matching(gift) 22 | temp_gifts.append(my_gift) 23 | return temp_gifts 24 | 25 | def __matching(self, gift): 26 | count = 0 27 | for wish_count in self.__wish_count_list: 28 | if gift.isbn == wish_count['isbn']: 29 | count = wish_count['count'] 30 | r = { 31 | 'wishes_count': count, 32 | 'book': BookViewModel(gift.book), 33 | 'id': gift.id 34 | } 35 | return r 36 | -------------------------------------------------------------------------------- /app/view_models/trade.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | from app.view_models.book import BookViewModel 5 | 6 | __author__ = "gaowenfeng" 7 | 8 | 9 | class TradeInfo: 10 | 11 | def __init__(self, goods): 12 | self.total = 0 13 | self.trades = [] 14 | self.__parse(goods) 15 | 16 | def __parse(self, goods): 17 | self.total = len(goods) 18 | self.trades = [self.__map_to_trade(single) for single in goods] 19 | 20 | def __map_to_trade(self, single): 21 | if single.create_datetime: 22 | time = single.create_datetime.strftime('%Y-%m-%d') 23 | else: 24 | time = '未知' 25 | return dict( 26 | user_name=single.user.nickname, 27 | time=time, 28 | id=single.id 29 | ) 30 | 31 | 32 | class MyTrade: 33 | 34 | def __init__(self, trades_of_mine, trades_count_list): 35 | self.trades = [] 36 | self.__trades_of_mine = trades_of_mine 37 | self.__trades_count_list = trades_count_list 38 | 39 | self.trades = self.__parse() 40 | 41 | def __parse(self): 42 | temp_trades = [] 43 | for trade in self.__trades_of_mine: 44 | my_trade = self.__matching(trade) 45 | temp_trades.append(my_trade) 46 | return temp_trades 47 | 48 | def __matching(self, trade): 49 | count = 0 50 | for trade_count in self.__trades_count_list: 51 | if trade.isbn == trade_count['isbn']: 52 | count = trade_count['count'] 53 | r = { 54 | 'wishes_count': count, 55 | 'book': BookViewModel(trade.book), 56 | 'id': trade.id 57 | } 58 | return r 59 | 60 | 61 | -------------------------------------------------------------------------------- /app/view_models/wish.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 3 | """ 4 | from app.view_models.book import BookViewModel 5 | 6 | __author__ = "gaowenfeng" 7 | 8 | 9 | class Wishes: 10 | 11 | def __init__(self, wishes_of_mine): 12 | self.wishes = [] 13 | self.__wishes_of_mine = wishes_of_mine 14 | 15 | self.wishes = self.__parse() 16 | 17 | def __parse(self): 18 | temp_list = [self.__parse_single(wish) for wish in self.__wishes_of_mine] 19 | return temp_list 20 | 21 | def __parse_single(self, wish): 22 | r = { 23 | 'wishes_count': wish['count'], 24 | 'book': BookViewModel(wish['wish'].book), 25 | 'id': wish['wish'].id 26 | } 27 | return r 28 | -------------------------------------------------------------------------------- /app/web/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint,render_template 2 | 3 | __author__ = "gaowenfeng" 4 | 5 | 6 | web = Blueprint('web', __name__) 7 | 8 | 9 | @web.app_errorhandler(404) 10 | def not_found(e): 11 | return render_template('404.html'), 404 12 | 13 | 14 | from app.web import book 15 | from app.web import auth 16 | from app.web import drift 17 | from app.web import gift 18 | from app.web import main 19 | from app.web import wish 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/web/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/web/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /app/web/__pycache__/book.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkGao11520/fisher/73b6d7c5a47e3d4ce58a5fc257529175f42dec66/app/web/__pycache__/book.cpython-36.pyc -------------------------------------------------------------------------------- /app/web/book.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 2018/6/1 3 | """ 4 | from flask import request, render_template, flash 5 | from flask_login import current_user 6 | 7 | from app.view_models.trade import TradeInfo 8 | from app.libs.helper import is_isbn_or_key 9 | from app.forms.book import SearchForm 10 | from app.models.gift import Gift 11 | from app.models.wish import Wish 12 | from app.spider.yushu_book import YuShuBook 13 | from app.view_models.book import BookCollection, BookViewModel 14 | 15 | from . import web 16 | 17 | 18 | __author__ = "gaowenfeng" 19 | 20 | 21 | @web.route("/book/search/") 22 | def search(): 23 | """ 24 | 搜索书籍路由 25 | """ 26 | form = SearchForm(request.args) 27 | books = BookCollection() 28 | if form.validate(): 29 | q = form.q.data.strip() 30 | isbn_or_key = is_isbn_or_key(q) 31 | 32 | yushu_book = YuShuBook() 33 | 34 | if isbn_or_key == 'isbn': 35 | yushu_book.search_by_isbn(q) 36 | else: 37 | page = form.page.data 38 | yushu_book.search_by_key(q, page) 39 | 40 | books.fill(yushu_book, q) 41 | else: 42 | flash("搜索的关键字不符合要求,请重新输入关键字") 43 | 44 | return render_template("search_result.html", books=books) 45 | 46 | 47 | @web.route("/book//detail") 48 | def book_detail(isbn): 49 | 50 | # 取出每本书的详情 51 | yushu_book = YuShuBook() 52 | yushu_book.search_by_isbn(isbn) 53 | book = BookViewModel(yushu_book.first) 54 | 55 | # 三种情况的判断 56 | has_in_gifts = current_user.is_authenticated and current_user.has_in_gifts(isbn) 57 | has_in_wishes = current_user.is_authenticated and current_user.has_in_wishs(isbn) 58 | 59 | # 赠书人列表和索要人列表 60 | trade_gifts = Gift.query.filter_by(isbn=isbn).all() 61 | trade_wishs = Wish.query.filter_by(isbn=isbn).all() 62 | 63 | trade_wishs_model = TradeInfo(trade_wishs) 64 | trade_gifts_model = TradeInfo(trade_gifts) 65 | return render_template("book_detail.html", book=book, 66 | wishes=trade_wishs_model, gifts=trade_gifts_model, 67 | has_in_wishes=has_in_wishes, has_in_gifts=has_in_gifts) 68 | -------------------------------------------------------------------------------- /app/web/gift.py: -------------------------------------------------------------------------------- 1 | from flask import flash, current_app, render_template, redirect, url_for 2 | from flask_login import login_required, current_user 3 | 4 | from app.libs.enums import PendingStatus 5 | from app.models.base import db 6 | from app.models.drift import Drift 7 | from app.models.gift import Gift 8 | from app.view_models.trade import MyTrade 9 | from . import web 10 | 11 | __author__ = '七月' 12 | 13 | 14 | @web.route('/my/gifts') 15 | @login_required 16 | def my_gifts(): 17 | uid = current_user.id 18 | gifts_of_mine = Gift.get_user_gifts(uid) 19 | isbn_list = [gift.isbn for gift in gifts_of_mine] 20 | wish_count_list = Gift.get_wish_counts(isbn_list) 21 | view_model = MyTrade(gifts_of_mine, wish_count_list) 22 | return render_template('my_gifts.html', gifts=view_model.trades) 23 | 24 | 25 | @web.route('/gifts/book/') 26 | @login_required 27 | def save_to_gifts(isbn): 28 | if current_user.can_save_to_list(isbn): 29 | with db.auto_commit(): 30 | gift = Gift() 31 | gift.isbn = isbn 32 | gift.uid = current_user.id 33 | 34 | current_user.beans += current_app.config['BEANS_UPLOAD_ONE_BOOK'] 35 | 36 | db.session.add(gift) 37 | else: 38 | flash("这本书以添加进您的赠送清单或已经存在于您的心愿清单,请不要重复添加") 39 | return redirect(url_for('web.book_detail', isbn=isbn)) 40 | 41 | 42 | @web.route('/gifts//redraw') 43 | def redraw_from_gifts(gid): 44 | gift = Gift.query.filter_by(id=gid, launched=False).first_or_404() 45 | drift = Drift.query.filter_by(gift_id=gid, pending=PendingStatus.Waiting).first() 46 | 47 | if drift: 48 | flash('这个礼物正处于交易状态,请先千万鱼漂完成该交易') 49 | else: 50 | with db.auto_commit(): 51 | gift.delete() 52 | current_user.beans -= current_app.config['BEANS_UPLOAD_ONE_BOOK'] 53 | 54 | return redirect(url_for('web.my_gifts')) 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/web/main.py: -------------------------------------------------------------------------------- 1 | from app.models.gift import Gift 2 | from app.view_models.book import BookViewModel 3 | from flask import render_template 4 | from . import web 5 | 6 | 7 | __author__ = '七月' 8 | 9 | 10 | @web.route('/') 11 | def index(): 12 | recent_gifts = Gift.recent() 13 | books = [BookViewModel(gift.book) for gift in recent_gifts] 14 | return render_template('index.html', recent=books) 15 | 16 | 17 | @web.route('/personal') 18 | def personal_center(): 19 | pass 20 | -------------------------------------------------------------------------------- /app/web/wish.py: -------------------------------------------------------------------------------- 1 | from flask import flash, redirect, url_for, render_template 2 | from flask_login import current_user, login_required 3 | 4 | from app.libs.email import send_mail 5 | from app.models.base import db 6 | from app.models.gift import Gift 7 | from app.models.wish import Wish 8 | from app.view_models.trade import MyTrade 9 | from . import web 10 | 11 | __author__ = '七月' 12 | 13 | 14 | @web.route('/my/wish') 15 | def my_wish(): 16 | uid = current_user.id 17 | wishes_of_mine = Wish.get_user_wishes(uid) 18 | isbn_list = [gift.isbn for gift in wishes_of_mine] 19 | gift_count_list = Wish.get_gift_counts(isbn_list) 20 | view_model = MyTrade(wishes_of_mine, gift_count_list) 21 | return render_template('my_wish.html', wishes=view_model.trades) 22 | 23 | 24 | @web.route('/wish/book/') 25 | @login_required 26 | def save_to_wish(isbn): 27 | if current_user.can_save_to_list(isbn): 28 | with db.auto_commit(): 29 | wish = Wish() 30 | wish.isbn = isbn 31 | wish.uid = current_user.id 32 | 33 | db.session.add(wish) 34 | else: 35 | flash("这本书以添加进您的赠送清单或已经存在于您的心愿清单,请不要重复添加") 36 | return redirect(url_for('web.book_detail', isbn=isbn)) 37 | 38 | 39 | @web.route('/satisfy/wish/') 40 | def satisfy_wish(wid): 41 | """ 42 | 向想要这本书的人发送一封邮件 43 | 注意,这个接口需要做一定的频率限制 44 | 这接口比较适合写成一个ajax接口 45 | """ 46 | wish = Wish.query.get_or_404(wid) 47 | gift = Gift.query.filter_by(uid=current_user.id, isbn=wish.isbn).first() 48 | if not gift: 49 | flash('你还没有上传此书,请点击“加入到赠送清单”添加此书。添加前,请确保自己可以赠送此书') 50 | else: 51 | send_mail(wish.user.email, '有人想送你一本书', 'email/satisify_wish.html', wish=wish, 52 | gift=gift) 53 | flash('已向他/她发送了一封邮件,如果他/她愿意接受你的赠送,你将收到一个鱼漂') 54 | return redirect(url_for('web.book_detail', isbn=wish.isbn)) 55 | 56 | 57 | @web.route('/wish/book//redraw') 58 | def redraw_from_wish(isbn): 59 | wish = Wish.query.filter_by(isbn=isbn, launched=False).first_or_404() 60 | 61 | with db.auto_commit(): 62 | wish.delete() 63 | 64 | return redirect(url_for('web.my_wish')) 65 | -------------------------------------------------------------------------------- /fisher.py: -------------------------------------------------------------------------------- 1 | """ 2 | create by gaowenfeng on 2018/5/31 3 | """ 4 | 5 | from app import create_app 6 | 7 | 8 | __author__ = "gaowenfeng" 9 | 10 | app = create_app() 11 | 12 | if __name__ == "__main__": 13 | app.run(host=app.config["HOST"], debug=app.config["DEBUG"], port=app.config["PORT"], threaded=False) 14 | --------------------------------------------------------------------------------