├── libs ├── __init__.py ├── YunTongXun │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ ├── CCPRestSDK.cpython-36.pyc │ │ ├── xmltojson.cpython-36.pyc │ │ ├── CCPRestSDK复件.cpython-36.pyc │ │ └── SendTemplateSMS.cpython-36.pyc │ └── SendTemplateSMS.py └── __pycache__ │ └── __init__.cpython-36.pyc ├── tasks ├── ___init__.py ├── __pycache__ │ └── task_sms.cpython-36.pyc └── task_sms.py ├── utils ├── __init__.py ├── captcha │ ├── __init__.py │ ├── __init__.pyc │ ├── captcha.pyc │ ├── fonts │ │ ├── Arial.ttf │ │ ├── Georgia.ttf │ │ └── actionj.ttf │ └── __pycache__ │ │ ├── captcha.cpython-36.pyc │ │ └── __init__.cpython-36.pyc ├── __pycache__ │ ├── __init__.cpython-36.pyc │ ├── commons.cpython-36.pyc │ ├── image_storage.cpython-36.pyc │ └── response_code.cpython-36.pyc ├── .qiniu_pythonsdk_hostscache.json ├── commons.py ├── response_code.py └── image_storage.py ├── api_1_0 ├── __init__.py ├── __pycache__ │ └── __init__.cpython-36.pyc ├── house │ ├── __pycache__ │ │ ├── views.cpython-36.pyc │ │ ├── models.cpython-36.pyc │ │ └── __init__.cpython-36.pyc │ ├── __init__.py │ └── areas_facility.sql ├── order │ ├── __pycache__ │ │ ├── views.cpython-36.pyc │ │ ├── alipay.cpython-36.pyc │ │ ├── models.cpython-36.pyc │ │ └── __init__.cpython-36.pyc │ ├── __init__.py │ ├── alipay_public_key.pem │ ├── app_private_key.pem │ └── models.py ├── user │ ├── __pycache__ │ │ ├── models.cpython-36.pyc │ │ ├── views.cpython-36.pyc │ │ └── __init__.cpython-36.pyc │ ├── __init__.py │ └── models.py └── public │ ├── __pycache__ │ ├── views.cpython-36.pyc │ └── __init__.cpython-36.pyc │ └── __init__.py ├── migrations ├── README ├── __pycache__ │ └── env.cpython-36.pyc ├── versions │ ├── __pycache__ │ │ ├── 450c094cadc7_.cpython-36.pyc │ │ ├── 4cd7567d8169_.cpython-36.pyc │ │ └── accb068ce0af_create_tables.cpython-36.pyc │ ├── 4cd7567d8169_.py │ └── 450c094cadc7_.py ├── script.py.mako ├── alembic.ini └── env.py ├── ihome ├── static │ ├── .DS_Store │ ├── favicon.ico │ ├── fonts │ │ ├── mui.ttf │ │ └── mui-icons-extra.ttf │ ├── images │ │ ├── home01.jpg │ │ ├── home02.jpg │ │ ├── home03.jpg │ │ ├── landlord01.jpg │ │ ├── logo@128x59.png │ │ └── houseicon_sprite.png │ ├── plugins │ │ ├── uniform │ │ │ ├── images │ │ │ │ ├── sprite.png │ │ │ │ ├── bg-input.png │ │ │ │ ├── bg-input-focus.png │ │ │ │ └── sprite_original.png │ │ │ └── css │ │ │ │ └── uniform.default.scss │ │ ├── simple-line-icons │ │ │ ├── License.txt │ │ │ ├── fonts │ │ │ │ ├── Simple-Line-Icons.eot │ │ │ │ ├── Simple-Line-Icons.ttf │ │ │ │ └── Simple-Line-Icons.woff │ │ │ └── Readme.txt │ │ ├── font-awesome │ │ │ ├── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ ├── less │ │ │ │ ├── fixed-width.less │ │ │ │ ├── screen-reader.less │ │ │ │ ├── larger.less │ │ │ │ ├── list.less │ │ │ │ ├── core.less │ │ │ │ ├── stacked.less │ │ │ │ ├── font-awesome.less │ │ │ │ ├── bordered-pulled.less │ │ │ │ ├── rotated-flipped.less │ │ │ │ ├── path.less │ │ │ │ ├── animated.less │ │ │ │ └── mixins.less │ │ │ ├── scss │ │ │ │ ├── _fixed-width.scss │ │ │ │ ├── _screen-reader.scss │ │ │ │ ├── _larger.scss │ │ │ │ ├── _list.scss │ │ │ │ ├── _core.scss │ │ │ │ ├── font-awesome.scss │ │ │ │ ├── _stacked.scss │ │ │ │ ├── _bordered-pulled.scss │ │ │ │ ├── _rotated-flipped.scss │ │ │ │ ├── _path.scss │ │ │ │ ├── _animated.scss │ │ │ │ └── _mixins.scss │ │ │ └── HELP-US-OUT.txt │ │ ├── bootstrap │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ └── js │ │ │ │ └── npm.js │ │ ├── bootstrap-datepicker │ │ │ └── locales │ │ │ │ ├── bootstrap-datepicker.kr.min.js │ │ │ │ ├── bootstrap-datepicker.ja.min.js │ │ │ │ ├── bootstrap-datepicker.zh-TW.min.js │ │ │ │ ├── bootstrap-datepicker.ko.min.js │ │ │ │ ├── bootstrap-datepicker.he.min.js │ │ │ │ ├── bootstrap-datepicker.zh-CN.min.js │ │ │ │ ├── bootstrap-datepicker.bg.min.js │ │ │ │ ├── bootstrap-datepicker.cy.min.js │ │ │ │ ├── bootstrap-datepicker.sw.min.js │ │ │ │ ├── bootstrap-datepicker.sl.min.js │ │ │ │ ├── bootstrap-datepicker.sq.min.js │ │ │ │ ├── bootstrap-datepicker.ms.min.js │ │ │ │ ├── bootstrap-datepicker.id.min.js │ │ │ │ ├── bootstrap-datepicker.kk.min.js │ │ │ │ ├── bootstrap-datepicker.eu.min.js │ │ │ │ ├── bootstrap-datepicker.hr.min.js │ │ │ │ ├── bootstrap-datepicker.nb.min.js │ │ │ │ ├── bootstrap-datepicker.az.min.js │ │ │ │ ├── bootstrap-datepicker.mk.min.js │ │ │ │ ├── bootstrap-datepicker.mn.min.js │ │ │ │ ├── bootstrap-datepicker.th.min.js │ │ │ │ ├── bootstrap-datepicker.is.min.js │ │ │ │ ├── bootstrap-datepicker.rs.min.js │ │ │ │ ├── bootstrap-datepicker.sr.min.js │ │ │ │ ├── bootstrap-datepicker.bs.min.js │ │ │ │ ├── bootstrap-datepicker.fo.min.js │ │ │ │ ├── bootstrap-datepicker.lv.min.js │ │ │ │ ├── bootstrap-datepicker.ro.min.js │ │ │ │ ├── bootstrap-datepicker.tr.min.js │ │ │ │ ├── bootstrap-datepicker.fa.min.js │ │ │ │ ├── bootstrap-datepicker.rs-latin.min.js │ │ │ │ ├── bootstrap-datepicker.sk.min.js │ │ │ │ ├── bootstrap-datepicker.sr-latin.min.js │ │ │ │ ├── bootstrap-datepicker.sv.min.js │ │ │ │ ├── bootstrap-datepicker.ar.min.js │ │ │ │ ├── bootstrap-datepicker.da.min.js │ │ │ │ ├── bootstrap-datepicker.gl.min.js │ │ │ │ ├── bootstrap-datepicker.kh.min.js │ │ │ │ ├── bootstrap-datepicker.km.min.js │ │ │ │ ├── bootstrap-datepicker.no.min.js │ │ │ │ ├── bootstrap-datepicker.ar-tn.min.js │ │ │ │ ├── bootstrap-datepicker.me.min.js │ │ │ │ ├── bootstrap-datepicker.pt.min.js │ │ │ │ ├── bootstrap-datepicker.ru.min.js │ │ │ │ ├── bootstrap-datepicker.cs.min.js │ │ │ │ ├── bootstrap-datepicker.pt-BR.min.js │ │ │ │ ├── bootstrap-datepicker.eo.min.js │ │ │ │ ├── bootstrap-datepicker.it-CH.min.js │ │ │ │ ├── bootstrap-datepicker.uk.min.js │ │ │ │ ├── bootstrap-datepicker.vi.min.js │ │ │ │ ├── bootstrap-datepicker.ca.min.js │ │ │ │ ├── bootstrap-datepicker.es.min.js │ │ │ │ ├── bootstrap-datepicker.fr-CH.min.js │ │ │ │ ├── bootstrap-datepicker.hy.min.js │ │ │ │ ├── bootstrap-datepicker.ka.min.js │ │ │ │ ├── bootstrap-datepicker.nl.min.js │ │ │ │ ├── bootstrap-datepicker.de.min.js │ │ │ │ ├── bootstrap-datepicker.hu.min.js │ │ │ │ ├── bootstrap-datepicker.en-AU.min.js │ │ │ │ ├── bootstrap-datepicker.en-GB.min.js │ │ │ │ ├── bootstrap-datepicker.en-IE.min.js │ │ │ │ ├── bootstrap-datepicker.en-NZ.min.js │ │ │ │ ├── bootstrap-datepicker.en-ZA.min.js │ │ │ │ ├── bootstrap-datepicker.fi.min.js │ │ │ │ ├── bootstrap-datepicker.it.min.js │ │ │ │ ├── bootstrap-datepicker.el.min.js │ │ │ │ ├── bootstrap-datepicker.et.min.js │ │ │ │ ├── bootstrap-datepicker.nl-BE.min.js │ │ │ │ ├── bootstrap-datepicker.fr.min.js │ │ │ │ ├── bootstrap-datepicker.pl.min.js │ │ │ │ └── bootstrap-datepicker.lt.min.js │ │ └── bootstrap-switch │ │ │ └── README.md │ ├── css │ │ ├── ihome │ │ │ ├── main.css │ │ │ ├── login.css │ │ │ ├── register.css │ │ │ ├── my.css │ │ │ ├── myhouse.css │ │ │ ├── orders.css │ │ │ ├── booking.css │ │ │ ├── index.css │ │ │ ├── newhouse.css │ │ │ ├── profile.css │ │ │ └── search.css │ │ ├── app.css │ │ ├── reset.css │ │ ├── mui.poppicker.css │ │ └── mui.picker.min.css │ ├── js │ │ └── ihome │ │ │ ├── my.js │ │ │ ├── myhouse.js │ │ │ ├── login.js │ │ │ ├── auth.js │ │ │ ├── lorders.js │ │ │ ├── orders.js │ │ │ └── detail.js │ └── html │ │ ├── login.html │ │ ├── payComplete.html │ │ ├── booking.html │ │ ├── my.html │ │ ├── myhouse.html │ │ ├── auth.html │ │ ├── profile.html │ │ ├── register.html │ │ ├── index.html │ │ └── search.html ├── __pycache__ │ ├── views.cpython-36.pyc │ ├── __init__.cpython-36.pyc │ ├── models.cpython-36.pyc │ └── static_html.cpython-36.pyc ├── models.py ├── static_html.py └── __init__.py ├── __pycache__ └── config.cpython-36.pyc ├── .qiniu_pythonsdk_hostscache.json ├── manage.py ├── config.py └── py-dependent.txt /libs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tasks/___init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api_1_0/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /libs/YunTongXun/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/captcha/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /migrations/README: -------------------------------------------------------------------------------- 1 | Generic single-database configuration. -------------------------------------------------------------------------------- /ihome/static/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/.DS_Store -------------------------------------------------------------------------------- /ihome/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/favicon.ico -------------------------------------------------------------------------------- /ihome/static/fonts/mui.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/fonts/mui.ttf -------------------------------------------------------------------------------- /utils/captcha/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/captcha/__init__.pyc -------------------------------------------------------------------------------- /utils/captcha/captcha.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/captcha/captcha.pyc -------------------------------------------------------------------------------- /ihome/static/images/home01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/images/home01.jpg -------------------------------------------------------------------------------- /ihome/static/images/home02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/images/home02.jpg -------------------------------------------------------------------------------- /ihome/static/images/home03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/images/home03.jpg -------------------------------------------------------------------------------- /utils/captcha/fonts/Arial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/captcha/fonts/Arial.ttf -------------------------------------------------------------------------------- /utils/captcha/fonts/Georgia.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/captcha/fonts/Georgia.ttf -------------------------------------------------------------------------------- /utils/captcha/fonts/actionj.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/captcha/fonts/actionj.ttf -------------------------------------------------------------------------------- /__pycache__/config.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/__pycache__/config.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/images/landlord01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/images/landlord01.jpg -------------------------------------------------------------------------------- /ihome/static/images/logo@128x59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/images/logo@128x59.png -------------------------------------------------------------------------------- /ihome/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/fonts/mui-icons-extra.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/fonts/mui-icons-extra.ttf -------------------------------------------------------------------------------- /ihome/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/images/houseicon_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/images/houseicon_sprite.png -------------------------------------------------------------------------------- /libs/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/libs/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /migrations/__pycache__/env.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/migrations/__pycache__/env.cpython-36.pyc -------------------------------------------------------------------------------- /tasks/__pycache__/task_sms.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/tasks/__pycache__/task_sms.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/commons.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/__pycache__/commons.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/house/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/house/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/order/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/order/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/user/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/user/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/user/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/user/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/__pycache__/static_html.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/__pycache__/static_html.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/plugins/uniform/images/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/uniform/images/sprite.png -------------------------------------------------------------------------------- /utils/__pycache__/image_storage.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/__pycache__/image_storage.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/response_code.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/__pycache__/response_code.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/house/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/house/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/order/__pycache__/alipay.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/order/__pycache__/alipay.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/order/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/order/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/public/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/public/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/user/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/user/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/plugins/uniform/images/bg-input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/uniform/images/bg-input.png -------------------------------------------------------------------------------- /utils/captcha/__pycache__/captcha.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/captcha/__pycache__/captcha.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/house/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/house/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/order/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/order/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/public/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/api_1_0/public/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/user/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint 2 | 3 | 4 | api_user = Blueprint('api_user', __name__) 5 | 6 | 7 | # 添加视图 8 | from . import views 9 | -------------------------------------------------------------------------------- /ihome/static/plugins/simple-line-icons/License.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/simple-line-icons/License.txt -------------------------------------------------------------------------------- /libs/YunTongXun/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/libs/YunTongXun/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /utils/captcha/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/utils/captcha/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/house/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint 2 | 3 | 4 | api_house = Blueprint('api_house', __name__) 5 | 6 | 7 | # 注册视图 8 | from . import views 9 | -------------------------------------------------------------------------------- /api_1_0/public/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint 2 | 3 | 4 | api = Blueprint('api', __name__) 5 | 6 | 7 | # 提交视图 8 | from .views import image_code 9 | -------------------------------------------------------------------------------- /libs/YunTongXun/__pycache__/CCPRestSDK.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/libs/YunTongXun/__pycache__/CCPRestSDK.cpython-36.pyc -------------------------------------------------------------------------------- /libs/YunTongXun/__pycache__/xmltojson.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/libs/YunTongXun/__pycache__/xmltojson.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /ihome/static/plugins/uniform/images/bg-input-focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/uniform/images/bg-input-focus.png -------------------------------------------------------------------------------- /ihome/static/plugins/uniform/images/sprite_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/uniform/images/sprite_original.png -------------------------------------------------------------------------------- /libs/YunTongXun/__pycache__/CCPRestSDK复件.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/libs/YunTongXun/__pycache__/CCPRestSDK复件.cpython-36.pyc -------------------------------------------------------------------------------- /api_1_0/order/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint 2 | 3 | 4 | api_order = Blueprint('api_order', __name__) 5 | 6 | 7 | # 提交视图 8 | from . import views, alipay 9 | -------------------------------------------------------------------------------- /libs/YunTongXun/__pycache__/SendTemplateSMS.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/libs/YunTongXun/__pycache__/SendTemplateSMS.cpython-36.pyc -------------------------------------------------------------------------------- /migrations/versions/__pycache__/450c094cadc7_.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/migrations/versions/__pycache__/450c094cadc7_.cpython-36.pyc -------------------------------------------------------------------------------- /migrations/versions/__pycache__/4cd7567d8169_.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/migrations/versions/__pycache__/4cd7567d8169_.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /ihome/static/plugins/simple-line-icons/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/simple-line-icons/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /ihome/static/plugins/simple-line-icons/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/simple-line-icons/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /ihome/static/plugins/simple-line-icons/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/simple-line-icons/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/ihome/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /migrations/versions/__pycache__/accb068ce0af_create_tables.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuetianyyy/Flask-app/HEAD/migrations/versions/__pycache__/accb068ce0af_create_tables.cpython-36.pyc -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /.qiniu_pythonsdk_hostscache.json: -------------------------------------------------------------------------------- 1 | {"http:Euxb-z9rE05VL9EfNgqHytbZcmwkEAGyrXpGyHqG:xtimages": {"upHosts": ["http://up-z2.qiniu.com", "http://upload-z2.qiniu.com", "-H up-z2.qiniu.com http://14.152.37.4"], "ioHosts": ["http://iovip-z2.qbox.me"], "deadline": 1558339484}} -------------------------------------------------------------------------------- /utils/.qiniu_pythonsdk_hostscache.json: -------------------------------------------------------------------------------- 1 | {"http:Euxb-z9rE05VL9EfNgqHytbZcmwkEAGyrXpGyHqG:xtimages": {"upHosts": ["http://up-z2.qiniu.com", "http://upload-z2.qiniu.com", "-H up-z2.qiniu.com http://14.152.37.4"], "ioHosts": ["http://iovip-z2.qbox.me"], "deadline": 1558160180}} -------------------------------------------------------------------------------- /ihome/models.py: -------------------------------------------------------------------------------- 1 | from . import db 2 | from datetime import datetime 3 | 4 | 5 | class BaseModel(): 6 | """ 这是一个模型基类, 用于创建公共的字段 """ 7 | create_time = db.Column(db.DateTime, default=datetime.now()) 8 | update_time = db.Column(db.DateTime, default=datetime.now(), onupdate=datetime.now()) 9 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/main.css: -------------------------------------------------------------------------------- 1 | .btn-theme, .btn-theme:hover { 2 | background-color: #ff6666; 3 | border-color: #ff6666; 4 | color: #fff; 5 | } 6 | .footer { 7 | width: 100%; 8 | text-align: center; 9 | font-size: 15px; 10 | color: #99999c; 11 | padding: 14px 0px; 12 | } -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.kr.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.kr={days:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],daysShort:["일","월","화","수","목","금","토"],daysMin:["일","월","화","수","목","금","토"],months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthsShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"]}}(jQuery); -------------------------------------------------------------------------------- /api_1_0/house/areas_facility.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO `ih_area_info`(`name`) VALUES ('荔湾区'),('越秀区'),('天河区'),('白云区'),('黄埔区'),('番禺区'),('花都区'),('萝岗区'),('南沙区'),('增城区'),('从化区'); 2 | 3 | INSERT INTO `ih_facility_info`(`name`) VALUES('无线网络'),('热水淋浴'),('空调'),('暖气'),('允许吸烟'),('饮水设备'),('牙具'),('香皂'),('拖鞋'),('手纸'),('毛巾'),('沐浴露、洗发露'),('冰箱'),('洗衣机'),('电梯'),('允许做饭'),('允许带宠物'),('允许聚会'),('门禁系统'),('停车位'),('有线网络'),('电视'),('浴缸'); 4 | -------------------------------------------------------------------------------- /ihome/static/css/app.css: -------------------------------------------------------------------------------- 1 | /* 2 | *这是单独为hello mui准备的个性化css,可以覆盖标准mui的css定义; 3 | * 在实际项目开发时,建议为App单独写一个css文件,从而实现项目的自定义皮肤功能; 4 | * 5 | * */ 6 | .mui-plus header.mui-bar{ 7 | display: none; 8 | } 9 | .mui-plus .mui-bar-nav~.mui-content{ 10 | padding: 0; 11 | } 12 | 13 | /*hm开头的表示仅为 Hello MUI示例定义*/ 14 | .hm-description{ 15 | margin: .5em 0; 16 | } 17 | 18 | .hm-description>li { 19 | font-size: 14px; 20 | color: #8f8f94; 21 | } 22 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ja.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ja={days:["日曜","月曜","火曜","水曜","木曜","金曜","土曜"],daysShort:["日","月","火","水","木","金","土"],daysMin:["日","月","火","水","木","金","土"],months:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今日",format:"yyyy/mm/dd",titleFormat:"yyyy年mm月",clear:"クリア"}}(jQuery); -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | from ihome import create_app, db 2 | from flask_script import Manager 3 | from flask_migrate import Migrate, MigrateCommand 4 | 5 | 6 | # 需要传递一个工作环境的参数 7 | app = create_app('develop') 8 | manager = Manager(app) 9 | 10 | # 创建Migrate执行对象 11 | Migrate(app=app, db=db) 12 | # 添加迁移的脚本命令 13 | manager.add_command('db', MigrateCommand) 14 | 15 | 16 | if __name__ == '__main__': 17 | # print(app.url_map) 18 | manager.run() 19 | 20 | 21 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.zh-TW.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["zh-TW"]={days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],daysShort:["週日","週一","週二","週三","週四","週五","週六"],daysMin:["日","一","二","三","四","五","六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今天",format:"yyyy年mm月dd日",weekStart:1,clear:"清除"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ko={days:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],daysShort:["일","월","화","수","목","금","토"],daysMin:["일","월","화","수","목","금","토"],months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthsShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],today:"오늘",clear:"삭제",format:"yyyy-mm-dd",titleFormat:"yyyy년mm월",weekStart:0}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /api_1_0/order/alipay_public_key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4BGq5PlwSnWCs9dGKcdASXxUKFb8wmUpQUAPnUZQjHX/XAgRfa3lZIL2CYCzSs9Y2cs9Dh9XZF3I9Kzxrj3+GHigbz9Mi72X0V1DPArwKE3Z07kimjnFZlNvcsEkNC/5Fg84/tx1o7QLa1gbao/8vv2sfbhGTzl3o2PtaW3VmqM2qI0jw7uzRnZQS7FDxqJTfy8M4oh83JROdEL/pYqD3jElIzUex7nwJWa2/YGjadx1sNGCNJNawkNmMxX7FFRHobAL2n+4Xe2tjBcQQ5oPSy3miKxzWmaWJheIHhVD3iIPh7LMMCvenRer06StlZkOOEndu3wnNUCjECaf2kO7EwIDAQAB 3 | -----END PUBLIC KEY----- 4 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.he.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.he={days:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת","ראשון"],daysShort:["א","ב","ג","ד","ה","ו","ש","א"],daysMin:["א","ב","ג","ד","ה","ו","ש","א"],months:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthsShort:["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"],today:"היום",rtl:!0}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["zh-CN"]={days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],daysShort:["周日","周一","周二","周三","周四","周五","周六"],daysMin:["日","一","二","三","四","五","六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今日",clear:"清除",format:"yyyy年mm月dd日",titleFormat:"yyyy年mm月",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.bg.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.bg={days:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],daysShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],daysMin:["Н","П","В","С","Ч","П","С"],months:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthsShort:["Ян","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Ное","Дек"],today:"днес"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.cy.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.cy={days:["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],daysShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],daysMin:["Su","Ll","Ma","Me","Ia","Gwe","Sa"],months:["Ionawr","Chewfror","Mawrth","Ebrill","Mai","Mehefin","Gorfennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthsShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"],today:"Heddiw"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.sw.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.sw={days:["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],daysShort:["J2","J3","J4","J5","Alh","Ij","J1"],daysMin:["2","3","4","5","A","I","1"],months:["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],monthsShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],today:"Leo"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.sl.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.sl={days:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],daysShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],daysMin:["Ne","Po","To","Sr","Če","Pe","So"],months:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danes"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.sq.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.sq={days:["E Diel","E Hënë","E Martē","E Mërkurë","E Enjte","E Premte","E Shtunë"],daysShort:["Die","Hën","Mar","Mër","Enj","Pre","Shtu"],daysMin:["Di","Hë","Ma","Më","En","Pr","Sht"],months:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthsShort:["Jan","Shk","Mar","Pri","Maj","Qer","Korr","Gu","Sht","Tet","Nën","Dhjet"],today:"Sot"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ms.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ms={days:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],daysShort:["Aha","Isn","Sel","Rab","Kha","Jum","Sab"],daysMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],months:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthsShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],today:"Hari Ini",clear:"Bersihkan"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.id.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.id={days:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],daysShort:["Mgu","Sen","Sel","Rab","Kam","Jum","Sab"],daysMin:["Mg","Sn","Sl","Ra","Ka","Ju","Sa"],months:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],monthsShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ags","Sep","Okt","Nov","Des"],today:"Hari Ini",clear:"Kosongkan"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.kk.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.kk={days:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],daysShort:["Жек","Дүй","Сей","Сәр","Бей","Жұм","Сен"],daysMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],months:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthsShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],today:"Бүгін",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.eu.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.eu={days:["Igandea","Astelehena","Asteartea","Asteazkena","Osteguna","Ostirala","Larunbata"],daysShort:["Ig","Al","Ar","Az","Og","Ol","Lr"],daysMin:["Ig","Al","Ar","Az","Og","Ol","Lr"],months:["Urtarrila","Otsaila","Martxoa","Apirila","Maiatza","Ekaina","Uztaila","Abuztua","Iraila","Urria","Azaroa","Abendua"],monthsShort:["Urt","Ots","Mar","Api","Mai","Eka","Uzt","Abu","Ira","Urr","Aza","Abe"],today:"Gaur"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.hr.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.hr={days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],daysMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],months:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthsShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],today:"Danas"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.nb.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.nb={days:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],daysShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],daysMin:["Sø","Ma","Ti","On","To","Fr","Lø"],months:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],monthsShort:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],today:"I Dag",format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.az.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.az={days:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],daysShort:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],daysMin:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],months:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthsShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],today:"Bu gün",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.mk.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.mk={days:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],daysShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],daysMin:["Не","По","Вт","Ср","Че","Пе","Са"],months:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthsShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],today:"Денес",format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.mn.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.mn={days:["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],daysShort:["Ням","Дав","Мяг","Лха","Пүр","Баа","Бям"],daysMin:["Ня","Да","Мя","Лх","Пү","Ба","Бя"],months:["Хулгана","Үхэр","Бар","Туулай","Луу","Могой","Морь","Хонь","Бич","Тахиа","Нохой","Гахай"],monthsShort:["Хул","Үхэ","Бар","Туу","Луу","Мог","Мор","Хон","Бич","Тах","Нох","Гах"],today:"Өнөөдөр",clear:"Тодорхой",format:"yyyy.mm.dd",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.th.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.th={days:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัส","ศุกร์","เสาร์","อาทิตย์"],daysShort:["อา","จ","อ","พ","พฤ","ศ","ส","อา"],daysMin:["อา","จ","อ","พ","พฤ","ศ","ส","อา"],months:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthsShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],today:"วันนี้"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.is.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.is={days:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],daysShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],daysMin:["Su","Má","Þr","Mi","Fi","Fö","La"],months:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthsShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],today:"Í Dag"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.rs.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.rs={days:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],daysShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],daysMin:["Н","По","У","Ср","Ч","Пе","Су"],months:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthsShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],today:"Данас",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.sr.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.sr={days:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],daysShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],daysMin:["Н","По","У","Ср","Ч","Пе","Су"],months:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthsShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],today:"Данас",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.bs.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.bs={days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],daysMin:["N","Po","U","Sr","Č","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.fo.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.fo={days:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leygardagur"],daysShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],daysMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],months:["Januar","Februar","Marts","Apríl","Mei","Juni","Juli","August","Septembur","Oktobur","Novembur","Desembur"],monthsShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],today:"Í Dag",clear:"Reinsa"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.lv.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.lv={days:["Svētdiena","Pirmdiena","Otrdiena","Trešdiena","Ceturtdiena","Piektdiena","Sestdiena"],daysShort:["Sv","P","O","T","C","Pk","S"],daysMin:["Sv","Pr","Ot","Tr","Ce","Pk","Se"],months:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthsShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],today:"Šodien",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ro.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ro={days:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],daysShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],daysMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],months:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthsShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],today:"Astăzi",clear:"Șterge",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.tr.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.tr={days:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],daysShort:["Pz","Pzt","Sal","Çrş","Prş","Cu","Cts"],daysMin:["Pz","Pzt","Sa","Çr","Pr","Cu","Ct"],months:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthsShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],today:"Bugün",clear:"Temizle",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.fa.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.fa={days:["یک‌شنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنج‌شنبه","جمعه","شنبه","یک‌شنبه"],daysShort:["یک","دو","سه","چهار","پنج","جمعه","شنبه","یک"],daysMin:["ی","د","س","چ","پ","ج","ش","ی"],months:["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthsShort:["ژان","فور","مار","آور","مه","ژون","ژوی","اوت","سپت","اکت","نوا","دسا"],today:"امروز",clear:"پاک کن",weekStart:1,format:"yyyy/mm/dd"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.rs-latin.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["rs-latin"]={days:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],daysMin:["N","Po","U","Sr","Č","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.sk.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.sk={days:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],daysShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],daysMin:["Ne","Po","Ut","St","Št","Pia","So"],months:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],today:"Dnes",clear:"Vymazať",weekStart:1,format:"d.m.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.sr-latin.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["sr-latin"]={days:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],daysMin:["N","Po","U","Sr","Č","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.sv.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.sv={days:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],daysShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],daysMin:["Sö","Må","Ti","On","To","Fr","Lö"],months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],today:"Idag",format:"yyyy-mm-dd",weekStart:1,clear:"Rensa"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ar.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ar={days:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],daysShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت","أحد"],daysMin:["ح","ن","ث","ع","خ","ج","س","ح"],months:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthsShort:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],today:"هذا اليوم",rtl:!0}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.da.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.da={days:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],daysShort:["søn","man","tir","ons","tor","fre","lør"],daysMin:["sø","ma","ti","on","to","fr","lø"],months:["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],monthsShort:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],today:"I Dag",clear:"Nulstil",weekStart:1,format:"dd-mm-yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.gl.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.gl={days:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],daysShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],daysMin:["Do","Lu","Ma","Me","Xo","Ve","Sa"],months:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthsShort:["Xan","Feb","Mar","Abr","Mai","Xun","Xul","Ago","Sep","Out","Nov","Dec"],today:"Hoxe",clear:"Limpar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.kh.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.kh={days:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],daysShort:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],daysMin:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],months:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthsShort:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],today:"ថ្ងៃនេះ",clear:"សំអាត"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.km.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.km={days:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],daysShort:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],daysMin:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],months:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthsShort:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],today:"ថ្ងៃនេះ",clear:"សំអាត"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.no.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.no={days:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],daysShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],daysMin:["Sø","Ma","Ti","On","To","Fr","Lø"],months:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],monthsShort:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],today:"I dag",clear:"Nullstill",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ar-tn.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["ar-tn"]={days:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],daysShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت","أحد"],daysMin:["ح","ن","ث","ع","خ","ج","س","ح"],months:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthsShort:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],today:"هذا اليوم",rtl:!0}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.me.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.me={days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],daysMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,clear:"Izbriši",format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.pt.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.pt={days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],daysShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],daysMin:["Do","Se","Te","Qu","Qu","Se","Sa"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthsShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],today:"Hoje",monthsTitle:"Meses",clear:"Limpar",format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ru.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ru={days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],daysShort:["Вск","Пнд","Втр","Срд","Чтв","Птн","Суб"],daysMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Сегодня",clear:"Очистить",format:"dd.mm.yyyy",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.cs.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.cs={days:["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],daysShort:["Ned","Pon","Úte","Stř","Čtv","Pát","Sob"],daysMin:["Ne","Po","Út","St","Čt","Pá","So"],months:["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],monthsShort:["Led","Úno","Bře","Dub","Kvě","Čer","Čnc","Srp","Zář","Říj","Lis","Pro"],today:"Dnes",clear:"Vymazat",monthsTitle:"Měsíc",weekStart:1,format:"dd.m.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.pt-BR.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["pt-BR"]={days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],daysShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],daysMin:["Do","Se","Te","Qu","Qu","Se","Sa"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthsShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],today:"Hoje",monthsTitle:"Meses",clear:"Limpar",format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.eo.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.eo={days:["dimanĉo","lundo","mardo","merkredo","ĵaŭdo","vendredo","sabato"],daysShort:["dim.","lun.","mar.","mer.","ĵaŭ.","ven.","sam."],daysMin:["d","l","ma","me","ĵ","v","s"],months:["januaro","februaro","marto","aprilo","majo","junio","julio","aŭgusto","septembro","oktobro","novembro","decembro"],monthsShort:["jan.","feb.","mar.","apr.","majo","jun.","jul.","aŭg.","sep.","okt.","nov.","dec."],today:"Hodiaŭ",clear:"Nuligi",weekStart:1,format:"yyyy-mm-dd"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.it-CH.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.it={days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],daysShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],daysMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthsShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],today:"Oggi",clear:"Cancella",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.uk.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.uk={days:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"],daysShort:["Нед","Пнд","Втр","Срд","Чтв","Птн","Суб"],daysMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Cічень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthsShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],today:"Сьогодні",clear:"Очистити",format:"dd.mm.yyyy",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.vi.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.vi={days:["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"],daysShort:["CN","Thứ 2","Thứ 3","Thứ 4","Thứ 5","Thứ 6","Thứ 7"],daysMin:["CN","T2","T3","T4","T5","T6","T7"],months:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],monthsShort:["Th1","Th2","Th3","Th4","Th5","Th6","Th7","Th8","Th9","Th10","Th11","Th12"],today:"Hôm nay",clear:"Xóa",format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ca.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ca={days:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"],daysShort:["Diu","Dil","Dmt","Dmc","Dij","Div","Dis"],daysMin:["dg","dl","dt","dc","dj","dv","ds"],months:["Gener","Febrer","Març","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],monthsShort:["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Des"],today:"Avui",monthsTitle:"Mesos",clear:"Esborrar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.es.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.es={days:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],daysShort:["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"],daysMin:["Do","Lu","Ma","Mi","Ju","Vi","Sa"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthsShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],today:"Hoy",monthsTitle:"Meses",clear:"Borrar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.fr-CH.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.fr={days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["D","L","Ma","Me","J","V","S"],months:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Jui","Jul","Aou","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.hy.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.hy={days:["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"],daysShort:["Կրկ","Երկ","Երք","Չրք","Հնգ","Ուր","Շբթ"],daysMin:["Կրկ","Երկ","Երք","Չրք","Հնգ","Ուր","Շբթ"],months:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthsShort:["Հուն","Փետ","Մար","Ապր","Մայ","Հնս","Հլս","Օգս","Սեպ","Հոկ","Նմբ","Դեկ"],today:"Այսօր",clear:"Ջնջել",format:"dd.mm.yyyy",weekStart:1}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.ka.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.ka={days:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],daysShort:["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],daysMin:["კვ","ორ","სა","ოთ","ხუ","პა","შა"],months:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომები","ნოემბერი","დეკემბერი"],monthsShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],today:"დღეს",clear:"გასუფთავება",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.nl.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.nl={days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],daysShort:["zo","ma","di","wo","do","vr","za"],daysMin:["zo","ma","di","wo","do","vr","za"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthsShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],today:"Vandaag",monthsTitle:"Maanden",clear:"Wissen",weekStart:1,format:"dd-mm-yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.de.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.de={days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fre","Sam"],daysMin:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",monthsTitle:"Monate",clear:"Löschen",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.hu.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.hu={days:["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],daysShort:["vas","hét","ked","sze","csü","pén","szo"],daysMin:["V","H","K","Sze","Cs","P","Szo"],months:["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],monthsShort:["jan","feb","már","ápr","máj","jún","júl","aug","sze","okt","nov","dec"],today:"ma",weekStart:1,clear:"töröl",titleFormat:"yyyy. MM",format:"yyyy.mm.dd"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.en-AU.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["en-AU"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"d/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.en-GB.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["en-GB"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.en-IE.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["en-IE"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.en-NZ.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["en-NZ"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"d/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.en-ZA.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["en-ZA"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"yyyy/mm/d"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.fi.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.fi={days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],daysShort:["sun","maa","tii","kes","tor","per","lau"],daysMin:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],monthsShort:["tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mar","jou"],today:"tänään",clear:"Tyhjennä",weekStart:1,format:"d.m.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.it.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.it={days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],daysShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],daysMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthsShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],today:"Oggi",monthsTitle:"Mesi",clear:"Cancella",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.el.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.el={days:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],daysShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],daysMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],months:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthsShort:["Ιαν","Φεβ","Μαρ","Απρ","Μάι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],today:"Σήμερα",clear:"Καθαρισμός",weekStart:1,format:"d/m/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.et.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.et={days:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],daysShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],daysMin:["P","E","T","K","N","R","L"],months:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthsShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],today:"Täna",clear:"Tühjenda",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.nl-BE.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates["nl-BE"]={days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],daysShort:["zo","ma","di","wo","do","vr","za"],daysMin:["zo","ma","di","wo","do","vr","za"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthsShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],today:"Vandaag",monthsTitle:"Maanden",clear:"Leegmaken",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/css/reset.css: -------------------------------------------------------------------------------- 1 | body,h1,h2,h3,h4,h5,h6,p,dl,dd,select,form,ul,ol,input,textarea,header{margin:0;padding:0} 2 | 3 | body{font-family:'Microsoft Yahei';font-size:12px;background-color:#efefef} 4 | 5 | ul,ol{list-style:none;} 6 | 7 | img{border:none;} 8 | 9 | a{text-decoration:none;} 10 | 11 | h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;} 12 | 13 | .clearfix:before,.clearfix:after{content:"";display:table;} 14 | .clearfix:after{clear:both;} 15 | .clearfix{zoom:1;} 16 | 17 | .fl{float:left} 18 | .fr{float:right} 19 | 20 | .pointer{cursor: pointer;} 21 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.fr.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.fr={days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],daysShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],daysMin:["d","l","ma","me","j","v","s"],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthsShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.pl.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.pl={days:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],daysShort:["Niedz.","Pon.","Wt.","Śr.","Czw.","Piąt.","Sob."],daysMin:["Ndz.","Pn.","Wt.","Śr.","Czw.","Pt.","Sob."],months:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthsShort:["Sty.","Lut.","Mar.","Kwi.","Maj","Cze.","Lip.","Sie.","Wrz.","Paź.","Lis.","Gru."],today:"Dzisiaj",weekStart:1,clear:"Wyczyść",format:"dd.mm.yyyy"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.lt.min.js: -------------------------------------------------------------------------------- 1 | !function(a){a.fn.datepicker.dates.lt={days:["Sekmadienis","Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis"],daysShort:["S","Pr","A","T","K","Pn","Š"],daysMin:["Sk","Pr","An","Tr","Ke","Pn","Št"],months:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthsShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],today:"Šiandien",monthsTitle:"Mėnesiai",clear:"Išvalyti",weekStart:1,format:"yyyy-mm-dd"}}(jQuery); -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /migrations/script.py.mako: -------------------------------------------------------------------------------- 1 | """${message} 2 | 3 | Revision ID: ${up_revision} 4 | Revises: ${down_revision | comma,n} 5 | Create Date: ${create_date} 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | ${imports if imports else ""} 11 | 12 | # revision identifiers, used by Alembic. 13 | revision = ${repr(up_revision)} 14 | down_revision = ${repr(down_revision)} 15 | branch_labels = ${repr(branch_labels)} 16 | depends_on = ${repr(depends_on)} 17 | 18 | 19 | def upgrade(): 20 | ${upgrades if upgrades else "pass"} 21 | 22 | 23 | def downgrade(): 24 | ${downgrades if downgrades else "pass"} 25 | -------------------------------------------------------------------------------- /tasks/task_sms.py: -------------------------------------------------------------------------------- 1 | from celery import Celery 2 | from libs.YunTongXun.SendTemplateSMS import CCP 3 | 4 | 5 | celery_app = Celery('sms_tasks', broker='redis://127.0.0.1:6379/3') 6 | 7 | 8 | @celery_app.task 9 | def send_sms(to, datas, tempId): 10 | """ 发送短信的异步任务 11 | 12 | Args: 13 | to: str 接收者的手机号, 也可以是多个, 如: "131..., 132..., ..." 14 | datas: list 或 '' 发送的内容数据列表(内容需为字符串) 15 | 如: ['验证码', '失效分钟'] 如没有内容请填写'' 16 | tempId: str 模板Id (免费测试的模板Id为1) 17 | Returns: 18 | 成功: 0 19 | 失败: -1 20 | 21 | """ 22 | ccp = CCP() 23 | ccp.sendTemplateSMS(to, datas, tempId) 24 | return '-->发送成功' 25 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /utils/commons.py: -------------------------------------------------------------------------------- 1 | from flask import session, jsonify, g 2 | from .response_code import RET 3 | # 这是python的标准模块, 专门提供函数的工具 4 | import functools 5 | 6 | 7 | # 自定义验证登录状态装饰器 8 | def login_required(view_func): 9 | """ 登录验证装饰器 10 | 11 | 如果验证成功, 则执行视图函数, 否则, 返回json错误信息, 提示用户未登录 12 | """ 13 | @functools.wraps(view_func) 14 | def wrapper(*args, **kwargs): 15 | # 判断用户的登录状态 16 | user_id = session.get('user_id') 17 | 18 | # 如果用户是登录的, 执行视图函数 19 | if user_id is not None: 20 | # 将user_id保存到g对象中, 在视图函数中可以通过g对象获取保存的数据 21 | g.user_id = user_id 22 | return view_func(*args, **kwargs) 23 | else: 24 | # 如果未登录, RET.返回 SESSIONERR = "4101" 25 | return jsonify(errcode=RET.SESSIONERR, errmsg="用户未登录") 26 | 27 | return wrapper 28 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /migrations/alembic.ini: -------------------------------------------------------------------------------- 1 | # A generic, single database configuration. 2 | 3 | [alembic] 4 | # template used to generate migration files 5 | # file_template = %%(rev)s_%%(slug)s 6 | 7 | # set to 'true' to run the environment during 8 | # the 'revision' command, regardless of autogenerate 9 | # revision_environment = false 10 | 11 | 12 | # Logging configuration 13 | [loggers] 14 | keys = root,sqlalchemy,alembic 15 | 16 | [handlers] 17 | keys = console 18 | 19 | [formatters] 20 | keys = generic 21 | 22 | [logger_root] 23 | level = WARN 24 | handlers = console 25 | qualname = 26 | 27 | [logger_sqlalchemy] 28 | level = WARN 29 | handlers = 30 | qualname = sqlalchemy.engine 31 | 32 | [logger_alembic] 33 | level = INFO 34 | handlers = 35 | qualname = alembic 36 | 37 | [handler_console] 38 | class = StreamHandler 39 | args = (sys.stderr,) 40 | level = NOTSET 41 | formatter = generic 42 | 43 | [formatter_generic] 44 | format = %(levelname)-5.5s [%(name)s] %(message)s 45 | datefmt = %H:%M:%S 46 | -------------------------------------------------------------------------------- /ihome/static_html.py: -------------------------------------------------------------------------------- 1 | # from . import app_index, db 2 | from flask import Blueprint, current_app, make_response 3 | from flask_wtf import csrf 4 | from api_1_0.user import models 5 | from api_1_0.order import models 6 | from api_1_0.house import models 7 | 8 | 9 | # 提供静态页面蓝图 10 | static_html = Blueprint('static_html', __name__) 11 | 12 | 13 | @static_html.route('/', defaults={'html_file_path': ''}) 14 | @static_html.route('/') 15 | def index(html_file_path): 16 | """ 接收html文件的路径 """ 17 | if not html_file_path: 18 | html_file_path = 'index.html' 19 | 20 | if html_file_path != 'favicon.ico': 21 | html_file_path = 'html/' + html_file_path 22 | 23 | # 创建一个csrf_token值 24 | csrf_token = csrf.generate_csrf() 25 | 26 | # 我们需要使用make_response将返回的静态页面, 封装在响应体里面, 得到响应对象 27 | resp = make_response(current_app.send_static_file(html_file_path)) 28 | 29 | # 设置cookie值 30 | resp.set_cookie('csrf_token', csrf_token) 31 | 32 | return resp 33 | -------------------------------------------------------------------------------- /utils/response_code.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | 3 | 4 | class RET: 5 | OK = "0" 6 | DBERR = "4001" 7 | NODATA = "4002" 8 | DATAEXIST = "4003" 9 | DATAERR = "4004" 10 | SESSIONERR = "4101" 11 | LOGINERR = "4102" 12 | PARAMERR = "4103" 13 | USERERR = "4104" 14 | ROLEERR = "4105" 15 | PWDERR = "4106" 16 | REQERR = "4201" 17 | IPERR = "4202" 18 | THIRDERR = "4301" 19 | IOERR = "4302" 20 | SERVERERR = "4500" 21 | UNKOWNERR = "4501" 22 | 23 | error_map = { 24 | RET.OK: "成功", 25 | RET.DBERR: "数据库查询错误", 26 | RET.NODATA: "无数据", 27 | RET.DATAEXIST: "数据已存在", 28 | RET.DATAERR: "数据错误", 29 | RET.SESSIONERR: "用户未登录", 30 | RET.LOGINERR: "用户登录失败", 31 | RET.PARAMERR: "参数错误", 32 | RET.USERERR: "用户不存在或未激活", 33 | RET.ROLEERR: "用户身份错误", 34 | RET.PWDERR: "密码错误", 35 | RET.REQERR: "非法请求或请求次数受限", 36 | RET.IPERR: "IP受限", 37 | RET.THIRDERR: "第三方系统错误", 38 | RET.IOERR: "文件读写错误", 39 | RET.SERVERERR: "内部错误", 40 | RET.UNKOWNERR: "未知错误", 41 | } 42 | -------------------------------------------------------------------------------- /ihome/static/plugins/simple-line-icons/Readme.txt: -------------------------------------------------------------------------------- 1 | SIMPLE LINE ICONS 2 | ====================================================================================== 3 | 4 | Simple Line Icons is 162 simple stroke icons that are great for mobile applications, 5 | websites, user interfaces, etc. All icons were converted from the same beautiful 6 | simple line icon sets released previously on GraphicBurger. 7 | 8 | You can checkout the vector PSD versions of these icons on the following links 9 | 10 | * http://graphicburger.com/simple-line-icons-set-vol-1/ 11 | * http://graphicburger.com/simple-line-icons-set-vol-2/ 12 | * http://graphicburger.com/simple-line-icons-set-vol-3/ 13 | * http://graphicburger.com/simple-line-icons-set-vol-4/ 14 | 15 | To modify your generated font, use the *dev.svg* file, located in the *fonts* folder in 16 | this package. You can import this dev.svg file to the IcoMoon app. All the tags (class 17 | names) and the Unicode points of your glyphs are saved in this file. 18 | 19 | These fonts converted to SVG using Illustrator, the SVG was then converted into a font 20 | using the awesome Icooon app (http://icomoon.io/app) 21 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/login.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 20px; 3 | padding-bottom: 20px; 4 | background-color: #fff; 5 | } 6 | .container { 7 | padding-right: 5px; 8 | padding-left: 5px; 9 | } 10 | .logo-bar { 11 | width: 128px; 12 | height: 59px; 13 | margin: 10px auto; 14 | } 15 | .form-login { 16 | max-width: 330px; 17 | padding: 10px; 18 | margin: 0 auto; 19 | } 20 | .input-group-addon { 21 | background-color: #fff; 22 | color: #959ea7; 23 | padding: 6px; 24 | } 25 | .input-group-addon, .form-control { 26 | border: 1px solid #dcdbdb; 27 | } 28 | .fa-fw { 29 | width: 30px; 30 | } 31 | .form-login .form-control { 32 | position: relative; 33 | height: auto; 34 | -webkit-box-sizing: border-box; 35 | -moz-box-sizing: border-box; 36 | box-sizing: border-box; 37 | padding: 10px; 38 | font-size: 16px; 39 | } 40 | .form-login .form-control:focus { 41 | z-index: 2; 42 | } 43 | .register-a { 44 | text-align: right; 45 | margin-top: 16px; 46 | font-size: 14px; 47 | } 48 | .error-msg { 49 | display: none; 50 | font-size: 14px; 51 | color: red; 52 | margin: -10px 0px 10px 50px; 53 | } 54 | .error-msg i { 55 | margin-right: 5px; 56 | } -------------------------------------------------------------------------------- /ihome/static/js/ihome/my.js: -------------------------------------------------------------------------------- 1 | new Vue({ 2 | el: "#v-container", 3 | data: { 4 | 5 | }, 6 | methods: { 7 | getCookie: function(name) { 8 | var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); 9 | return r ? r[1] : undefined; 10 | }, 11 | 12 | // 获取用户信息 13 | getUserMsg: function(){ 14 | this.$http.get('/api/1.0/user/get-user-msg').then(function(res){ 15 | if (res.data.errcode == "4101") { 16 | location.href = "/login.html"; 17 | }else{ 18 | this.$refs.userImage.src = res.data.image_url; 19 | this.$refs.username.innerHTML = res.data.username; 20 | this.$refs.mobile.innerHTML = res.data.mobile; 21 | } 22 | }) 23 | }, 24 | 25 | 26 | // 用户退出 27 | userLogout: function(){ 28 | let headers = { 29 | "X-CSRFToken": this.getCookie("csrf_token") 30 | }; 31 | this.$http.delete("/api/1.0/user/session", {headers: headers}).then(function(res){ 32 | if(res.body.errcode == "0"){ 33 | location.href = "/"; 34 | } 35 | }) 36 | }, 37 | }, 38 | 39 | 40 | mounted: function() { 41 | // 页面加载获取用户信息 42 | this.getUserMsg(); 43 | }, 44 | }) 45 | -------------------------------------------------------------------------------- /utils/image_storage.py: -------------------------------------------------------------------------------- 1 | from qiniu import Auth, put_file, put_data, etag, put_data 2 | import qiniu.config 3 | 4 | 5 | def storage(host, file_data): 6 | """ 上传文件到七牛云 7 | 8 | Args: 9 | host: 需要上传的对象空间域名, 如: http://image.weidong168.com 10 | file_data: 需要上传的文件(二进制数据) 11 | Returns: 12 | 图片完整的连接地址, 如: http://image.weidong168.com/Ftn-lOypD-zqUGdSvTM0npx5c1IP 13 | 14 | """ 15 | # 需要填写你的 Access Key 和 Secret Key 16 | access_key = '填写你的Access Key' 17 | secret_key = '填写你的Secret Key' 18 | 19 | # 构建鉴权对象 20 | q = Auth(access_key, secret_key) 21 | # 要上传的空间 22 | bucket_name = '填写你的对象存储空间名' 23 | # 上传后保存的文件名 24 | key = None 25 | 26 | # 生成上传 Token,可以指定过期时间等 27 | token = q.upload_token(bucket_name, key, 3600) 28 | 29 | # 上传在线文件 30 | ret, info = put_data(token, key, file_data) 31 | 32 | # print(ret) 33 | # print('=' * 50) 34 | # print(info) 35 | 36 | # 这个断言, 只是用来检查上传的文件名是不是key的值, 通常不需要 37 | # assert ret['key'] == key 38 | # assert ret['hash'] == etag(localfile) 39 | 40 | if info.status_code == 200: 41 | return '{}/{}'.format(host, ret.get('key')) 42 | else: 43 | raise Exception('图片上传至七牛云失败') 44 | 45 | 46 | if __name__ == '__main__': 47 | with open('/home/xuetianyyy/桌面/douyu_img/252.jpg', 'rb') as f: 48 | file_data = f.read() 49 | 50 | storage('http://image.weidong168.com', file_data) 51 | -------------------------------------------------------------------------------- /ihome/static/css/mui.poppicker.css: -------------------------------------------------------------------------------- 1 | .mui-poppicker { 2 | position: fixed; 3 | left: 0px; 4 | width: 100%; 5 | z-index: 999; 6 | background-color: #eee; 7 | border-top: solid 1px #ccc; 8 | box-shadow: 0px -5px 7px 0px rgba(0, 0, 0, 0.1); 9 | -webkit-transition: .3s; 10 | bottom: 0px; 11 | -webkit-transform: translateY(300px); 12 | } 13 | .mui-poppicker.mui-active { 14 | -webkit-transform: translateY(0px); 15 | } 16 | .mui-android-5-1 .mui-poppicker { 17 | bottom: -300px; 18 | -webkit-transition-property: bottom; 19 | -webkit-transform: none; 20 | } 21 | .mui-android-5-1 .mui-poppicker.mui-active { 22 | bottom: 0px; 23 | -webkit-transition-property: bottom; 24 | -webkit-transform: none; 25 | } 26 | .mui-poppicker-header { 27 | padding: 6px; 28 | font-size: 14px; 29 | color: #888; 30 | } 31 | .mui-poppicker-header .mui-btn { 32 | font-size: 12px; 33 | padding: 5px 10px; 34 | } 35 | .mui-poppicker-btn-cancel { 36 | float: left; 37 | } 38 | .mui-poppicker-btn-ok { 39 | float: right; 40 | } 41 | .mui-poppicker-clear { 42 | clear: both; 43 | height: 0px; 44 | line-height: 0px; 45 | font-size: 0px; 46 | overflow: hidden; 47 | } 48 | .mui-poppicker-body { 49 | position: relative; 50 | width: 100%; 51 | height: 200px; 52 | border-top: solid 1px #ddd; 53 | /*-webkit-perspective: 1200px; 54 | perspective: 1200px; 55 | -webkit-transform-style: preserve-3d; 56 | transform-style: preserve-3d;*/ 57 | } 58 | .mui-poppicker-body .mui-picker { 59 | width: 100%; 60 | height: 100%; 61 | margin: 0px; 62 | border: none; 63 | float: left; 64 | } -------------------------------------------------------------------------------- /ihome/static/css/ihome/register.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 20px; 3 | padding-bottom: 20px; 4 | background-color: #fff; 5 | } 6 | .container { 7 | padding-right: 5px; 8 | padding-left: 5px; 9 | } 10 | .logo-bar { 11 | width: 128px; 12 | height: 59px; 13 | margin: 10px auto; 14 | } 15 | .form-register { 16 | max-width: 330px; 17 | padding: 10px; 18 | margin: 0 auto; 19 | } 20 | .input-group-addon { 21 | background-color: #fff; 22 | color: #959ea7; 23 | padding: 6px; 24 | } 25 | .input-group-addon, .form-control { 26 | border: 1px solid #dcdbdb; 27 | } 28 | .fa-fw { 29 | width: 30px; 30 | } 31 | .phonecode { 32 | background-color: #eeedf1; 33 | padding: 6px 4px; 34 | width: 90px; 35 | text-align: center; 36 | } 37 | .phonecode-a { 38 | font-size: 16px; 39 | color: #797878; 40 | } 41 | .phonecode-a:focus, .phonecode-a:hover { 42 | text-decoration: none; 43 | color: #797878; 44 | } 45 | .form-register .form-control { 46 | position: relative; 47 | height: auto; 48 | -webkit-box-sizing: border-box; 49 | -moz-box-sizing: border-box; 50 | box-sizing: border-box; 51 | padding: 10px; 52 | font-size: 16px; 53 | } 54 | .form-register .form-control:focus { 55 | z-index: 2; 56 | } 57 | .login-a { 58 | text-align: right; 59 | margin-top: 16px; 60 | font-size: 14px; 61 | } 62 | .image-code { 63 | padding: 0; 64 | } 65 | .image-code img{ 66 | width: 90px; 67 | height: 41px; 68 | } 69 | .error-msg { 70 | display: none; 71 | font-size: 14px; 72 | color: red; 73 | margin: -10px 0px 10px 50px; 74 | } 75 | .error-msg i { 76 | margin-right: 5px; 77 | } -------------------------------------------------------------------------------- /api_1_0/order/app_private_key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpAIBAAKCAQEA2vivPMHym9ehen7GjbAmj9QrF/nMgYRy2w/S+nJP4oj+9DZY 3 | yrkNn8YJXflAfUG/gmqIAk6d1irp6dj9S3X9wjdWIiwNE5PPOXRyDh+E9VcqgZIc 4 | o1SDhIWm1UvaVBnYeSvm3a0wMdUrCXSVEsKhLORNN7GP4rA1bXYfE+axF4BdmtK5 5 | +qc16j8iYzhdj/dX5DYCsjk41rztwkPuy7pZ9QkCYap4XnvK+kih9kBvLyac+kTx 6 | mUuVVkojHTNHM/2Iaexpcs8nQhk4jB/HEcex08YXgpz6T9VRnb4pw9cqEDMpK/7z 7 | 8zokzY+UxquT3k9bYsFx6pFB7MUH1aRE0LZ9uQIDAQABAoIBAQCR8/7B7birPcBJ 8 | aOUpngcmCVKsCXnRvpncACEthDJRGeVunCb1AQHexF6L/86HbuKaqC199C7qiPIf 9 | R94VhVEeOko0Ps58hSIz9rTrSwERkwcnFF/4UiXTmE5Kj+O3+P48ThH1IjIklSS5 10 | ibavqYFK7eW2QKlafP8vtfMjDbpuoYnx5t4RS2HNIR8eDthSuqGQSnxOERFoIzml 11 | GMIPS9h5EsSgzzZWNwr3mFV/qR/Y32WT37xKDkLhKqcxZIzUgUxqgZ2VM2kDJ4a6 12 | fa9XNJ/qBVIj0FzpLHiv5AVDUCIcUxOWGMNaZ8nzZrOyHFWHnEp0uqZwNw/KRawb 13 | GdC9rehdAoGBAPzq60idqE6C/FFCMZPKBBZIfjkOtd9USrB/b9/+lAaPozyrhlLH 14 | trsv2XwcD8O1wOjzFOLW2/wBnPbypn8M0tap60eey0ncSemOh5r1MNd06K9Xd74q 15 | aIPiqZZgFo6sJjZWOl4JwJEzFHVVKlf8mH3Yko7leHEsZRj1if1A8YS3AoGBAN2j 16 | 2y7bw+ycOk/gc3GVIKG1Jts7+aOc93uSpQn0WbqNJzJZJ7WHmE+B1u9fwDwpZr5m 17 | P1uztJyHLaRl4dUjqtggBWXi2QqnfvOOdg9U9e/2Xdwyp9Fs03AM1C/ERtlJJPWM 18 | IUDmZzm+qMTZN1kaHCr9oenvnBmkJfi0Ym8KTQEPAoGBANhUN5uM/oDpGNiIPc+j 19 | Y4uLxisXogi8GIaO+iolnodeJMmoDOSRXoMNkoDNn85OkAqwoJTGIrOSzaeMNU1G 20 | srBZ9pzz/f3XJoFXIDYysuwXW09fCVTnAS6NmXC+D41JQgYICzSUMtn/TuhtSCKq 21 | M+Swces366Uhy/dlTfoIqoxRAoGATeKkxUSpBt6nhyZCqylSfEDiVKwwv5QLS7tu 22 | j570YR/1JDY8RAhQN7BSzW+CaCHMXyAjJ6Bw2YiPO3Qp9fJAuQ4Xl4Qt7RaLAB+R 23 | 0TVz701OEnEik++AJaH8doSsuPKBMGB71wigQaSEPhhu4LrSJzFV0pVG76PFTC5n 24 | YMnn4XUCgYAY6wevVS0MCoOPdkBLHaZit8pqlN1d6pb3YNzK9Pbzaig926vucira 25 | ujpU41LYW7GpLh9MGLT0QrnbRgoBhtLAR2JjFc9/2K8WekFpN9hEE/36JNWlTP34 26 | vbs00Jl8aL6D2vvEkcHMWOwULsRa6MrnkJYFemSzyTkuniscXUhTNw== 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /ihome/static/js/ihome/myhouse.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: "#v-container", 3 | data: { 4 | // 存储用户房屋列表 5 | houses: [], 6 | // 房屋详情信息页面地址, 注意: 它是缺少参数值的 7 | house_detail_url: '/detail.html?house_id=', 8 | }, 9 | 10 | methods: { 11 | getUserAuth: function(){ 12 | this.$http.get('/api/1.0/user/get-real-name').then(function(res){ 13 | if(res.body.errcode == "4101"){ 14 | // 用户未登录 15 | location.href = "/login.html"; 16 | }else if(res.body.errcode == "0"){ 17 | id_card = res.body.data.id_card; 18 | real_name = res.body.data.real_name; 19 | if(id_card && real_name){ 20 | // 显示用户发布房源 21 | this.$refs.housesList.style.cssText = "display: block" 22 | this.$http.get('/api/1.0/house/user-house').then(function(res){ 23 | if(res.body.errcode == "0"){ 24 | // 得到个人房屋对象列表 25 | this.houses = res.body.data.houses; 26 | }else{ 27 | alert(res.body.errmsg) 28 | } 29 | }) 30 | }else{ 31 | this.$refs.authWarn.style.cssText = "display: block" 32 | this.$refs.housesList.style.cssText = "display: none" 33 | } 34 | }else{ 35 | alert(res.body.errmsg) 36 | } 37 | }) 38 | }, 39 | }, 40 | mounted: function(){ 41 | this.$nextTick(function(){ 42 | this.getUserAuth() 43 | console.log(this.houses.length) 44 | }) 45 | 46 | }, 47 | }) 48 | 49 | 50 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /ihome/static/plugins/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/my.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #eee; 3 | } 4 | .container { 5 | padding: 0px; 6 | } 7 | .top-bar { 8 | position: fixed; 9 | width: 100%; 10 | background-color: #eee; 11 | z-index: 2; 12 | } 13 | .nav-bar { 14 | width: 100%; 15 | height: 35px; 16 | text-align: center; 17 | position: relative; 18 | border-bottom: 1px solid #eee; 19 | background-color: #fff; 20 | } 21 | .page-title { 22 | display: block; 23 | line-height: 35px; 24 | font-size: 20px; 25 | } 26 | .nav-btn { 27 | position: absolute; 28 | top: 0; 29 | left: 10px; 30 | color: #000; 31 | font-size: 16px; 32 | } 33 | .menus-con { 34 | min-height: 100%; 35 | margin-top: 38px; 36 | } 37 | .menus-list { 38 | padding: 10px; 39 | } 40 | .menus-list>li { 41 | font-size: 16px; 42 | margin-bottom: 10px; 43 | } 44 | .menu-title { 45 | background-color: #fff; 46 | border-top-left-radius: 5px; 47 | border-top-right-radius: 5px; 48 | border-bottom: 1px solid #eee; 49 | padding: 10px 15px; 50 | } 51 | .menu-radius { 52 | border-radius: 5px; 53 | } 54 | .menu-title>a { 55 | color: #4f4f4f; 56 | text-decoration: none; 57 | } 58 | .menu-title>a :hover { 59 | text-decoration: none; 60 | } 61 | .menu-title>h3 { 62 | display: inline; 63 | } 64 | .menu-content { 65 | background-color: #fff; 66 | border-bottom-left-radius: 5px; 67 | border-bottom-right-radius: 5px; 68 | padding: 10px; 69 | } 70 | .menu-content>img { 71 | width: 30%; 72 | vertical-align: top; 73 | } 74 | .menu-text { 75 | display: inline-block; 76 | width: 63%; 77 | margin-left: 10px; 78 | } 79 | .menu-text>h3 { 80 | font-size: 16px; 81 | white-space: nowrap; 82 | overflow: hidden; 83 | text-overflow: ellipsis; 84 | margin-bottom: 5px; 85 | } 86 | .menu-text>ul>li { 87 | height: 25px; 88 | line-height: 25px; 89 | color: #666; 90 | } -------------------------------------------------------------------------------- /ihome/static/css/ihome/myhouse.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #eee; 3 | } 4 | .container { 5 | padding: 0px; 6 | } 7 | .top-bar { 8 | position: fixed; 9 | width: 100%; 10 | background-color: #eee; 11 | z-index: 2; 12 | } 13 | .nav-bar { 14 | width: 100%; 15 | height: 35px; 16 | text-align: center; 17 | position: relative; 18 | border-bottom: 1px solid #eee; 19 | background-color: #fff; 20 | } 21 | .page-title { 22 | display: block; 23 | line-height: 35px; 24 | font-size: 20px; 25 | } 26 | .nav-btn { 27 | position: absolute; 28 | top: 0; 29 | left: 10px; 30 | color: #000; 31 | font-size: 16px; 32 | } 33 | .houses-con { 34 | min-height: 100%; 35 | margin-top: 38px; 36 | } 37 | .houses-list { 38 | padding: 10px; 39 | } 40 | .houses-list>li { 41 | font-size: 14px; 42 | margin-bottom: 10px; 43 | } 44 | .house-title, .new-house { 45 | background-color: #fff; 46 | border-top-left-radius: 5px; 47 | border-top-right-radius: 5px; 48 | border-bottom: 1px solid #eee; 49 | padding: 10px; 50 | color: #666; 51 | } 52 | .new-house { 53 | border-radius: 5px; 54 | text-align: center; 55 | } 56 | .new-house>a { 57 | font-size: 16px; 58 | text-decoration: none; 59 | color: green; 60 | } 61 | .house-content { 62 | background-color: #fff; 63 | border-bottom-left-radius: 5px; 64 | border-bottom-right-radius: 5px; 65 | padding: 10px; 66 | } 67 | .house-content img { 68 | width: 30%; 69 | vertical-align: top; 70 | } 71 | .house-text { 72 | display: inline-block; 73 | width: 63%; 74 | margin-left: 10px; 75 | } 76 | .house-text>h3 { 77 | font-size: 16px; 78 | white-space: nowrap; 79 | overflow: hidden; 80 | text-overflow: ellipsis; 81 | margin-bottom: 5px; 82 | } 83 | .house-text>ul>li { 84 | height: 25px; 85 | line-height: 25px; 86 | color: #666; 87 | } 88 | .auth-warn { 89 | display: none; 90 | } 91 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/orders.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #eee; 3 | } 4 | .container { 5 | padding: 0px; 6 | } 7 | .top-bar { 8 | position: fixed; 9 | width: 100%; 10 | background-color: #eee; 11 | z-index: 2; 12 | } 13 | .nav-bar { 14 | width: 100%; 15 | height: 35px; 16 | text-align: center; 17 | position: relative; 18 | border-bottom: 1px solid #eee; 19 | background-color: #fff; 20 | } 21 | .page-title { 22 | display: block; 23 | line-height: 35px; 24 | font-size: 20px; 25 | } 26 | .nav-btn { 27 | position: absolute; 28 | top: 0; 29 | left: 10px; 30 | color: #000; 31 | font-size: 16px; 32 | } 33 | .orders-con { 34 | min-height: 100%; 35 | margin-top: 38px; 36 | } 37 | .orders-list { 38 | padding: 10px; 39 | } 40 | .orders-list>li { 41 | font-size: 14px; 42 | margin-bottom: 10px; 43 | } 44 | .order-title { 45 | background-color: #fff; 46 | border-top-left-radius: 5px; 47 | border-top-right-radius: 5px; 48 | border-bottom: 1px solid #eee; 49 | padding: 10px; 50 | color: #666; 51 | } 52 | .order-title>a { 53 | color: #4f4f4f; 54 | text-decoration: none; 55 | } 56 | .order-title>a :hover { 57 | text-decoration: none; 58 | } 59 | .order-title>h3 { 60 | display: inline; 61 | } 62 | .order-content { 63 | background-color: #fff; 64 | border-bottom-left-radius: 5px; 65 | border-bottom-right-radius: 5px; 66 | padding: 10px; 67 | } 68 | .order-content>img { 69 | width: 30%; 70 | vertical-align: top; 71 | } 72 | .order-text { 73 | display: inline-block; 74 | width: 63%; 75 | margin-left: 10px; 76 | } 77 | .order-text>h3 { 78 | font-size: 16px; 79 | white-space: nowrap; 80 | overflow: hidden; 81 | text-overflow: ellipsis; 82 | margin-bottom: 5px; 83 | } 84 | .order-text>ul>li { 85 | height: 25px; 86 | line-height: 25px; 87 | color: #666; 88 | } 89 | .order-operate{ 90 | margin-top: -7px; 91 | } 92 | .order-reject { 93 | margin-left: 10px; 94 | } -------------------------------------------------------------------------------- /api_1_0/order/models.py: -------------------------------------------------------------------------------- 1 | from ihome.models import BaseModel 2 | from ihome import db 3 | 4 | 5 | class Order(BaseModel, db.Model): 6 | """订单""" 7 | 8 | __tablename__ = "ih_order_info" 9 | 10 | id = db.Column(db.Integer, primary_key=True) # 订单编号 11 | user_id = db.Column(db.Integer, db.ForeignKey("ih_user_profile.id"), nullable=False) # 下订单的用户编号 12 | house_id = db.Column(db.Integer, db.ForeignKey("ih_house_info.id"), nullable=False) # 预订的房间编号 13 | begin_date = db.Column(db.DateTime, nullable=False) # 预订的起始时间 14 | end_date = db.Column(db.DateTime, nullable=False) # 预订的结束时间 15 | days = db.Column(db.Integer, nullable=False) # 预订的总天数 16 | house_price = db.Column(db.Integer, nullable=False) # 房屋的单价 17 | amount = db.Column(db.Integer, nullable=False) # 订单的总金额 18 | status = db.Column( # 订单的状态 19 | db.Enum( # 枚举 # django choice 20 | "WAIT_ACCEPT", # 待接单, 21 | "WAIT_PAYMENT", # 待支付 22 | "PAID", # 已支付 23 | "WAIT_COMMENT", # 待评价 24 | "COMPLETE", # 已完成 25 | "CANCELED", # 已取消 26 | "REJECTED" # 已拒单 27 | ), 28 | default="WAIT_ACCEPT", index=True) # 指明在mysql中这个字段建立索引,加快查询速度 29 | comment = db.Column(db.Text) # 订单的评论信息或者拒单原因 30 | trade_no = db.Column(db.String(80)) # 交易的流水号 支付宝的 31 | 32 | def to_dict(self): 33 | """将订单信息转换为字典数据""" 34 | order_dict = { 35 | "order_id": self.id, 36 | "title": self.house.title, 37 | "img_url": self.house.index_image_url if self.house.index_image_url else "", 38 | "start_date": self.begin_date.strftime("%Y-%m-%d"), 39 | "end_date": self.end_date.strftime("%Y-%m-%d"), 40 | "ctime": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 41 | "days": self.days, 42 | "amount": self.amount, 43 | "status": self.status, 44 | "comment": self.comment if self.comment else "" 45 | } 46 | return order_dict 47 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | from datetime import timedelta 2 | import redis 3 | 4 | 5 | class Config(): 6 | """ 配置信息的基类 """ 7 | # 设置session的秘钥, 同是crsf验证也依赖于它 8 | SECRET_KEY = '$&_p%ise9)wf=$mehhy8fw167!#+d4vcv^^r^kijm)+(yw3gq2' 9 | # 配置Mysql数据库, 'mysql://用户名:密码@地址:端口/数据库名' 10 | SQLALCHEMY_DATABASE_URI = 'mysql://root:xxxxxxxx@127.0.0.1:3306/ihome_demo' 11 | # 设置模型类与数据表同步跟踪 12 | SQLALCHEMY_TRACK_MODIFICATIONS = True 13 | # 查询时会显示原始SQL语句 14 | # SQLALCHEMY_ECHO = True 15 | 16 | # redis配置 17 | REDIS_HOST = '127.0.0.1' # redis地址 18 | REDIS_PORT = 6379 # reids端口 19 | REDIS_DB = 6 # redis数据库编号 20 | 21 | # Flask-Session配置 22 | # 指定要使用的会话接口的类型, 可以是redis, mongodb, sqlalchemy等... 23 | SESSION_TYPE = 'redis' 24 | # 注意它必须是一个Redis连接的实例,默认连接到127.0.0.1:6379 25 | SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB) 26 | # 是否对session_id进行混淆, 如果为True, 则必须配置SECRET_KEY秘钥(依赖于它) 27 | SESSION_USE_SIGNER = True 28 | # 设置session的过期时间, 它可以设置detetime对象的时间, 或表示秒数的整数, 例如: 3600, 默认永久有效 29 | PERMANENT_SESSION_LIFETIME = timedelta(hours=1) 30 | 31 | # 设置图片验证码的过期时间/秒 32 | IMAGE_CODE_REDIS_EXPIRE = 100 33 | # 设置短信验证码的过期时间/秒, 注意: 只能设置60的倍数 34 | SMS_CODE_REDIS_EXPIRE = 120 35 | # 用户发送短信验证码的间隔时间/秒, 防止在短时间内重复发送短信 36 | SEND_SMS_CODE_INTERVAL = 60 37 | # 用户最大的登录错误次数限制 38 | LOGIN_ERROR_MAX_NUMS = 5 39 | 40 | # 七牛云存储相关配置,空间域名 41 | QINIU_ZONE_HOST = 'http://image.weidong168.com' 42 | 43 | # 设置获取房源信息的redis缓存时间, 单位/秒 44 | AREA_INFO_REDIS_CACHE_EXPIRES = 3600 * 2 45 | 46 | # 设置首页幻灯片, 热门房源, 以及房屋详情信息的redis缓存时间, 单位/秒 47 | HOME_PAGE_DATA_REDIS_EXPIRES = 3600 * 3 48 | # 设置搜索列表的缓存过期时间/秒 49 | HOUSE_SEARCH_LIST_EXPIRES = 3600 * 1.5 50 | # 获取房屋详情的评论数量 51 | HOUSE_DETAIL_COMMENT_DISPLAY_COUNTS = 10 52 | # 设置房屋列表, 每页展示的房屋查询数量 53 | HOUSE_LIST_PER_PAGE = 10 54 | 55 | # 支付宝网关, 这里是用户需要跳转支付的链接前缀(注意: 这里设置的是沙箱环境) 56 | ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do' 57 | 58 | 59 | class DevelopmentConfig(Config): 60 | """ 用于开发模式的配置信息 """ 61 | # 开启调试模式 62 | DEBUG = True 63 | 64 | 65 | class ProductionConfig(Config): 66 | """ 用于生产模式的配置信息 """ 67 | pass 68 | 69 | 70 | # 提供给app对象的配置映射 71 | config_map = { 72 | 'develop': DevelopmentConfig, 73 | 'product': ProductionConfig, 74 | } 75 | -------------------------------------------------------------------------------- /ihome/static/html/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 爱家-登陆 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | 37 |
38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /libs/YunTongXun/SendTemplateSMS.py: -------------------------------------------------------------------------------- 1 | from .CCPRestSDK import REST 2 | 3 | # 说明:主账号,登陆云通讯网站后,可在控制台首页中看到开发者主账号ACCOUNT SID。 4 | accountSid = '开发者主账号ACCOUNT SID' 5 | 6 | # 说明:主账号Token,登陆云通讯网站后,可在控制台首页中看到开发者主账号AUTH TOKEN 7 | accountToken = '开发者主账号AUTH TOKEN' 8 | 9 | # 请使用管理控制台中已创建应用的APPID, 注意: 测试环境只能使用未上线的应用 10 | appId = '应用的APPID' 11 | 12 | # 说明:请求地址,生产环境配置成app.cloopen.com 13 | serverIP = 'app.cloopen.com' 14 | 15 | # 说明:请求端口 ,生产环境为8883 16 | serverPort = '8883' 17 | 18 | # 说明:REST API版本号保持不变 19 | softVersion = '2013-12-26' 20 | 21 | 22 | class CCP: 23 | """ 自己封装的发送短信辅助类 """ 24 | 25 | # 用来记录第一个被实例化的引用 26 | instance = None 27 | 28 | def __new__(cls): 29 | # 判断是否存在实例的引用 30 | if cls.instance is None: 31 | # 如果不存在, 则引用父类为该实例分配空间(引用) 32 | obj = super().__new__(cls) 33 | 34 | # 初始化REST SDK, 这里的obj就相当于当前实例对象的self, 这可以保证它只被初始化一次 35 | obj.rest = REST(serverIP, serverPort, softVersion) 36 | obj.rest.setAccount(accountSid, accountToken) 37 | obj.rest.setAppId(appId) 38 | cls.instance = obj 39 | 40 | # 如果存在实例, 则返回该实例的固定引用 41 | return cls.instance 42 | 43 | def sendTemplateSMS(self, to, datas, tempId): 44 | """ 发送短信的方法 45 | 46 | Args: 47 | to: str 接收者的手机号, 也可以是多个, 如: "131..., 132..., ..." 48 | datas: list 或 '' 发送的内容数据列表(内容需为字符串) 49 | 如: ['验证码', '失效分钟'] 如没有内容请填写'' 50 | tempId: str 模板Id (免费测试的模板Id为1) 51 | Returns: 52 | 成功: 0 53 | 失败: -1 54 | 55 | """ 56 | result = self.rest.sendTemplateSMS(to, datas, tempId) 57 | 58 | # 打印响应信息 59 | # for k, v in result.items(): 60 | 61 | # if k == 'templateSMS': 62 | # for k, s in v.items(): 63 | # print('{}:{}'.format(k, s)) 64 | # else: 65 | # print('{}:{}'.format(k, v)) 66 | 67 | # 获取响应码 68 | status_code = result.get('statusCode') 69 | if status_code == '000000': 70 | # 表示发送成功 71 | return 0 72 | else: 73 | # 发送失败 74 | return -1 75 | 76 | if __name__ == '__main__': 77 | ccp = CCP() 78 | ccp.sendTemplateSMS('18664685380', ['12345', '2'], '1') 79 | -------------------------------------------------------------------------------- /ihome/static/html/payComplete.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 爱家-我的订单 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 22 |
23 |
24 |

支付已完成

25 | 回到我的订单 26 |
27 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 53 | 54 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/booking.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #eee; 3 | } 4 | .container { 5 | padding: 0px; 6 | } 7 | .top-bar { 8 | position: fixed; 9 | width: 100%; 10 | background-color: #eee; 11 | z-index: 2; 12 | } 13 | .nav-bar { 14 | width: 100%; 15 | height: 35px; 16 | text-align: center; 17 | position: relative; 18 | border-bottom: 1px solid #eee; 19 | background-color: #fff; 20 | } 21 | .page-title { 22 | display: block; 23 | line-height: 35px; 24 | font-size: 20px; 25 | } 26 | .nav-btn { 27 | position: absolute; 28 | top: 0; 29 | left: 10px; 30 | color: #000; 31 | font-size: 16px; 32 | } 33 | .house-info { 34 | background-color: #fff; 35 | margin-top: 38px; 36 | padding: 10px; 37 | } 38 | .house-info>img { 39 | width: 30%; 40 | } 41 | .house-text { 42 | display: inline-block; 43 | width: 65%; 44 | font-size: 14px; 45 | color: #999; 46 | vertical-align: middle; 47 | margin-left: 10px; 48 | } 49 | .house-text>h3 { 50 | font-size: 16px; 51 | color: #000; 52 | } 53 | .select-date { 54 | background-color: #fff; 55 | margin: 10px; 56 | border-radius: 5px; 57 | } 58 | .input-daterange>input { 59 | font-size: 14px; 60 | } 61 | .select-date-header { 62 | padding: 5px 10px; 63 | border-bottom: 1px solid #eee; 64 | font-size: 13px; 65 | color: #666; 66 | } 67 | .input-daterange { 68 | padding: 5px; 69 | } 70 | .submit-order { 71 | position: fixed; 72 | bottom: 0px; 73 | width: 100%; 74 | height: 45px; 75 | line-height: 45px; 76 | font-size: 16px; 77 | background-color: #fff; 78 | color: #f05b72; 79 | } 80 | .order-amount { 81 | padding-left: 10px; 82 | } 83 | .submit-btn { 84 | display: inline-block; 85 | width: 33%; 86 | float: right; 87 | background-color: #ff6666; 88 | color: #fff; 89 | text-align: center; 90 | } 91 | .popup_con{display:none;} 92 | .popup{width:300px;height:150px;position:fixed; 93 | left:50%; 94 | margin-left:-150px; 95 | top:50%; 96 | margin-top:-75px; 97 | z-index:1000; 98 | } 99 | 100 | .popup p{height:150px;line-height:150px;text-align:center;font-size:18px;} 101 | 102 | .mask{width:100%;height:100%;position:fixed;left:0;top:0;background-color:#000;opacity:0.3;z-index:999;} 103 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 3px; 3 | background-color: #fff; 4 | } 5 | .container { 6 | padding: 0px; 7 | } 8 | .top-bar { 9 | width: 100%; 10 | height: 55px; 11 | border-bottom: 1px solid #f8a8a8; 12 | } 13 | .logo { 14 | width: 110px; 15 | height: 50px; 16 | margin-left: 15px; 17 | } 18 | .register-login { 19 | height: 50px; 20 | line-height: 50px; 21 | display: none; 22 | } 23 | .user-info { 24 | display: none; 25 | color: #666; 26 | height: 55px; 27 | line-height: 55px; 28 | font-size: 16px; 29 | margin-right: 10px; 30 | } 31 | .top-btn, .top-btn:hover { 32 | width: 60px; 33 | height: 40px; 34 | line-height: 28px; 35 | margin-right: 10px; 36 | font-size: 16px; 37 | } 38 | .search-btn, .search-btn:hover { 39 | width: 100%; 40 | height: 45px; 41 | line-height: 33px; 42 | margin-top: 11px; 43 | font-size: 18px; 44 | } 45 | .swiper-container, .swiper-slide img { 46 | width: 100%; 47 | } 48 | .swiper-container-horizontal>.swiper-pagination-bullets, .swiper-pagination-custom, .swiper-pagination-fraction { 49 | bottom: 0px; 50 | } 51 | .slide-title { 52 | position: absolute; 53 | bottom: 0px; 54 | width: 100%; 55 | height: 36px; 56 | padding: 0px 10px; 57 | background: linear-gradient(to top, #8f8e8e, transparent); 58 | color: #fff; 59 | font-size: 15px; 60 | } 61 | .search-bar { 62 | width: 100%; 63 | background-color: #e9e7e7; 64 | padding: 16px 10px; 65 | } 66 | .filter-btn { 67 | display: block; 68 | width: 100%; 69 | height: 40px; 70 | background-color: #fff; 71 | border: none; 72 | color: #585858; 73 | margin-bottom: 5px; 74 | border-radius: 3px; 75 | font-size: 16px; 76 | padding: 0px 15px; 77 | } 78 | .modal-title { 79 | font-size: 16px; 80 | } 81 | .modal-header, .modal-footer { 82 | padding: 10px; 83 | } 84 | .modal-body { 85 | padding: 0; 86 | } 87 | .area-list a { 88 | display: inline-block; 89 | width: auto; 90 | height: 20px; 91 | margin: 10px; 92 | font-size: 16px; 93 | } 94 | .area-list a:hover, .user-name:hover { 95 | text-decoration: none; 96 | } 97 | .date-select { 98 | font-size: 16px; 99 | } 100 | .datepicker-inline, .datepicker table { 101 | width: 100% !important; 102 | } 103 | .end-date { 104 | display: none; 105 | } 106 | -------------------------------------------------------------------------------- /migrations/versions/4cd7567d8169_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 4cd7567d8169 4 | Revises: 450c094cadc7 5 | Create Date: 2019-05-19 15:46:27.448457 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | from sqlalchemy.dialects import mysql 11 | 12 | # revision identifiers, used by Alembic. 13 | revision = '4cd7567d8169' 14 | down_revision = '450c094cadc7' 15 | branch_labels = None 16 | depends_on = None 17 | 18 | 19 | def upgrade(): 20 | # ### commands auto generated by Alembic - please adjust! ### 21 | op.add_column('ih_area_info', sa.Column('update_time', sa.DateTime(), nullable=True)) 22 | op.drop_column('ih_area_info', 'updata_time') 23 | op.add_column('ih_facility_info', sa.Column('update_time', sa.DateTime(), nullable=True)) 24 | op.drop_column('ih_facility_info', 'updata_time') 25 | op.add_column('ih_house_image', sa.Column('update_time', sa.DateTime(), nullable=True)) 26 | op.drop_column('ih_house_image', 'updata_time') 27 | op.add_column('ih_house_info', sa.Column('update_time', sa.DateTime(), nullable=True)) 28 | op.drop_column('ih_house_info', 'updata_time') 29 | op.add_column('ih_order_info', sa.Column('update_time', sa.DateTime(), nullable=True)) 30 | op.drop_column('ih_order_info', 'updata_time') 31 | op.add_column('ih_user_profile', sa.Column('update_time', sa.DateTime(), nullable=True)) 32 | op.drop_column('ih_user_profile', 'updata_time') 33 | # ### end Alembic commands ### 34 | 35 | 36 | def downgrade(): 37 | # ### commands auto generated by Alembic - please adjust! ### 38 | op.add_column('ih_user_profile', sa.Column('updata_time', mysql.DATETIME(), nullable=True)) 39 | op.drop_column('ih_user_profile', 'update_time') 40 | op.add_column('ih_order_info', sa.Column('updata_time', mysql.DATETIME(), nullable=True)) 41 | op.drop_column('ih_order_info', 'update_time') 42 | op.add_column('ih_house_info', sa.Column('updata_time', mysql.DATETIME(), nullable=True)) 43 | op.drop_column('ih_house_info', 'update_time') 44 | op.add_column('ih_house_image', sa.Column('updata_time', mysql.DATETIME(), nullable=True)) 45 | op.drop_column('ih_house_image', 'update_time') 46 | op.add_column('ih_facility_info', sa.Column('updata_time', mysql.DATETIME(), nullable=True)) 47 | op.drop_column('ih_facility_info', 'update_time') 48 | op.add_column('ih_area_info', sa.Column('updata_time', mysql.DATETIME(), nullable=True)) 49 | op.drop_column('ih_area_info', 'update_time') 50 | # ### end Alembic commands ### 51 | -------------------------------------------------------------------------------- /ihome/static/js/ihome/login.js: -------------------------------------------------------------------------------- 1 | new Vue({ 2 | el: "#v-container", 3 | data: { 4 | reg: /^1[3456789]\d{9}$/, // 验证手机的正则 5 | mobile: '', 6 | password: '', 7 | }, 8 | methods: { 9 | // 获取cookie值 10 | getCookie: function(key_name) { 11 | var r = document.cookie.match("\\b" + key_name + "=([^;]*)\\b"); 12 | return r ? r[1] : undefined; 13 | }, 14 | 15 | // 表单输入框验证 16 | isInputData: function(event){ 17 | if (event.target.name == 'mobile') { 18 | // 手机号验证 19 | if (this.reg.test(this.mobile)) { 20 | this.$refs.mobileErr.style.cssText = "display:none;"; 21 | }else{ 22 | this.$refs.mobileErr.children[0].innerHTML = "请输入正确的手机号"; 23 | this.$refs.mobileErr.style.cssText = "display:block;"; 24 | } 25 | return 26 | }else if(event.target.name == 'password'){ 27 | // 密码验证 28 | if(this.password){ 29 | this.$refs.passwordErr.style.cssText = "display:none;"; 30 | }else{ 31 | this.$refs.passwordErr.children[0].innerHTML = "请输入登录密码!"; 32 | this.$refs.passwordErr.style.cssText = "display:block;"; 33 | } 34 | return 35 | } 36 | }, 37 | 38 | // 用户登录 39 | userLogin: function(){ 40 | let data = { 41 | mobile: this.mobile, 42 | password: this.password, 43 | } 44 | // 转json 45 | let jsonData = JSON.stringify(data); 46 | // 设置包头 47 | let headers = { 48 | contentType: "application/json", 49 | "X-CSRFToken": this.getCookie("csrf_token") 50 | } 51 | 52 | // 发送请求 53 | this.$http.post('/api/1.0/user/login', jsonData, {headers: headers}).then(function(result){ 54 | if (result.data.errcode == "0"){ 55 | // 登录成功,跳转到主页 56 | location.href = "/"; 57 | }else{ 58 | // 其它错误显示在psswordErr中 59 | this.$refs.passwordErr.children[0].innerHTML = result.data.errmsg; 60 | this.$refs.passwordErr.style.cssText = "display:block;"; 61 | } 62 | }) 63 | return false; 64 | }, 65 | }, 66 | 67 | created() { 68 | // console.log(this); 69 | }, 70 | }) 71 | -------------------------------------------------------------------------------- /ihome/__init__.py: -------------------------------------------------------------------------------- 1 | from config import config_map # 导入配置映射对象 2 | from flask import Flask 3 | from flask_sqlalchemy import SQLAlchemy 4 | from flask_session import Session 5 | from flask_wtf import CSRFProtect 6 | import redis 7 | import logging 8 | from logging.handlers import RotatingFileHandler 9 | 10 | 11 | # 创建SQLAlchemy数据库工具对象 12 | db = SQLAlchemy() 13 | 14 | 15 | # 定义一个空的redis连接对象, 它最终会在create_app方法中重新被定义, 因为此时无法获取app对象 16 | redis_conn = None 17 | 18 | # 为flask增加csrf防护 19 | csrf = CSRFProtect() 20 | 21 | 22 | # 设置日志的记录等级, 以logging对象的方式设置 23 | logging.basicConfig(level=logging.DEBUG) # 可以是: ERROR, WARN, INFO, DEBUG的其中一个 24 | # 创建日志记录器, 参数1: 指明日志保存的路径, 参数2: 每个日志文件的最大大小(这里为30MB), 参数3: 保存的日志文件个数上限 25 | # 当日志的文件的大小超过maxBytes指定的大小后, 就会重新创建一个新的日志文件, 但它只会保留最新backupCount指定个数的文件, 更早的则被清理 26 | file_log_handler = RotatingFileHandler('logs/log', maxBytes=1024 * 1024 * 30, backupCount=10) 27 | # 创建日志记录的格式, 它们分别表示: 日志等级, 输入日志信息的文件名, 行数, 日志信息 28 | formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s') 29 | # 为刚创建的日志记录器设置日志记录格式 30 | file_log_handler.setFormatter(formatter) 31 | # 为全局的日志工具对象(flask app)添加日志记录器 32 | logging.getLogger().addHandler(file_log_handler) 33 | 34 | 35 | # 创建工厂模式的app对象 36 | def create_app(config_name): 37 | """ 38 | 创建flask的应用对象(工厂模式) 39 | :param config_name: str 配置模式的名字 可以是('develop' 或 'product') 40 | :return: app对象 41 | """ 42 | app = Flask(__name__) 43 | # 加载配置文件 44 | app.config.from_object(config_map.get(config_name)) 45 | 46 | # 使用app对象对SQLAlchemy实例进行初始化 47 | db.init_app(app) 48 | 49 | # 使用app对象对csrf进行初始化 50 | csrf.init_app(app) 51 | 52 | # 创建redis连接对象, 并设置为全局对象 53 | global redis_conn 54 | redis_conn = redis.StrictRedis(host=app.config.get('REDIS_HOST'), 55 | port=app.config.get('REDIS_PORT'), 56 | db=app.config.get('REDIS_DB') 57 | ) 58 | 59 | # 利用flask-session将session数据保存到redis中 60 | Session(app) 61 | 62 | # 蓝图板块 63 | from api_1_0.public import api 64 | from api_1_0.house import api_house 65 | from api_1_0.order import api_order 66 | from api_1_0.user import api_user 67 | from .static_html import static_html 68 | 69 | # 注册蓝图 70 | app.register_blueprint(api, url_prefix='/api/1.0') 71 | app.register_blueprint(api_house, url_prefix='/api/1.0/house') 72 | app.register_blueprint(api_order, url_prefix='/api/1.0/order') 73 | app.register_blueprint(api_user, url_prefix='/api/1.0/user') 74 | app.register_blueprint(static_html) 75 | 76 | return app 77 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/newhouse.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #eee; 3 | } 4 | .container { 5 | padding: 0px; 6 | } 7 | .top-bar { 8 | position: fixed; 9 | width: 100%; 10 | background-color: #eee; 11 | z-index: 2; 12 | } 13 | .nav-bar { 14 | width: 100%; 15 | height: 35px; 16 | text-align: center; 17 | position: relative; 18 | border-bottom: 1px solid #eee; 19 | background-color: #fff; 20 | } 21 | .page-title { 22 | display: block; 23 | line-height: 35px; 24 | font-size: 20px; 25 | } 26 | .nav-btn { 27 | position: absolute; 28 | top: 0; 29 | left: 10px; 30 | color: #000; 31 | font-size: 16px; 32 | } 33 | .houses-con { 34 | min-height: 100%; 35 | margin-top: 38px; 36 | } 37 | .houses-list { 38 | padding: 10px; 39 | } 40 | .houses-list>form>li { 41 | font-size: 14px; 42 | margin-bottom: 10px; 43 | } 44 | .house-title, .new-house { 45 | background-color: #fff; 46 | border-top-left-radius: 5px; 47 | border-top-right-radius: 5px; 48 | border-bottom: 1px solid #eee; 49 | padding: 10px; 50 | color: #666; 51 | } 52 | .new-house { 53 | border-radius: 5px; 54 | text-align: center; 55 | } 56 | .new-house>a { 57 | font-size: 16px; 58 | text-decoration: none; 59 | color: green; 60 | } 61 | .house-content { 62 | background-color: #fff; 63 | border-bottom-left-radius: 5px; 64 | border-bottom-right-radius: 5px; 65 | padding: 10px; 66 | } 67 | .house-image-cons>img { 68 | width: 100%; 69 | vertical-align: top; 70 | margin-bottom: 10px; 71 | } 72 | .house-facility-list>li { 73 | float: left; 74 | width: 50%; 75 | height: 39px; 76 | padding-left: 12px; 77 | box-sizing: border-box; 78 | border-bottom: 1px solid #eee; 79 | color: #666; 80 | } 81 | .btn-commit { 82 | width: 100%; 83 | margin-bottom: 10px; 84 | font-size: 20px; 85 | } 86 | #form-house-image { 87 | display: none; 88 | } 89 | .error-msg { 90 | display: none; 91 | font-size: 14px; 92 | color: red; 93 | } 94 | .error-msg i { 95 | margin-right: 5px; 96 | } 97 | .popup_con{display:none;} 98 | .popup{width:300px;height:150px;position:fixed; 99 | left:50%; 100 | margin-left:-150px; 101 | top:50%; 102 | margin-top:-75px; 103 | z-index:1000; 104 | } 105 | 106 | .popup p{height:150px;line-height:150px;text-align:center;font-size:18px;} 107 | 108 | .mask{width:100%;height:100%;position:fixed;left:0;top:0;background-color:#000;opacity:0.3;z-index:999;} -------------------------------------------------------------------------------- /ihome/static/css/ihome/profile.css: -------------------------------------------------------------------------------- 1 | .popup_con{display:none;} 2 | .popup{width:300px;height:150px;border:1px solid #dddddd;border-top:2px solid #00bc6f;background-color:#f7f7f7;position:fixed; 3 | left:50%; 4 | margin-left:-150px; 5 | top:50%; 6 | margin-top:-75px; 7 | z-index:1000; 8 | } 9 | 10 | .popup p{height:150px;line-height:150px;text-align:center;font-size:18px;} 11 | 12 | .mask{width:100%;height:100%;position:fixed;left:0;top:0;background-color:#000;opacity:0.3;z-index:999;} 13 | body { 14 | background-color: #eee; 15 | } 16 | .container { 17 | padding: 0px; 18 | } 19 | .top-bar { 20 | position: fixed; 21 | width: 100%; 22 | background-color: #eee; 23 | z-index: 2; 24 | } 25 | .nav-bar { 26 | width: 100%; 27 | height: 35px; 28 | text-align: center; 29 | position: relative; 30 | border-bottom: 1px solid #eee; 31 | background-color: #fff; 32 | } 33 | .page-title { 34 | display: block; 35 | line-height: 35px; 36 | font-size: 20px; 37 | } 38 | .nav-btn { 39 | position: absolute; 40 | top: 0; 41 | left: 10px; 42 | color: #000; 43 | font-size: 16px; 44 | } 45 | .menus-con { 46 | min-height: 100%; 47 | margin-top: 38px; 48 | } 49 | .menus-list { 50 | padding: 10px; 51 | } 52 | .menus-list>li { 53 | font-size: 16px; 54 | margin-bottom: 10px; 55 | } 56 | .menu-title { 57 | background-color: #fff; 58 | border-top-left-radius: 5px; 59 | border-top-right-radius: 5px; 60 | border-bottom: 1px solid #eee; 61 | padding: 10px 15px; 62 | } 63 | .menu-title>a { 64 | color: #4f4f4f; 65 | text-decoration: none; 66 | } 67 | .menu-title>a :hover { 68 | text-decoration: none; 69 | } 70 | .menu-title>h3 { 71 | display: inline; 72 | } 73 | .menu-content { 74 | background-color: #fff; 75 | border-bottom-left-radius: 5px; 76 | border-bottom-right-radius: 5px; 77 | padding: 10px; 78 | } 79 | .menu-content>img { 80 | width: 30%; 81 | vertical-align: top; 82 | } 83 | .menu-text { 84 | display: inline-block; 85 | width: 63%; 86 | margin-left: 10px; 87 | } 88 | .menu-text>h3 { 89 | font-size: 16px; 90 | white-space: nowrap; 91 | overflow: hidden; 92 | text-overflow: ellipsis; 93 | margin-bottom: 5px; 94 | } 95 | .menu-text>ul>li { 96 | height: 25px; 97 | line-height: 25px; 98 | color: #666; 99 | } 100 | .error-msg { 101 | display: none; 102 | font-size: 14px; 103 | color: red; 104 | } 105 | .error-msg i { 106 | margin-right: 5px; 107 | } -------------------------------------------------------------------------------- /migrations/versions/450c094cadc7_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 450c094cadc7 4 | Revises: accb068ce0af 5 | Create Date: 2019-05-19 15:43:38.206237 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | from sqlalchemy.dialects import mysql 11 | 12 | # revision identifiers, used by Alembic. 13 | revision = '450c094cadc7' 14 | down_revision = 'accb068ce0af' 15 | branch_labels = None 16 | depends_on = None 17 | 18 | 19 | def upgrade(): 20 | # ### commands auto generated by Alembic - please adjust! ### 21 | op.add_column('ih_area_info', sa.Column('updata_time', sa.DateTime(), nullable=True)) 22 | op.drop_column('ih_area_info', 'updata_teime') 23 | op.add_column('ih_facility_info', sa.Column('updata_time', sa.DateTime(), nullable=True)) 24 | op.drop_column('ih_facility_info', 'updata_teime') 25 | op.add_column('ih_house_image', sa.Column('updata_time', sa.DateTime(), nullable=True)) 26 | op.drop_column('ih_house_image', 'updata_teime') 27 | op.add_column('ih_house_info', sa.Column('updata_time', sa.DateTime(), nullable=True)) 28 | op.drop_column('ih_house_info', 'updata_teime') 29 | op.add_column('ih_order_info', sa.Column('updata_time', sa.DateTime(), nullable=True)) 30 | op.drop_column('ih_order_info', 'updata_teime') 31 | op.add_column('ih_user_profile', sa.Column('updata_time', sa.DateTime(), nullable=True)) 32 | op.create_unique_constraint(None, 'ih_user_profile', ['id_card']) 33 | op.drop_column('ih_user_profile', 'updata_teime') 34 | # ### end Alembic commands ### 35 | 36 | 37 | def downgrade(): 38 | # ### commands auto generated by Alembic - please adjust! ### 39 | op.add_column('ih_user_profile', sa.Column('updata_teime', mysql.DATETIME(), nullable=True)) 40 | op.drop_constraint(None, 'ih_user_profile', type_='unique') 41 | op.drop_column('ih_user_profile', 'updata_time') 42 | op.add_column('ih_order_info', sa.Column('updata_teime', mysql.DATETIME(), nullable=True)) 43 | op.drop_column('ih_order_info', 'updata_time') 44 | op.add_column('ih_house_info', sa.Column('updata_teime', mysql.DATETIME(), nullable=True)) 45 | op.drop_column('ih_house_info', 'updata_time') 46 | op.add_column('ih_house_image', sa.Column('updata_teime', mysql.DATETIME(), nullable=True)) 47 | op.drop_column('ih_house_image', 'updata_time') 48 | op.add_column('ih_facility_info', sa.Column('updata_teime', mysql.DATETIME(), nullable=True)) 49 | op.drop_column('ih_facility_info', 'updata_time') 50 | op.add_column('ih_area_info', sa.Column('updata_teime', mysql.DATETIME(), nullable=True)) 51 | op.drop_column('ih_area_info', 'updata_time') 52 | # ### end Alembic commands ### 53 | -------------------------------------------------------------------------------- /api_1_0/user/models.py: -------------------------------------------------------------------------------- 1 | from ihome.models import BaseModel 2 | from ihome import db 3 | from werkzeug.security import generate_password_hash, check_password_hash 4 | 5 | 6 | class User(BaseModel, db.Model): 7 | """用户""" 8 | 9 | __tablename__ = "ih_user_profile" 10 | 11 | id = db.Column(db.Integer, primary_key=True) # 用户编号 12 | name = db.Column(db.String(32), unique=True, nullable=False) # 用户暱称 13 | password_hash = db.Column(db.String(128), nullable=False) # 加密的密码 14 | mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号 15 | real_name = db.Column(db.String(32)) # 真实姓名 16 | id_card = db.Column(db.String(20), unique=True) # 身份证号 17 | avatar_url = db.Column(db.String(128)) # 用户头像路径 18 | houses = db.relationship("House", backref="user") # 用户发布的房屋 19 | orders = db.relationship("Order", backref="user") # 用户下的订单 20 | 21 | # 加上property装饰器后,会把函数变为属性,属性名即为函数名, 22 | # 注意: 这里它仅是作为这个类的属性, 而不是数据库的字段属性, 因为它不是使用db设置的属性值 23 | @property 24 | def password(self): 25 | """ 读取属性的函数行为 26 | 27 | 读取属性时将被调用, 例如: print(user.password) 28 | 函数的返回值会作为属性值, 注意: 使用property必须要有返回值 29 | return "xxxx" 30 | 31 | """ 32 | raise AttributeError("这个属性只能设置,不能读取") 33 | 34 | # 使用这个装饰器, 可以对@property构建的属性, 进行属性设置的相关操作 35 | @password.setter 36 | def password(self, password): 37 | """ 它在设置属性时被调用 38 | 39 | 设置属性的方式: user.passord = "xxxxx" 40 | :param password: 该参数就是设置属性时的属性值, 如上面的"xxxxx", (这是原始的明文密码) 41 | :return: 42 | 43 | """ 44 | # 在视图中设置user.password属性值时, 该方法被调用, 就会接收到password参数, 并将其设置为字段值 45 | self.password_hash = generate_password_hash(password) 46 | 47 | def check_password(self, passwd): 48 | """ 检验密码的正确性 49 | 50 | :param passwd: 用户登录时填写的原始密码 51 | :return: 如果正确,返回True, 否则返回False 52 | 53 | """ 54 | return check_password_hash(self.password_hash, passwd) 55 | 56 | def to_dict(self): 57 | """ 将对象转换为字典数据 """ 58 | user_dict = { 59 | "user_id": self.id, 60 | "username": self.name if self.name else "未设置", 61 | "mobile": self.mobile, 62 | "image_url": self.avatar_url if self.avatar_url else "", 63 | "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S") 64 | } 65 | return user_dict 66 | 67 | def auth_to_dict(self): 68 | """ 将实名信息转换为字典数据 """ 69 | auth_dict = { 70 | "user_id": self.id, 71 | "real_name": self.real_name if self.real_name else '', 72 | "id_card": self.id_card if self.id_card else '' 73 | } 74 | return auth_dict 75 | -------------------------------------------------------------------------------- /py-dependent.txt: -------------------------------------------------------------------------------- 1 | absl-py==0.6.1 2 | alembic==1.0.9 3 | amqp==2.4.2 4 | apturl==0.5.2 5 | asn1crypto==0.24.0 6 | astor==0.7.1 7 | astroid==2.2.5 8 | billiard==3.6.0.0 9 | blinker==1.4 10 | Brlapi==0.6.6 11 | celery==4.3.0 12 | certifi==2019.3.9 13 | chardet==3.0.4 14 | Click==7.0 15 | command-not-found==0.3 16 | configparser==3.7.4 17 | cryptography==2.1.4 18 | cupshelpers==1.0 19 | decorator==4.1.2 20 | defer==1.0.6 21 | distro-info===0.18ubuntu0.18.04.1 22 | Django==2.2 23 | django-haystack==2.8.1 24 | django-redis==4.10.0 25 | fdfs-client-py==1.2.6 26 | Flask==1.0.2 27 | Flask-Mail==0.9.1 28 | Flask-Migrate==2.4.0 29 | Flask-MySQLdb==0.2.0 30 | Flask-Script==2.0.6 31 | Flask-Session==0.3.1 32 | Flask-SQLAlchemy==2.4.0 33 | Flask-WTF==0.14.2 34 | gast==0.2.0 35 | gevent==1.3.7 36 | greenlet==0.4.15 37 | grpcio==1.17.0 38 | h5py==2.8.0 39 | HTMLParser==0.0.2 40 | httplib2==0.9.2 41 | idna==2.8 42 | ipython==5.5.0 43 | ipython-genutils==0.2.0 44 | isort==4.3.14 45 | itsdangerous==1.1.0 46 | jieba==0.39 47 | Jinja2==2.10.1 48 | Keras-Applications==1.0.6 49 | Keras-Preprocessing==1.0.5 50 | keyring==10.6.0 51 | keyrings.alt==3.0 52 | kombu==4.5.0 53 | language-selector==0.1 54 | launchpadlib==1.10.6 55 | lazr.restfulclient==0.13.5 56 | lazr.uri==1.0.3 57 | lazy-object-proxy==1.3.1 58 | louis==3.5.0 59 | lxml==4.2.5 60 | macaroonbakery==1.1.3 61 | Mako==1.0.9 62 | Markdown==3.0.1 63 | MarkupSafe==1.1.1 64 | mccabe==0.6.1 65 | mysqlclient==1.4.2.post1 66 | netifaces==0.10.4 67 | numpy==1.15.4 68 | oauth==1.0.1 69 | olefile==0.45.1 70 | pandas==0.23.4 71 | pbr==5.1.3 72 | pexpect==4.2.1 73 | pickleshare==0.7.4 74 | Pillow==6.0.0 75 | prompt-toolkit==1.0.15 76 | protobuf==3.6.1 77 | pycairo==1.16.2 78 | pycrypto==2.6.1 79 | pycryptodomex==3.7.2 80 | pycups==1.9.73 81 | Pygments==2.2.0 82 | pygobject==3.26.1 83 | pylint==2.3.1 84 | pymacaroons==0.13.0 85 | PyMySQL==0.9.3 86 | PyNaCl==1.1.2 87 | pyRFC3339==1.0 88 | python-alipay-sdk==1.10.0 89 | python-apt==1.6.3+ubuntu1 90 | python-dateutil==2.8.0 91 | python-debian==0.1.32 92 | python-editor==1.0.4 93 | pytz==2019.1 94 | pyxdg==0.25 95 | PyYAML==3.12 96 | qiniu==7.2.4 97 | redis==3.2.1 98 | reportlab==3.4.0 99 | requests==2.21.0 100 | requests-unixsocket==0.1.5 101 | scipy==1.1.0 102 | SecretStorage==2.3.1 103 | simplegeneric==0.8.1 104 | simplejson==3.13.2 105 | six==1.12.0 106 | SQLAlchemy==1.3.3 107 | sqlparse==0.3.0 108 | ssh-import-id==5.7 109 | stevedore==1.30.1 110 | system-service==0.3 111 | systemd-python==234 112 | tensorboard==1.12.0 113 | tensorflow==1.12.0 114 | termcolor==1.1.0 115 | traitlets==4.3.2 116 | typed-ast==1.3.1 117 | ubuntu-drivers-common==0.0.0 118 | ufw==0.36 119 | unattended-upgrades==0.1 120 | urllib3==1.24.3 121 | usb-creator==0.3.3 122 | uWSGI==2.0.18 123 | vine==1.3.0 124 | virtualenv==16.4.3 125 | virtualenv-clone==0.5.1 126 | virtualenvwrapper==4.8.4 127 | wadllib==1.3.2 128 | wcwidth==0.1.7 129 | Werkzeug==0.15.2 130 | Whoosh==2.7.4 131 | wrapt==1.11.1 132 | WTForms==2.2.1 133 | xkit==0.0.0 134 | xmltodict==0.12.0 135 | zope.interface==4.3.2 136 | 137 | -------------------------------------------------------------------------------- /ihome/static/html/booking.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 爱家-预订 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 | 28 |
29 |

{{ houseData.title }}

30 |

31 | ¥{{ (houseData.price/100).toFixed(0) }}/晚 32 |

33 |

不好意思, 您来晚了, 该房间也被预定了... 34 |

35 |
36 |
37 |
38 |
入住时间
39 |
40 | 41 | 42 | 43 |
44 |
45 |
46 | 订单总额:¥{{ orderTotalPrice }}/元 47 | 提交订单 48 |
49 |
50 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /migrations/env.py: -------------------------------------------------------------------------------- 1 | from __future__ import with_statement 2 | 3 | import logging 4 | from logging.config import fileConfig 5 | 6 | from sqlalchemy import engine_from_config 7 | from sqlalchemy import pool 8 | 9 | from alembic import context 10 | 11 | # this is the Alembic Config object, which provides 12 | # access to the values within the .ini file in use. 13 | config = context.config 14 | 15 | # Interpret the config file for Python logging. 16 | # This line sets up loggers basically. 17 | fileConfig(config.config_file_name) 18 | logger = logging.getLogger('alembic.env') 19 | 20 | # add your model's MetaData object here 21 | # for 'autogenerate' support 22 | # from myapp import mymodel 23 | # target_metadata = mymodel.Base.metadata 24 | from flask import current_app 25 | config.set_main_option('sqlalchemy.url', 26 | current_app.config.get('SQLALCHEMY_DATABASE_URI')) 27 | target_metadata = current_app.extensions['migrate'].db.metadata 28 | 29 | # other values from the config, defined by the needs of env.py, 30 | # can be acquired: 31 | # my_important_option = config.get_main_option("my_important_option") 32 | # ... etc. 33 | 34 | 35 | def run_migrations_offline(): 36 | """Run migrations in 'offline' mode. 37 | 38 | This configures the context with just a URL 39 | and not an Engine, though an Engine is acceptable 40 | here as well. By skipping the Engine creation 41 | we don't even need a DBAPI to be available. 42 | 43 | Calls to context.execute() here emit the given string to the 44 | script output. 45 | 46 | """ 47 | url = config.get_main_option("sqlalchemy.url") 48 | context.configure( 49 | url=url, target_metadata=target_metadata, literal_binds=True 50 | ) 51 | 52 | with context.begin_transaction(): 53 | context.run_migrations() 54 | 55 | 56 | def run_migrations_online(): 57 | """Run migrations in 'online' mode. 58 | 59 | In this scenario we need to create an Engine 60 | and associate a connection with the context. 61 | 62 | """ 63 | 64 | # this callback is used to prevent an auto-migration from being generated 65 | # when there are no changes to the schema 66 | # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html 67 | def process_revision_directives(context, revision, directives): 68 | if getattr(config.cmd_opts, 'autogenerate', False): 69 | script = directives[0] 70 | if script.upgrade_ops.is_empty(): 71 | directives[:] = [] 72 | logger.info('No changes in schema detected.') 73 | 74 | connectable = engine_from_config( 75 | config.get_section(config.config_ini_section), 76 | prefix='sqlalchemy.', 77 | poolclass=pool.NullPool, 78 | ) 79 | 80 | with connectable.connect() as connection: 81 | context.configure( 82 | connection=connection, 83 | target_metadata=target_metadata, 84 | process_revision_directives=process_revision_directives, 85 | **current_app.extensions['migrate'].configure_args 86 | ) 87 | 88 | with context.begin_transaction(): 89 | context.run_migrations() 90 | 91 | 92 | if context.is_offline_mode(): 93 | run_migrations_offline() 94 | else: 95 | run_migrations_online() 96 | -------------------------------------------------------------------------------- /ihome/static/plugins/bootstrap-switch/README.md: -------------------------------------------------------------------------------- 1 | # Bootstrap Switch 2 | [![Dependency Status](https://david-dm.org/nostalgiaz/bootstrap-switch.svg?style=flat)](https://david-dm.org/nostalgiaz/bootstrap-switch) 3 | [![devDependency Status](https://david-dm.org/nostalgiaz/bootstrap-switch/dev-status.svg?style=flat)](https://david-dm.org/nostalgiaz/bootstrap-switch#info=devDependencies) 4 | [![NPM Version](http://img.shields.io/npm/v/bootstrap-switch.svg?style=flat)](https://www.npmjs.org/) 5 | 6 | Turn checkboxes and radio buttons in toggle switches. 7 | 8 | ## Contribute 9 | 10 | Hi, Emanuele here. I am currently the sole contributor of Bootstrap Switch and have been mantaining it for quite a considerable amount of time. 11 | The development pace is strongly affected by the personal lack of time and a missing core team behind the project. 12 | It would be nice to have someone available for clearing the list of open issues and occasionally implementing new functionalities. 13 | If interest, you can drop me a line or pick a bug, kill it and open a Pull Request against `develop` branch. 14 | Any contribution made after February 5th, 2015 is to be dual-licensed Apache and MIT, and thus, once all previous contributors agree, we will change the license to MIT (like Bootstrap did) 15 | 16 | Many thanks. 17 | 18 | ## Demo and Documentation 19 | 20 | - [Examples](http://www.bootstrap-switch.org/examples.html) 21 | - [Options](http://www.bootstrap-switch.org/options.html) 22 | - [Methods](http://www.bootstrap-switch.org/methods.html) 23 | - [Events](http://www.bootstrap-switch.org/events.html) 24 | 25 | ## Getting started 26 | 27 | Include the dependencies: jQuery, Bootstrap and Bootstrap Switch CSS + Javascript: 28 | 29 | ``` html 30 | [...] 31 | 32 | 33 | 34 | 35 | [...] 36 | ``` 37 | 38 | Add your checkbox: 39 | 40 | ```html 41 | 42 | ``` 43 | 44 | Initialize Bootstrap Switch on it: 45 | 46 | ```javascript 47 | $("[name='my-checkbox']").bootstrapSwitch(); 48 | ``` 49 | 50 | Enjoy. 51 | 52 | ## Less 53 | 54 | If you want to use your bootstrap variables, include `bootstrap-switch.less` in your compilation stack. You can even choose among Bootstrap versions 2.3.2 or 3.*.* compatible source. 55 | 56 | ## AngularJs 57 | 58 | Two custom directives are available: 59 | - [angular-bootstrap-switch](https://github.com/frapontillo/angular-bootstrap-switch) 60 | - [angular-toggle-switch](https://github.com/JumpLink/angular-toggle-switch) 61 | 62 | ## KnockoutJs 63 | 64 | A Knockout binding handler is available [here](https://github.com/pauloortins/knockout-bootstrap-switch) 65 | 66 | ## NuGet 67 | 68 | A NuGet package is available [here](https://github.com/blachniet/bootstrap-switch-nuget) 69 | 70 | ## Supported browsers 71 | 72 | IE9+ and all the other modern browsers. 73 | 74 | ## License 75 | 76 | Licensed under the Apache License, Version 2.0 77 | http://www.apache.org/licenses/LICENSE-2.0 78 | 79 | We are in the process of changing from Apache to MIT. If you contributed before February 5th, 2015, please add your vote here to accept license change: https://github.com/nostalgiaz/bootstrap-switch/issues/347 80 | -------------------------------------------------------------------------------- /ihome/static/html/my.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 爱家-我的爱家 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 24 |
25 | 75 | 78 |
79 | 80 | 81 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /ihome/static/html/myhouse.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 爱家-我的房源 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 22 |
23 |
24 |
    25 |
  • 26 |
    27 |

    尚未进行实名认证,无法发布房屋信息!

    28 |
    29 |
    30 | 去实名认证 31 |
    32 |
  • 33 |
34 | 60 |
61 | 64 |
65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /ihome/static/html/auth.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 爱家-实名认证 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 22 |
23 | 46 | 53 | 56 |
57 | 58 | 59 | 60 | 61 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /ihome/static/js/ihome/auth.js: -------------------------------------------------------------------------------- 1 | new Vue({ 2 | el: "#v-container", 3 | data: { 4 | realName: null, // 真实姓名 5 | idCard: null, // 身份证号 6 | req: /\d{17}[\dX]/g, // 身份证号验证 7 | }, 8 | methods: { 9 | // 获取cookie 10 | getCookie: function(name) { 11 | var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); 12 | return r ? r[1] : undefined; 13 | }, 14 | 15 | // 获取用户实名信息 16 | getRealName: function(){ 17 | this.$http.get('/api/1.0/user/get-real-name').then(function(res){ 18 | if(res.body.errcode == "4101"){ 19 | // 用户未登录 20 | location.href = "/login.html"; 21 | }else if(res.body.errcode == "0"){ 22 | this.realName = res.body.data.real_name; 23 | this.idCard = res.body.data.id_card; 24 | // 如果实名已经认证, 禁用所有按钮功能 25 | this.$refs.realName.disabled = true; 26 | this.$refs.idCard.disabled = true; 27 | this.$refs.btnSuccess.disabled = true; 28 | // 如果用户没有设置过实名 29 | if(!this.realName){ 30 | this.$refs.errorMsg.children[0].innerHTML = "该资料请慎重填写, 一旦确认后则无法修改" 31 | this.$refs.errorMsg.style.cssText = "display: block"; 32 | this.$refs.realName.disabled = false; 33 | this.$refs.idCard.disabled = false; 34 | this.$refs.btnSuccess.disabled = false; 35 | } 36 | }else{ 37 | this.$refs.errorMsg.children[0].innerHTML = "数据库异常" 38 | this.$refs.errorMsg.style.cssText = "display: block"; 39 | } 40 | }) 41 | }, 42 | 43 | // 设置实名 44 | setRealName: function(){ 45 | let headers = { 46 | 'Content-Type': "application/json", 47 | "X-CSRFToken": this.getCookie("csrf_token") 48 | } 49 | 50 | // 请求体 51 | let data = { 52 | 'real_name': this.realName, 53 | 'id_card': this.idCard, 54 | } 55 | // 转json 56 | let jsonData = JSON.stringify(data); 57 | 58 | if(!this.req.test(this.idCard)){ 59 | this.$refs.errorMsg.children[0].innerHTML = "身份证号码格式不正确, 请重新填写" 60 | this.$refs.errorMsg.style.cssText = "display: block"; 61 | return false; 62 | } 63 | 64 | // 发送请求 65 | this.$http.post('/api/1.0/user/set-real-name', jsonData, {headers: headers}).then(function(res){ 66 | if (res.data.errcode == "4101") { 67 | location.href = "/login.html"; 68 | }else{ 69 | this.$refs.errorMsg.children[0].innerHTML = res.body.errmsg 70 | this.$refs.errorMsg.style.cssText = "display: block"; 71 | // 如果设置成功, 1.5秒后跳转到个人主页 72 | if(res.data.errcode == "0"){ 73 | setTimeout(function(){ 74 | location.href = "/my.html"; 75 | }, 1500); 76 | } 77 | } 78 | }); 79 | return false; 80 | }, 81 | }, 82 | mounted: function(){ 83 | // 页面加载获取信息 84 | this.getRealName() 85 | } 86 | }) 87 | 88 | -------------------------------------------------------------------------------- /ihome/static/plugins/uniform/css/uniform.default.scss: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Uniform Theme: Uniform Default 4 | Version: 1.8 5 | By: Josh Pyles 6 | License: MIT License 7 | --- 8 | For use with the Uniform plugin: 9 | http://uniformjs.com/ 10 | 11 | */ 12 | 13 | $button-height: 30px; 14 | $button-margin-left: 13px; 15 | $button-padding: 8px 15px 0 2px; 16 | $button-span-height: 22px; 17 | $checkbox-height: 19px; 18 | $checkbox-width: 19px; 19 | $input-padding: 3px; 20 | $radio-height: 18px; 21 | $radio-width: 18px; 22 | $select-fixed-width: 190px; 23 | $select-height: 26px; 24 | $select-margin-left: 10px; 25 | $select-margin-right: 25px; 26 | $select-select-height: 22px; 27 | $select-select-top: 2px; 28 | $upload-action-width: 82px; 29 | $upload-filename-margin-top: 2px; 30 | $upload-filename-margin-bottom: 2px; 31 | $upload-filename-margin-left: 2px; 32 | $upload-filename-width: 85px; 33 | $upload-filename-padding: 0 10px; 34 | $upload-height: 28px; 35 | $upload-width: 190px; 36 | 37 | @import "../../_base/css/uniform._base.scss"; 38 | 39 | /* INPUT & TEXTAREA */ 40 | 41 | #{$class-wrapper-element}#{$class-wrapper} input#{$class-input}, 42 | #{$class-wrapper-element}#{$class-wrapper} select#{$class-multiselect}, 43 | #{$class-wrapper-element}#{$class-wrapper} textarea#{$class-textarea} { 44 | font-size: 12px; 45 | font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; 46 | font-weight: normal; 47 | color: #777; 48 | border-top: solid 1px #aaa; 49 | border-left: solid 1px #aaa; 50 | border-bottom: solid 1px #ccc; 51 | border-right: solid 1px #ccc; 52 | @include border-radius($input-padding); 53 | 54 | @include whenHover { 55 | @include box-shadow(0px 0px 4px rgba(0,0,0,0.3)); 56 | border-color: #999; 57 | } 58 | } 59 | 60 | /* PRESENTATION */ 61 | 62 | /* Buttons */ 63 | 64 | div#{$class-wrapper}#{$class-button} { 65 | span { 66 | font-weight: bold; 67 | font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; 68 | font-size: 12px; 69 | letter-spacing: 1px; 70 | text-transform: uppercase; 71 | } 72 | 73 | @include whenHover { 74 | span { 75 | color: #555; 76 | } 77 | } 78 | 79 | @include whenDisabled { 80 | span { 81 | color: #bbb; 82 | } 83 | } 84 | } 85 | 86 | 87 | /* Select */ 88 | 89 | div#{$class-wrapper}#{$class-select} { 90 | font-size: 12px; 91 | 92 | span { 93 | color: #666; 94 | text-shadow: 0 1px 0 #fff; 95 | } 96 | 97 | select { 98 | font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; 99 | font-size: 12px; 100 | } 101 | 102 | @include whenDisabled { 103 | span { 104 | color: #bbb; 105 | } 106 | } 107 | } 108 | 109 | /* Checker */ 110 | div#{$class-wrapper}#{$class-checkbox} { 111 | margin-right: 5px; 112 | } 113 | 114 | /* Radio */ 115 | div#{$class-wrapper}#{$class-radio} { 116 | margin-right: 3px; 117 | } 118 | 119 | /* Uploader */ 120 | div#{$class-wrapper}#{$class-upload} { 121 | span#{$class-action} { 122 | text-shadow: #fff 0px 1px 0px; 123 | background-color: #fff; 124 | font-size: 11px; 125 | font-weight: bold; 126 | } 127 | 128 | span#{$class-filename} { 129 | color: #777; 130 | border-right: solid 1px #bbb; 131 | font-size: 11px; 132 | } 133 | 134 | @include whenDisabled { 135 | span#{$class-action} { 136 | color: #aaa; 137 | } 138 | 139 | span#{$class-filename} { 140 | border-color: #ddd; 141 | color: #aaa; 142 | } 143 | } 144 | } 145 | 146 | #{$class-wrapper-element}#{$class-wrapper} input#{$class-input} { 147 | &, &:focus { 148 | background-color: #fff; 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /ihome/static/html/profile.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 爱家-个人信息 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 22 |
23 | 53 | 60 | 63 |
64 | 65 | 66 | 67 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /ihome/static/css/ihome/search.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #fff; 3 | } 4 | .container { 5 | padding: 0px; 6 | } 7 | .top-bar { 8 | position: fixed; 9 | width: 100%; 10 | background-color: #eee; 11 | z-index: 2; 12 | } 13 | .nav-bar { 14 | width: 100%; 15 | height: 35px; 16 | text-align: center; 17 | position: relative; 18 | border-bottom: 1px solid #eee; 19 | background-color: #fff; 20 | } 21 | .page-title { 22 | display: block; 23 | line-height: 35px; 24 | font-size: 20px; 25 | } 26 | .nav-btn { 27 | position: absolute; 28 | top: 0; 29 | left: 10px; 30 | color: #000; 31 | font-size: 16px; 32 | } 33 | .filter-title-bar { 34 | height: 35px; 35 | text-align: center; 36 | border-bottom: 1px solid #eee; 37 | background-color: #fff; 38 | } 39 | .filter-title { 40 | display: inline-block; 41 | width: 32%; 42 | height: 35px; 43 | line-height: 35px; 44 | } 45 | .split-line { 46 | color: #eee; 47 | font-size: 26px; 48 | margin-top: -2px; 49 | font-weight: 100; 50 | } 51 | .filter-item { 52 | display: none; 53 | } 54 | .filter-item.active { 55 | display: block; 56 | } 57 | .filter-date { 58 | margin: 10px; 59 | } 60 | .input-daterange>input { 61 | font-size: 14px; 62 | } 63 | .filter-area { 64 | margin-top: 5px; 65 | } 66 | .filter-area li { 67 | padding: 0 9px; 68 | margin: 0 6px 6px; 69 | float: left; 70 | height: 30px; 71 | line-height: 30px; 72 | text-align: center; 73 | background-color: #fff; 74 | border-radius: 3px; 75 | font-size: 14px; 76 | box-shadow: 0 1px 1px #ddd; 77 | color: #333; 78 | } 79 | .filter-area li.active { 80 | background-color: #ff6666; 81 | color: #fff; 82 | } 83 | .filter-sort li{ 84 | height: 36px; 85 | line-height: 36px; 86 | font-size: 14px; 87 | background-color: #fff; 88 | border-bottom: 1px solid #eee; 89 | text-align: center; 90 | } 91 | .filter-sort li.active{ 92 | background-color: #ff6666; 93 | color: #fff; 94 | } 95 | .display-mask { 96 | position: fixed; 97 | top: 0; 98 | left: 0; 99 | width: 100%; 100 | height: 100%; 101 | z-index: 1; 102 | background-color: rgba(0, 0, 0, 0.7); 103 | display: none; 104 | } 105 | .house-list { 106 | padding-top: 70px; 107 | } 108 | .house-item { 109 | position: relative; 110 | background-color: #eee; 111 | } 112 | .house-item img{ 113 | width: 100%; 114 | } 115 | .landlord-pic { 116 | display: inline-block; 117 | width: 60px; 118 | height: 60px; 119 | position: absolute; 120 | left: 10px; 121 | bottom: 43px; 122 | border-radius: 50%; 123 | overflow: hidden; 124 | border: 3px solid #fff; 125 | } 126 | .house-price { 127 | display: inline-block; 128 | position: absolute; 129 | right: 0; 130 | bottom: 50px; 131 | height: 42px; 132 | padding: 0 12px; 133 | line-height: 42px; 134 | text-align: center; 135 | background-color: rgba(0, 0, 0, 0.8); 136 | color: #fff; 137 | font-size: 14px; 138 | } 139 | .house-price>span { 140 | font-size: 30px; 141 | } 142 | .house-intro { 143 | padding: 5px 10px; 144 | line-height: 20px; 145 | } 146 | .house-title { 147 | display: block; 148 | white-space: nowrap; 149 | overflow: hidden; 150 | text-overflow: ellipsis; 151 | font-size: 14px; 152 | color: #333; 153 | } 154 | .house-intro>em { 155 | display: block; 156 | width: 100%; 157 | white-space: nowrap; 158 | overflow: hidden; 159 | text-overflow: ellipsis; 160 | font-style: normal; 161 | } 162 | 163 | 164 | -------------------------------------------------------------------------------- /ihome/static/js/ihome/lorders.js: -------------------------------------------------------------------------------- 1 | new Vue({ 2 | el: '#v-container', 3 | data: { 4 | order_id: '', 5 | orders: [], 6 | // 拒单原因 7 | rejectReason: '', 8 | }, 9 | methods: { 10 | // 获取cookie 11 | getCookie: function(name) { 12 | var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); 13 | return r ? r[1] : undefined; 14 | }, 15 | 16 | // 解析提取url中的查询字符串参数, 如: /?key=value&key2=value2... 17 | decodeQuery: function (){ 18 | var search = decodeURI(document.location.search); 19 | return search.replace(/(^\?)/, '').split('&').reduce(function(result, item){ 20 | values = item.split('='); 21 | result[values[0]] = values[1]; 22 | // 它返回一个对象, 如{key: value, ...} 其中key为URL参数中的键名, value为键值... 23 | return result; 24 | }, {}); 25 | }, 26 | 27 | // 页面初始化, 获取房屋信息 28 | getOrders: function(){ 29 | this.$http.get('/api/1.0/order/orders?role=landlord').then(function(res){ 30 | if(res.body.errcode == "4101"){ 31 | // 用户未登录 32 | location.href = "/login.html"; 33 | }else if(res.body.errcode == '0'){ 34 | this.orders = res.body.data.orders; 35 | }else{ 36 | alert(res.body.errmsg); 37 | } 38 | }) 39 | }, 40 | 41 | // 接单或拒绝按钮触发 42 | acceptOrReject: function(event){ 43 | // 获取触发的订单id 44 | this.order_id = event.target.dataset.orderid; 45 | }, 46 | 47 | // 确认接单事件 48 | acceptOrder: function(){ 49 | let headers = { 50 | 'Content-Type': "application/json", 51 | "X-CSRFToken": this.getCookie("csrf_token") 52 | } 53 | 54 | // json 55 | let jsonData = '{"action": "accept"}'; 56 | 57 | this.$http.put('/api/1.0/order/'+this.order_id+'/status', jsonData, {headers: headers}).then(function(res){ 58 | if(res.body.errcode == '0'){ 59 | // alert('接单成功'); 60 | this.$refs.acceptModal.style.display = 'none'; 61 | // 去掉遮罩层 62 | let backdrop = document.querySelector('.modal-backdrop') 63 | backdrop.parentNode.removeChild(backdrop); 64 | document.body.className = ''; 65 | // 重新获取页面数据 66 | this.getOrders(); 67 | }else{ 68 | alert(res.body.errmsg); 69 | } 70 | }) 71 | }, 72 | 73 | // 确认拒单事件 74 | rejectOrder: function(){ 75 | let headers = { 76 | 'Content-Type': "application/json", 77 | "X-CSRFToken": this.getCookie("csrf_token") 78 | } 79 | let data = { 80 | action: "reject", 81 | reason: this.rejectReason, 82 | } 83 | // 转json 84 | let jsonData = JSON.stringify(data); 85 | 86 | this.$http.put('/api/1.0/order/'+this.order_id+'/status', jsonData, {headers: headers}).then(function(res){ 87 | if(res.body.errcode == '0'){ 88 | this.$refs.rejectModal.style.display = 'none'; 89 | // 去掉遮罩层 90 | let backdrop = document.querySelector('.modal-backdrop') 91 | backdrop.parentNode.removeChild(backdrop); 92 | document.body.className = ''; 93 | // 重新获取页面数据 94 | this.getOrders(); 95 | }else{ 96 | alert(res.body.errmsg); 97 | } 98 | }); 99 | }, 100 | }, 101 | created: function(){ 102 | this.getOrders(); 103 | }, 104 | 105 | mounted: function(){ 106 | 107 | } 108 | }) 109 | -------------------------------------------------------------------------------- /ihome/static/html/register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 爱家-注册 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 | 24 |
25 |
26 |
27 |
28 |
29 |
30 | 31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | 39 |
40 | 获取验证码 41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | 49 |
50 |
51 |
52 |
53 |
54 |
55 | 56 |
57 |
58 |
59 | 60 | 61 |
62 |
63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /ihome/static/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 爱家 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 68 | 69 | 70 | 71 |
72 |
73 | 74 | 78 | 79 |
80 |
81 |
82 | 83 | 84 | 85 |
86 |
87 |
88 | 106 | 109 |
110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /ihome/static/css/mui.picker.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * 选择列表插件 3 | * varstion 2.0.0 4 | * by Houfeng 5 | * Houfeng@DCloud.io 6 | **/ 7 | .mui-pciker-list li,.mui-picker,.mui-picker-inner{box-sizing:border-box;overflow:hidden}.mui-picker{background-color:#ddd;position:relative;height:200px;border:1px solid rgba(0,0,0,.1);-webkit-user-select:none;user-select:none}.mui-dtpicker,.mui-poppicker{left:0;background-color:#eee;box-shadow:0 -5px 7px 0 rgba(0,0,0,.1);-webkit-transition:.3s;width:100%}.mui-picker-inner{position:relative;width:100%;height:100%;-webkit-mask-box-image:-webkit-linear-gradient(bottom,transparent,transparent 5%,#fff 20%,#fff 80%,transparent 95%,transparent);-webkit-mask-box-image:linear-gradient(top,transparent,transparent 5%,#fff 20%,#fff 80%,transparent 95%,transparent)}.mui-pciker-list,.mui-pciker-rule{box-sizing:border-box;padding:0;margin:-18px 0 0;width:100%;height:36px;line-height:36px;position:absolute;left:0;top:50%}.mui-pciker-rule-bg{z-index:0}.mui-pciker-rule-ft{z-index:2;border-top:solid 1px rgba(0,0,0,.1);border-bottom:solid 1px rgba(0,0,0,.1)}.mui-pciker-list{z-index:1;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform:perspective(750pt) rotateY(0) rotateX(0);transform:perspective(750pt) rotateY(0) rotateX(0)}.mui-pciker-list li{width:100%;height:100%;position:absolute;text-align:center;vertical-align:middle;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-size:1pc;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#888;padding:0 8px;white-space:nowrap;-webkit-text-overflow:ellipsis;text-overflow:ellipsis;cursor:default;visibility:hidden}.mui-pciker-list li.highlight,.mui-pciker-list li.visible{visibility:visible}.mui-pciker-list li.highlight{color:#222}.mui-poppicker{position:fixed;z-index:999;border-top:solid 1px #ccc;bottom:0;-webkit-transform:translateY(300px)}.mui-poppicker.mui-active{-webkit-transform:translateY(0)}.mui-android-5-1 .mui-poppicker{bottom:-300px;-webkit-transition-property:bottom;-webkit-transform:none}.mui-android-5-1 .mui-poppicker.mui-active{bottom:0;-webkit-transition-property:bottom;-webkit-transform:none}.mui-poppicker-header{padding:6px;font-size:14px;color:#888}.mui-poppicker-header .mui-btn{font-size:9pt;padding:5px 10px}.mui-poppicker-btn-cancel{float:left}.mui-poppicker-btn-ok{float:right}.mui-poppicker-clear{clear:both;height:0;line-height:0;font-size:0;overflow:hidden}.mui-poppicker-body{position:relative;width:100%;height:200px;border-top:solid 1px #ddd}.mui-poppicker-body .mui-picker{width:100%;height:100%;margin:0;border:none;float:left}.mui-dtpicker{position:fixed;z-index:999999;border-top:solid 1px #ccc;bottom:0;-webkit-transform:translateY(300px)}.mui-dtpicker.mui-active{-webkit-transform:translateY(0)}.mui-dtpicker-active-for-page{overflow:hidden!important}.mui-android-5-1 .mui-dtpicker{bottom:-300px;-webkit-transition-property:bottom;-webkit-transform:none}.mui-android-5-1 .mui-dtpicker.mui-active{bottom:0;-webkit-transition-property:bottom;-webkit-transform:none}.mui-dtpicker-header{padding:6px;font-size:14px;color:#888}.mui-dtpicker-header button{font-size:9pt;padding:5px 10px}.mui-dtpicker-header button:last-child{float:right}.mui-dtpicker-body{position:relative;width:100%;height:200px}.mui-ios .mui-dtpicker-body{-webkit-perspective:75pc;perspective:75pc;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-dtpicker-title h5{display:inline-block;width:20%;margin:0;padding:8px;text-align:center;border-top:solid 1px #ddd;background-color:#f0f0f0;border-bottom:solid 1px #ccc}[data-type=hour] [data-id=title-i],[data-type=hour] [data-id=picker-i],[data-type=month] [data-id=title-i],[data-type=month] [data-id=picker-d],[data-type=month] [data-id=title-d],[data-type=month] [data-id=picker-h],[data-type=month] [data-id=title-h],[data-type=month] [data-id=picker-i],[data-type=time] [data-id=picker-y],[data-type=time] [data-id=picker-m],[data-type=time] [data-id=picker-d],[data-type=time] [data-id=title-y],[data-type=time] [data-id=title-m],[data-type=time] [data-id=title-d],[data-type=date] [data-id=title-i],[data-type=date] [data-id=picker-h],[data-type=date] [data-id=title-h],[data-type=date] [data-id=picker-i]{display:none}.mui-dtpicker .mui-picker{width:20%;height:100%;margin:0;float:left;border:none}[data-type=hour] [data-id=picker-h],[data-type=hour] [data-id=title-h],[data-type=datetime] [data-id=picker-h],[data-type=datetime] [data-id=title-h]{border-left:dotted 1px #ccc}[data-type=datetime] .mui-picker,[data-type=time] .mui-dtpicker-title h5{width:20%}[data-type=date] .mui-dtpicker-title h5,[data-type=date] .mui-picker{width:33.3%}[data-type=hour] .mui-dtpicker-title h5,[data-type=hour] .mui-picker{width:25%}[data-type=month] .mui-dtpicker-title h5,[data-type=month] .mui-picker,[data-type=time] .mui-dtpicker-title h5,[data-type=time] .mui-picker{width:50%} -------------------------------------------------------------------------------- /ihome/static/js/ihome/orders.js: -------------------------------------------------------------------------------- 1 | new Vue({ 2 | el: '#v-container', 3 | data: { 4 | urlRefer: '', 5 | orders: [], 6 | order_id: '', 7 | order_comment: '', 8 | }, 9 | methods: { 10 | // 获取cookie 11 | getCookie: function(name) { 12 | var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); 13 | return r ? r[1] : undefined; 14 | }, 15 | 16 | // 获取页面的来源路径 17 | getReferPath: function(isAll) { 18 | // isAll为bool值, 确定是否获取整个域名, 默认不传, 则设为false将只截取域名后面的路径包括参数 19 | isAll = isAll ? isAll : false; 20 | refer_url = document.referrer; 21 | path = refer_url.replace(/((http:|https:)\/\/|\d)[^\/]*/, ""); 22 | if (isAll) path = refer_url; 23 | if (!path) path = '/'; 24 | // 返回截取后的路径, 或完整URL 25 | return path 26 | }, 27 | 28 | // 解析提取url中的查询字符串参数, 如: /?key=value&key2=value2... 29 | decodeQuery: function (){ 30 | var search = decodeURI(document.location.search); 31 | return search.replace(/(^\?)/, '').split('&').reduce(function(result, item){ 32 | values = item.split('='); 33 | result[values[0]] = values[1]; 34 | // 它返回一个对象, 如{key: value, ...} 其中key为URL参数中的键名, value为键值... 35 | return result; 36 | }, {}); 37 | }, 38 | 39 | // 页面初始化, 获取房屋信息 40 | getOrders: function(){ 41 | this.$http.get('/api/1.0/order/orders?role=customer').then(function(res){ 42 | if(res.body.errcode == "4101"){ 43 | // 用户未登录 44 | location.href = "/login.html"; 45 | }else if(res.body.errcode == '0'){ 46 | this.orders = res.body.data.orders; 47 | }else{ 48 | alert(res.body.errmsg); 49 | } 50 | }) 51 | }, 52 | 53 | // 发表评价按钮触发的事件, 获取id 54 | commentOrPay: function(event){ 55 | this.order_id = event.target.dataset.orderId; 56 | }, 57 | 58 | // 确认评价 59 | affComent: function(){ 60 | let headers = { 61 | 'Content-Type': "application/json", 62 | "X-CSRFToken": this.getCookie("csrf_token") 63 | } 64 | let data = { 65 | comment: this.order_comment, 66 | } 67 | // 转json 68 | let jsonData = JSON.stringify(data); 69 | 70 | this.$http.put('/api/1.0/order/'+this.order_id+'/comment', jsonData, {headers: headers}).then(function(res){ 71 | if(res.body.errcode == '0'){ 72 | this.$refs.commentModal.style.display = 'none'; 73 | // 去掉遮罩层 74 | let backdrop = document.querySelector('.modal-backdrop') 75 | backdrop.parentNode.removeChild(backdrop); 76 | document.body.className = ''; 77 | // 重新加载页面数据 78 | this.getOrders(); 79 | }else{ 80 | alert(res.body.errmsg); 81 | } 82 | }); 83 | }, 84 | 85 | // 确认支付 86 | affPay: function(event){ 87 | this.order_id = event.target.dataset.orderId; 88 | let headers = { 89 | 'Content-Type': "application/json", 90 | "X-CSRFToken": this.getCookie("csrf_token") 91 | } 92 | this.$http.post('/api/1.0/order/'+this.order_id+'/pay', '{}', {headers: headers}).then(function(res){ 93 | if(res.body.errcode == "4101"){ 94 | // 未登录 95 | location.href = '/login.html'; 96 | }else if(res.body.errcode == "0"){ 97 | // 然后引导用户跳转到支付链接, 新开一个窗口 98 | // location.href = res.body.pay_url; 99 | window.open(res.body.pay_url) 100 | 101 | // 如果支付成功, 就马上查询订单状态 102 | this.$http.get('/api/1.0/order/'+this.order_id+'/pay-query', '{}', {headers: headers}).then(function(res){ 103 | if(res.body.errcode == "0"){ 104 | // 如果交易成功, 则重新加载页面数据, 更新支付状态 105 | this.getOrders(); 106 | }else{ 107 | alert(res.body.errmsg); 108 | } 109 | }) 110 | }else{ 111 | alert(res.body.errmsg); 112 | } 113 | }) 114 | } 115 | }, 116 | created: function(){ 117 | this.urlRefer = this.getReferPath(); 118 | this.getOrders(); 119 | }, 120 | 121 | mounted: function(){ 122 | 123 | } 124 | }) 125 | -------------------------------------------------------------------------------- /ihome/static/js/ihome/detail.js: -------------------------------------------------------------------------------- 1 | new Vue({ 2 | el: "#v-container", 3 | data: { 4 | // 轮播用 5 | sliderItems: [], 6 | sliderItemslength: 1, 7 | // 存储房屋详情, 根据实际数据, 定义初始类型 8 | houseDetails: {}, 9 | // 存储访客id 10 | call_user_id: '', 11 | // 存储来路 12 | refer_url: '', 13 | // 房屋设施 14 | facilities: [ 15 | {id: 1, name: '无线网络', clsName: 'wirelessnetwork-ico'}, 16 | {id: 2, name: '热水淋浴', clsName: 'shower-ico'}, 17 | {id: 3, name: '空调', clsName: 'aircondition-ico'}, 18 | {id: 4, name: '暖气', clsName: 'heater-ico'}, 19 | {id: 5, name: '允许吸烟', clsName: 'smoke-ico'}, 20 | {id: 6, name: '饮水设备', clsName: 'drinking-ico'}, 21 | {id: 7, name: '牙具', clsName: 'brush-ico'}, 22 | {id: 8, name: '香皂', clsName: 'soap-ico'}, 23 | {id: 9, name: '拖鞋', clsName: 'slippers-ico'}, 24 | {id: 10, name: '手纸', clsName: 'toiletpaper-ico'}, 25 | {id: 11, name: '毛巾', clsName: 'towel-ico'}, 26 | {id: 12, name: '沐浴露、洗发露', clsName: 'toiletries-ico'}, 27 | {id: 13, name: '冰箱', clsName: 'icebox-ico'}, 28 | {id: 14, name: '洗衣机', clsName: 'washer-ico'}, 29 | {id: 15, name: '电梯', clsName: 'elevator-ico'}, 30 | {id: 16, name: '允许做饭', clsName: 'iscook-ico'}, 31 | {id: 17, name: '允许带宠物', clsName: 'pet-ico'}, 32 | {id: 18, name: '允许聚会', clsName: 'meet-ico'}, 33 | {id: 19, name: '门禁系统', clsName: 'accesssys-ico'}, 34 | {id: 20, name: '停车位', clsName: 'parkingspace-ico'}, 35 | {id: 21, name: '有线网络', clsName: 'wirednetwork-ico'}, 36 | {id: 22, name: '电视', clsName: 'tv-ico'}, 37 | {id: 23, name: '浴缸', clsName: 'hotbathtub-ico'}, 38 | ], 39 | }, 40 | methods: { 41 | // 解析提取url中的查询字符串参数 42 | decodeQuery: function() { 43 | var search = decodeURI(document.location.search); 44 | return search.replace(/(^\?)/, '').split('&').reduce(function(result, item) { 45 | values = item.split('='); 46 | result[values[0]] = values[1]; 47 | return result; 48 | }, {}); 49 | }, 50 | 51 | // 获取房屋详情信息 52 | getHouseDetails: function() { 53 | house_id = this.decodeQuery().house_id; 54 | this.$http.get('/api/1.0/house/details?house_id=' + house_id).then(function(res) { 55 | if (res.body.errcode == "0") { 56 | this.houseDetails = res.body.data; 57 | this.call_user_id = res.body.call_user_id; 58 | } else { 59 | alert(res.body.errmsg); 60 | } 61 | }) 62 | // return []; 63 | }, 64 | 65 | // 获取页面路径来源 66 | getReferPath: function(isAll) { 67 | // isAll为bool值, 确定是否获取整个域名, 默认不传, 则设为false将只截取域名后面的路径包括参数 68 | isAll = isAll ? isAll : false; 69 | refer_url = document.referrer; 70 | path = refer_url.replace(/((http:|https:)\/\/|\d)[^\/]*/, ""); 71 | if(isAll) path = refer_url; 72 | if(!path) path = '/'; 73 | // 返回截取后的路径, 或完整URL 74 | return path 75 | }, 76 | 77 | // 自动设置轮播窗口的高度 78 | setSliderHeigt: function() { 79 | this.$refs.swiperContainer.style.height = this.$refs.swiperContainer.offsetWidth * 0.8 + 'px'; 80 | }, 81 | 82 | // 设置轮播 83 | setSlider: function(){ 84 | let xtSliderLength = this.$refs.swiperContainer.children.length; 85 | if(this.sliderItemslength >= xtSliderLength){ 86 | this.sliderItemslength = 0; 87 | } 88 | let self = this; 89 | Array.from(self.$refs.swiperContainer.children).forEach(function (item, index) { 90 | if(index != self.sliderItemslength){ 91 | item.style.cssText = "right: -100%; display: none;"; 92 | item.style.right = '-100%'; 93 | }else{ 94 | item.style.cssText = "right: 0; display: block;"; 95 | } 96 | }); 97 | this.sliderItemslength += 1; 98 | } 99 | }, 100 | created: function() { 101 | this.getHouseDetails(); 102 | this.refer_url = this.getReferPath(); 103 | }, 104 | mounted: function(){ 105 | this.setSliderHeigt(); 106 | window.addEventListener('resize', this.setSliderHeigt); 107 | let self = this; 108 | setInterval(function(){ 109 | self.setSlider() 110 | }, 3000); 111 | }, 112 | updated: function(){ 113 | // 初始化显示轮播 114 | this.$refs.swiperContainer.children[0].style.cssText = "right: 0; display: block;"; 115 | } 116 | }) 117 | -------------------------------------------------------------------------------- /ihome/static/html/search.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 爱家-房源 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 | 26 |
    27 |
  • 28 | 入住日期 29 | 30 | | 31 |
  • 32 |
  • 33 | 位置区域 34 | 35 | | 36 |
  • 37 |
  • 38 | 最新上线 39 | 40 |
  • 41 |
42 |
43 |
44 |
45 | 46 | 47 | 48 |
49 |
50 |
    51 |
52 |
    53 |
  • 最新上线
  • 54 |
  • 入住最多
  • 55 |
  • 价格 低-高
  • 56 |
  • 价格 高-低
  • 57 |
58 |
59 |
60 |
61 | 63 |
  • 非常抱歉, 没有找到您要的房屋信息

  • 64 |
  • 65 | 66 | 67 | 68 |
    69 |
    70 | 71 |
    72 |
    73 | ¥{{(house.price/100.0).toFixed(0)}}/晚 74 |
    75 |
    76 | {{house.title}} 77 | 出租{{house.room_count}}间 - {{house.order_count}}次入住 - {{house.address}} 78 |
    79 |
    80 |
  • 81 | 84 |
    85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | --------------------------------------------------------------------------------