├── .gitignore ├── README.md ├── YinguOnline ├── __init__.py ├── celery.py ├── settings.py ├── urls.py ├── views.py └── wsgi.py ├── celery.sh ├── controller ├── __init__.py ├── core │ ├── __init__.py │ ├── access.py │ ├── excel.py │ ├── local_mysql.py │ ├── mailtable.py │ ├── public.py │ ├── query_sql.py │ └── unicode_width.py └── public │ ├── __init__.py │ ├── log.py │ ├── mailclass.py │ ├── mysql_helper.py │ └── pagination.py ├── custag ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── templatetags │ ├── __init__.py │ └── ygol_filter_tag.py ├── tests.py └── views.py ├── manage.py ├── requirements.txt ├── scheduled_tasks ├── __init__.py ├── admin.py ├── apps.py ├── conf │ ├── __init__.py │ └── config.py ├── mail_task.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20171018_1723.py │ ├── 0003_delete_scheduledtask.py │ ├── 0004_scheduledtask.py │ ├── 0005_database.py │ ├── 0006_auto_20171101_1558.py │ ├── 0007_auto_20171101_1616.py │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py ├── static ├── css │ └── login.css ├── img │ ├── icons.png │ └── login_bg.jpg ├── js │ └── csrf.js ├── plugins │ ├── bootstarp-table │ │ ├── bootstrap-table-zh-CN.js │ │ ├── bootstrap-table.min.css │ │ └── bootstrap-table.min.js │ ├── datatables │ │ ├── css │ │ │ ├── jquery.dataTables.css │ │ │ └── jquery.dataTables_themeroller.css │ │ └── js │ │ │ ├── jquery.dataTables.js │ │ │ └── jquery.dataTables.min.js │ └── layer │ │ ├── layer.js │ │ └── skin │ │ ├── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif │ │ └── layer.css └── template │ ├── bootstrap │ ├── css │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ └── bootstrap.min.js │ ├── css │ ├── bootstrap-datepicker.css │ ├── bootstrap-datepicker.min.css │ ├── bootstrap-timepicker.css │ ├── bootstrap-wysihtml5.css │ ├── chosen │ │ ├── chosen-sprite.png │ │ ├── chosen-sprite@2x.png │ │ └── chosen.min.css │ ├── colorbox │ │ ├── colorbox.css │ │ └── images │ │ │ ├── border.png │ │ │ ├── controls.png │ │ │ ├── loading.gif │ │ │ ├── loading_background.png │ │ │ └── overlay.png │ ├── datepicker.css │ ├── dropzone │ │ ├── dropzone.css │ │ └── images │ │ │ ├── spritemap.png │ │ │ └── spritemap@2x.png │ ├── endless-landing.min.css │ ├── endless-skin.css │ ├── endless.css │ ├── endless.min.css │ ├── font-awesome.min.css │ ├── fullcalendar.css │ ├── gritter │ │ ├── images │ │ │ ├── gritter-light.png │ │ │ ├── gritter.png │ │ │ └── ie-spacer.gif │ │ └── jquery.gritter.css │ ├── jcarousel.responsive.css │ ├── jquery.dataTables_themeroller.css │ ├── jquery.tagsinput.css │ ├── morris.css │ ├── pace.css │ ├── prettify.css │ └── slider.css │ ├── fonts │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff │ ├── img │ ├── email_template │ │ ├── color1.png │ │ ├── color2.png │ │ ├── color3.png │ │ ├── color4.png │ │ ├── color5.png │ │ └── color6.png │ ├── gallery1.jpg │ ├── gallery10.jpg │ ├── gallery11.jpg │ ├── gallery12.jpg │ ├── gallery13.jpg │ ├── gallery14.jpg │ ├── gallery15.jpg │ ├── gallery2.jpg │ ├── gallery3.jpg │ ├── gallery4.jpg │ ├── gallery5.jpg │ ├── gallery6.jpg │ ├── gallery7.jpg │ ├── gallery8.jpg │ ├── gallery9.jpg │ ├── movie │ │ ├── preview1.jpg │ │ ├── preview10.jpg │ │ ├── preview11.jpg │ │ ├── preview12.jpg │ │ ├── preview13.jpg │ │ ├── preview14.jpg │ │ ├── preview15.jpg │ │ ├── preview2.jpg │ │ ├── preview3.jpg │ │ ├── preview4.jpg │ │ ├── preview5.jpg │ │ ├── preview6.jpg │ │ ├── preview7.jpg │ │ ├── preview8.jpg │ │ └── preview9.jpg │ ├── responsive.png │ ├── screenshot.jpg │ ├── user.jpg │ ├── user2.jpg │ ├── user3.jpg │ ├── user4.jpg │ └── user5.jpg │ └── js │ ├── bootstrap-datepicker.js │ ├── bootstrap-datepicker.zh-CN.min.js │ ├── bootstrap-slider.min.js │ ├── bootstrap-timepicker.min.js │ ├── chosen.jquery.min.js │ ├── dropzone.min.js │ ├── endless │ ├── endless.js │ ├── endless_dashboard.js │ ├── endless_form.js │ └── endless_wizard.js │ ├── fullcalendar.min.js │ ├── jquery-1.10.2.min.js │ ├── jquery-ui-map │ └── ui │ │ └── min │ │ ├── jquery.ui.map.full.min.js │ │ └── jquery.ui.map.microformat.min.js │ ├── jquery-ui.js │ ├── jquery.colorbox.min.js │ ├── jquery.cookie.min.js │ ├── jquery.dataTables.min.js │ ├── jquery.flot.min.js │ ├── jquery.gritter.min.js │ ├── jquery.jcarousel.min.js │ ├── jquery.localscroll.min.js │ ├── jquery.maskedinput.min.js │ ├── jquery.nestable.min.js │ ├── jquery.popupoverlay.min.js │ ├── jquery.resize.min.js │ ├── jquery.scrollTo.min.js │ ├── jquery.slimscroll.min.js │ ├── jquery.sparkline.min.js │ ├── jquery.tagsinput.min.js │ ├── modernizr.min.js │ ├── morris.min.js │ ├── pace.min.js │ ├── parsley.min.js │ ├── rapheal.min.js │ ├── uncompressed │ ├── bootstrap-wysihtml5.js │ ├── holder.js │ ├── pace.js │ └── run_prettify.js │ ├── waypoints.min.js │ └── wysihtml5-0.3.0.min.js └── templates ├── 403.html ├── 404.html ├── base.html ├── index.html ├── login.htm └── scheduled_tasks ├── add_crontabs.html ├── add_periodic_task.html ├── crontabs.html ├── mod_crontabs.html ├── mod_periodic_task.html └── periodic_task.html /.gitignore: -------------------------------------------------------------------------------- 1 | # python pyc 2 | *.pyc 3 | 4 | # caifu user file 5 | people/upload 6 | *.xlsx 7 | 8 | # change/upload 9 | change/upload 10 | 11 | # log 12 | *.log 13 | 14 | # out 15 | *.out 16 | 17 | # pid 18 | *.pid 19 | 20 | # 21 | YinguOnline/settings.py 22 | 23 | # pycharm 24 | .idea 25 | 26 | # celery 27 | $celery_log_file 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/README.md -------------------------------------------------------------------------------- /YinguOnline/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | # This will make sure the app is always imported when 4 | # Django starts so that shared_task will use this app. 5 | from .celery import app as celery_app -------------------------------------------------------------------------------- /YinguOnline/celery.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python env 2 | # -*- coding: UTF-8 -*- 3 | # Description: 4 | # Author: 黄小雪 5 | # Date: 2017年03月25日 6 | # Company: 东方银谷 7 | 8 | 9 | from __future__ import absolute_import 10 | import os 11 | from celery import Celery 12 | from django.conf import settings 13 | 14 | # set the default Django settings module for the 'celery' program. 15 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'YinguOnline.settings') 16 | app = Celery('YinguOnline') 17 | 18 | # Using a string here means the worker will not have to 19 | # pickle the object when using Windows. 20 | app.config_from_object('django.conf:settings') 21 | app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 22 | 23 | 24 | @app.task(bind=True) 25 | def debug_task(self): 26 | print('Request: {0!r}'.format(self.request)) -------------------------------------------------------------------------------- /YinguOnline/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | """YinguOnline URL Configuration 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/1.9/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.conf.urls import url, include 15 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 16 | """ 17 | 18 | from django.conf.urls import include, url 19 | from django.conf import settings 20 | from django.contrib import admin 21 | admin.autodiscover() 22 | # from django.conf.urls import handler404, handler500, handler403 23 | from django.contrib.auth.views import logout 24 | from django.contrib.auth.views import login 25 | # from django.contrib.auth import views as auth_views 26 | from views import * 27 | 28 | urlpatterns = [ 29 | url(r'^admin/', admin.site.urls), 30 | 31 | url(r'^index/$', index), # 首页 32 | url(r'^$', index, name='index'), 33 | url(r'^accounts/login/$', login, {'template_name': 'login.htm'}), 34 | url(r'^accounts/logout/$', logout), 35 | url(r'^get_username/$', get_username), # 获取当前登陆用户名 36 | url(r'^check_permission/$', check_permission), # 检测用户权限 37 | url(r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}), 38 | 39 | # 人员 40 | # url(r'^people/', include('people.urls')), 41 | # 运营日报 42 | # url(r'^report/', include('report.urls')), 43 | # 监控 44 | # url(r'^monitor/', include('monitor.urls')), 45 | # 变更 46 | # url(r'^change/', include('change.urls')), 47 | # 数据库管理工具 48 | # url(r'^dtmt/', include('dtmt.urls')), 49 | # 定时任务 50 | url(r'^scheduled_tasks/', include('scheduled_tasks.urls')), 51 | # 业务查询 52 | # url(r'^business_query/', include('business_query.urls')), 53 | # 帮助(其它功能) 54 | # url(r'^help/', include('help.urls')) 55 | ] 56 | 57 | 58 | # handler404 = page_not_found #handler404 59 | # handler403 = permission_denied #handler403 60 | -------------------------------------------------------------------------------- /YinguOnline/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from django.contrib.auth.decorators import permission_required 3 | from django.contrib.auth.decorators import login_required 4 | from django.shortcuts import render_to_response 5 | from django.template import RequestContext 6 | from django.http import HttpResponse 7 | from django.contrib import auth 8 | from controller.core.public import * 9 | import json 10 | 11 | # Create your views here. 12 | 13 | 14 | @login_required 15 | def index(request): 16 | # 首页 17 | nowuser = auth.get_user(request) 18 | return render_to_response('index.html', locals(), context_instance=RequestContext(request)) 19 | 20 | 21 | def page_not_found(request): 22 | return render_to_response("404.html") 23 | 24 | 25 | def permission_denied(request): 26 | return render_to_response("403.html") 27 | 28 | 29 | @login_required 30 | def get_username(request): 31 | # 获取当前登陆的用户名 32 | nowuser = auth.get_user(request) 33 | username = nowuser.get_username() 34 | response = HttpResponse() 35 | response.write(json.dumps(username)) 36 | return response 37 | 38 | 39 | @login_required 40 | def check_permission(request): 41 | # 检测用户权限 42 | nowuser = auth.get_user(request) 43 | cur = Currency(request) 44 | permission = cur.rq_post('permission') 45 | status = 0 if nowuser.has_perm(permission) else 1 46 | response = HttpResponse() 47 | response.write(json.dumps({'status': status})) 48 | return response -------------------------------------------------------------------------------- /YinguOnline/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for YinguOnline project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "YinguOnline.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /celery.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # celery runing script 3 | 4 | celerybin=/home/huangxiaoxue/package/python/bin/celery 5 | celery_pid_file=/home/huangxiaoxue/application/project/YinguOnline/log/run/celery.pid 6 | celery_log_file=/home/huangxiaoxue/application/project/YinguOnline/log/celery.log 7 | 8 | 9 | celery_start(){ 10 | $celerybin multi start -A YinguOnline worker --pidfile=$celery_pid_file --logfile='$celery_log_file' -l info 11 | } 12 | 13 | 14 | celery_stop(){ 15 | $celerybin multi stopwait -A YinguOnline worker --pidfile=$celery_pid_file --logfile='$celery_log_file' -l info 16 | } 17 | 18 | 19 | 20 | test_status(){ 21 | if test -e $celery_pid_file 22 | then 23 | echo 'celery is runing' 24 | else 25 | echo 'celery stoped' 26 | fi 27 | 28 | } 29 | 30 | case $1 in 31 | start) 32 | celery_start 33 | ;; 34 | stop) 35 | celery_stop 36 | ;; 37 | status) 38 | test_status 39 | ;; 40 | *) 41 | echo './celery.sh start | stop | status' 42 | ;; 43 | esac 44 | 45 | 46 | -------------------------------------------------------------------------------- /controller/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/controller/__init__.py -------------------------------------------------------------------------------- /controller/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/controller/core/__init__.py -------------------------------------------------------------------------------- /controller/core/access.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | # Description: 3 | # Author: 黄小雪 4 | # Date: 2017年09月07日 5 | # Company: 东方银谷 6 | from public import * 7 | from django.http import HttpResponse 8 | from business_query.configuration.sqlList import * 9 | from dtmt.query import Database_Connection 10 | from functools import wraps 11 | import json 12 | import logging 13 | 14 | 15 | def verification(check_class): 16 | """ 17 | 装饰器用于检测用户提交的信息是否合法. 18 | check_class 检测类 19 | Decorator for views that checks that the user submitted information, 20 | redirecting to the log-in page if necessary. The test should be a callable 21 | that takes the user object and returns True if the user passes. 22 | """ 23 | 24 | def decorator(view_func): 25 | @wraps(view_func) 26 | def _wrapped_view(request, *args, **kwargs): 27 | response = HttpResponse() 28 | ccl = check_class(request) 29 | check_status, error_msg = ccl.total_check() 30 | if check_status: 31 | response.write(json.dumps({'status': check_status, 'msg': error_msg})) 32 | return response 33 | 34 | return view_func(request, *args, **kwargs) 35 | return _wrapped_view 36 | return decorator 37 | 38 | 39 | class Check_IBQ(object): 40 | """ 41 | 检测投资批量查询提交的信息 42 | error_msg 存放所有错误消息 43 | check_status 错误状态 1 错误,0 正常,主要用于前端的JavaScript进行判断 44 | total_check 启动所有检测,返回检测状态和错误消息 45 | """ 46 | def __init__(self, request): 47 | cur = Currency(request) 48 | rq_post = getattr(cur, 'rq_post') 49 | jdata = rq_post('data') 50 | data = json.loads(jdata) 51 | self.data = data 52 | self.conf = investment_batch_query_conf 53 | self.error_msg = [] 54 | 55 | def check_data(self): 56 | # 检测脚本名称 57 | isdigit = [d for d in self.data if str(d).isdigit()] 58 | if not isdigit: 59 | self.error_msg.append(u'请输入手机号') 60 | else: 61 | if len(self.data) > self.conf['maxNum']: 62 | self.error_msg.append(u'每次查询量不能超过%s' % self.conf['maxNum']) 63 | 64 | def total_check(self): 65 | self.check_data() 66 | status = 1 if self.error_msg else 0 67 | 68 | return status, self.error_msg 69 | 70 | 71 | class Check_PCI(object): 72 | """ 73 | 离职员工客户信息查询 74 | error_msg 存放所有错误消息 75 | check_status 错误状态 1 错误,0 正常,主要用于前端的JavaScript进行判断 76 | total_check 启动所有检测,返回检测状态和错误消息 77 | """ 78 | def __init__(self, request): 79 | cur = Currency(request) 80 | rq_post = getattr(cur, 'rq_post') 81 | jdata = rq_post('data') 82 | data = json.loads(jdata) 83 | self.logger = logging.getLogger('business_query') 84 | self.dc = Database_Connection(self.logger) 85 | self.data = data 86 | self.conf = puhuiCustomerInfoConf 87 | self.error_msg = [] 88 | 89 | def check_data(self): 90 | # 检测脚本名称 91 | isdigit = [d for d in self.data if str(d)] 92 | if not isdigit: 93 | self.error_msg.append(u'请输入工号') 94 | else: 95 | if len(self.data) > self.conf['maxNum']: 96 | self.error_msg.append(u'每次查询量不能超过%s' % self.conf['maxNum']) 97 | 98 | def checkDateMaxNum(self): 99 | # 每天最多查询5次 100 | res = self.dc._r.hmget('puhuiCustomerInfo', 'count')[0] 101 | count = int(res) if res else 0 102 | if count >= 5: 103 | self.error_msg.append(u'今天已查询5次,欢迎明天再来查询!') 104 | 105 | def total_check(self): 106 | self.check_data() 107 | self.checkDateMaxNum() 108 | status = 1 if self.error_msg else 0 109 | 110 | return status, self.error_msg 111 | 112 | 113 | -------------------------------------------------------------------------------- /controller/core/excel.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # -*-coding:utf-8-*- 3 | ################################################## 4 | # Function: 银谷在线注册统计及出借统计脚本 5 | # Usage: python start.py 6 | # Author: 黄小雪 7 | # Date: 2016年7月19日 8 | # Company: 9 | # Version: 1.2 10 | ################################################## 11 | 12 | import xlwt 13 | import xlrd 14 | from unicode_width import * 15 | from openpyxl import Workbook 16 | from openpyxl.utils import get_column_letter 17 | from openpyxl.styles import Font, Alignment 18 | 19 | 20 | def set_style(name, height, bold=False): 21 | # 设置单元格样式 22 | style = xlwt.XFStyle() # 初始化样式 23 | 24 | font = xlwt.Font() # 为样式创建字体 25 | font.name = name # 'Times New Roman' 26 | font.bold = bold 27 | font.color_index = 4 28 | font.height = height 29 | 30 | al = xlwt.Alignment() 31 | al.horz = xlwt.Alignment.HORZ_CENTER # 设置水平居中 32 | al.vert = xlwt.Alignment.VERT_CENTER # 设置垂直居中 33 | 34 | style.font = font 35 | style.alignment = al 36 | return style 37 | 38 | 39 | def get_table(file, table=False): 40 | # 获取表格数据 41 | data = xlrd.open_workbook(file) 42 | sheets = False 43 | if table: 44 | table = data.sheets()[0] 45 | else: 46 | sheets = data.sheets() 47 | 48 | return table or sheets 49 | 50 | 51 | def sheet_write(f, sheet_name, row0, rows, width): 52 | # 写入工作簿 53 | sheet = f.add_sheet(sheet_name, cell_overwrite_ok=True) # 创建sheet 54 | 55 | # 生成第一行 56 | for i in range(0, len(row0)): 57 | sheet.write(0, i, row0[i], set_style('Times New Roman', 220, True)) 58 | sheet.col(i).width = 256 * width[i] 59 | 60 | for j in range(0, len(rows)): 61 | row = rows[j] 62 | for i in range(0, len(row)): 63 | sheet.write(j + 1, i, row[i], set_style('Times New Roman', 220, False)) 64 | 65 | 66 | class Openpyxl(object): 67 | # openpyxl 生成excel文件 68 | def __init__(self, filename): 69 | self.ft1 = Font(name='Calibri', bold=True) 70 | self.ft2 = Font(name='Calibri') 71 | self.al = Alignment(horizontal='center', vertical='center') 72 | self.filename = filename 73 | self.wb = Workbook() 74 | 75 | def __set_width(self, rows, ws): 76 | widths = get_width(*rows) 77 | for i in xrange(len(widths)): 78 | ws.column_dimensions[get_column_letter(i + 1)].width = widths[i] 79 | 80 | def __get_new_ws(self, title): 81 | new_ws = self.wb.get_active_sheet() 82 | 83 | if len(new_ws.get_cell_collection()) == 0: 84 | new_ws.title = title 85 | else: 86 | new_ws = self.wb.create_sheet(title=title) 87 | 88 | return new_ws 89 | 90 | def add_sheet(self, title, rows): 91 | new_ws = self.__get_new_ws(title) 92 | 93 | for i in range(len(rows)): 94 | row = rows[i] 95 | for j in range(len(row)): 96 | new_ws.cell(row=i + 1, column=j + 1).value = row[j] 97 | 98 | if i == 0: 99 | new_ws.cell(row=i + 1, column=j + 1).font = self.ft1 100 | else: 101 | new_ws.cell(row=i + 1, column=j + 1).font = self.ft2 102 | new_ws.cell(row=i + 1, column=j + 1).alignment = self.al 103 | 104 | self.__set_width(rows, new_ws) 105 | 106 | def save(self): 107 | self.wb.save(filename=self.filename) 108 | -------------------------------------------------------------------------------- /controller/core/local_mysql.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # -*-coding:utf-8-*- 3 | ################################################## 4 | # Function: 银谷在线注册统计及出借统计脚本 5 | # Usage: python start.py 6 | # Author: 黄小雪 7 | # Date: 2016年7月19日 8 | # Company: 9 | # Version: 1.2 10 | ################################################## 11 | 12 | 13 | from controller.public.mysql_helper import Business 14 | 15 | 16 | Business(host, user, passwd, db) -------------------------------------------------------------------------------- /controller/core/mailtable.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python env 2 | # -*- coding: UTF-8 -*- 3 | # Description: 4 | # Author: 黄小雪 5 | # Date: 2017年07月04日 6 | # Company: 东方银谷 7 | 8 | 9 | class MailTable(object): 10 | """ 11 | 邮件html表格 12 | """ 13 | def __init__(self): 14 | pass 15 | 16 | @property 17 | def style(self): 18 | _style = """ 19 | 45 | """ 46 | return _style 47 | 48 | def table(self, caption, rows): 49 | row0 = rows[0] 50 | tr0 = self._tr0_list(row0) 51 | total_tr_list = [self._tr_list(row) for row in rows[1:]] 52 | tr_body = ''.join(total_tr_list) 53 | _table = """ 54 | 55 | 56 | %s 57 | %s 58 |
%s
59 | """ % (caption, tr0, tr_body) 60 | return _table 61 | 62 | def _tr_list(self, row): 63 | _tr_list = ['%s' % r for r in row] 64 | _tr = '%s' % ''.join(_tr_list) 65 | return _tr 66 | 67 | def _tr0_list(self, row): 68 | _tr_list = ['%s' % r for r in row] 69 | _tr = '%s' % ''.join(_tr_list) 70 | return _tr 71 | 72 | -------------------------------------------------------------------------------- /controller/core/public.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | import datetime 3 | 4 | 5 | class Currency(object): 6 | # 通用帮助 7 | def __init__(self, request): 8 | self.request = request 9 | 10 | def rq_get(self, key): 11 | return self.request.GET.get(key, '').strip() 12 | 13 | def rq_post(self, key): 14 | return self.request.POST.get(key, '').strip() 15 | 16 | 17 | class Datetime_help(object): 18 | # 日期时间帮助 19 | def __init__(self): 20 | self.now_time = datetime.datetime.now() 21 | 22 | def strptime(self, value, format): 23 | return datetime.datetime.strptime(value, format) 24 | 25 | @property 26 | def nowtimestrf1(self): 27 | return self.now_time.strftime('%Y-%m-%d %H:%M:%S') 28 | 29 | @property 30 | def nowtimestrf2(self): 31 | return self.now_time.strftime('%Y年%m月%d日 %H点%M分%S秒') 32 | 33 | @property 34 | def nowtimestrf3(self): 35 | return self.now_time.strftime('%Y%m%d%H%M%S') 36 | 37 | @property 38 | def nowtimestrf4(self): 39 | return self.now_time.strftime('%Y%m%d') 40 | 41 | @property 42 | def nowtimestrf5(self): 43 | return self.now_time.strftime('%Y-%m-%d') 44 | 45 | @property 46 | def nowtimestrf6(self): 47 | return self.now_time.strftime(u'%Y年%m月%d日') 48 | 49 | @property 50 | def yesterday(self): 51 | yd = self.now_time - datetime.timedelta(days=1) 52 | return yd 53 | 54 | @property 55 | def yesterdaystrf4(self): 56 | return self.yesterday.strftime('%Y%m%d') 57 | 58 | @property 59 | def yesterdaystrf5(self): 60 | return self.yesterday.strftime('%Y-%m-%d') 61 | 62 | @property 63 | def yesterdaystrf6(self): 64 | return self.yesterday.strftime(u'%Y年%m月%d日') -------------------------------------------------------------------------------- /controller/core/query_sql.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python env 2 | # -*- coding: UTF-8 -*- 3 | # Description: 4 | # Author: 黄小雪 5 | # Date: 2017年03月29日 6 | # Company: 东方银谷 7 | from controller.core.public import * 8 | import decimal 9 | 10 | 11 | class Q_Sql(object): 12 | """ 13 | # 查询sql 14 | table_a = { 15 | 'delivery_id': {'data_type': 'str', 'val':''}, 16 | 'customer': {'data_type': 'str', 'val':''}, 17 | 'customer_cn': {'data_type': 'str', 'val':''}, 18 | 'employee': {'data_type': 'str', 'val':''}, 19 | 'employee_cn': {'data_type': 'str', 'val':''}, 20 | 'former_employee': {'data_type': 'str', 'val':''}, 21 | 'former_employee_cn': {'data_type': 'str', 'val':''}, 22 | 'result': {'data_type': 'str', 'val':''}, 23 | 'start_time': {'data_type': 'datetime', 'val':''}, 24 | 'end_time': {'data_type': 'datetime', 'val':''}, 25 | } 26 | 27 | table_b = { 28 | 'large_area': {'data_type': 'str', 'val': '区'}, 29 | 'store': {'data_type': 'str', 'val': '一部'}, 30 | 'emp_num': {'data_type': 'str', 'val': 'test'} 31 | } 32 | 33 | table_c ={ ... ... } 34 | ... 35 | ... 36 | 37 | tables = {'a':table_a, 'b':table_b, 'c':table_c ... ...} 38 | 39 | """ 40 | 41 | def __init__(self, cvtpara, **tables): 42 | self._offset = cvtpara['offset'] 43 | self._limit = cvtpara['limit'] 44 | self.tables = tables 45 | 46 | self._SQL = cvtpara['sql'] 47 | self._TOTAL_SQL = cvtpara['total_sql'] 48 | self._order_by = self._set_order_by(cvtpara['order_by']) 49 | 50 | self._para = [] 51 | self._condition = [] 52 | self._condition_sql = '' 53 | 54 | self._data() 55 | self._set_condition() 56 | 57 | def _data(self): 58 | # 获取数据 59 | for t, table in self.tables.items(): 60 | self._set_data(t, table) 61 | 62 | def _set_data(self, t, table): 63 | # 设置查询条件 64 | for field, attr in table.items(): 65 | 66 | if attr['val']: 67 | if attr['data_type'] == 'str': 68 | self._set_str(t, field, **attr) 69 | 70 | if attr['data_type'] == 'datetime': 71 | self._set_datetime(t, field, **attr) 72 | 73 | def _set_str(self, t, field, **attr): 74 | val = attr['val'] 75 | self._condition.append('%s.%s = %%s' % (t, field)) 76 | self._para.append(val) 77 | 78 | def _set_datetime(self, t, field, **attr): 79 | val = attr['val'] 80 | tfield = field.split('_', 1)[1] # 获取时间字段名称 81 | judge = field.split('_', 1)[0] # 判断是开始还是结束时间 'start' or 'end' 82 | if judge == 'start': 83 | self._condition.append('%s.%s >= %%s' % (t, tfield)) 84 | self._para.append(val) 85 | elif judge == 'end': 86 | self._condition.append('%s.%s <= %%s' % (t, tfield)) 87 | self._para.append('%s 23:59:59' % val) 88 | 89 | def _set_order_by(self, order_by): 90 | _order_by_str = '' 91 | _fields = [] 92 | 93 | if order_by: 94 | for dt in order_by: 95 | _table = dt['table'] 96 | _field = dt['field'] 97 | _rule = dt['rule'] 98 | 99 | _field = '%s.%s %s' % (_table, _field, _rule) 100 | _fields.append(_field) 101 | 102 | _fields_str = ','.join(_fields) 103 | _order_by_str = 'ORDER BY %s' % _fields_str 104 | 105 | return _order_by_str 106 | 107 | def _set_condition(self): 108 | if self._condition: 109 | and_sql = '\nand '.join(self._condition) 110 | self._condition_sql = 'where \n%s' % and_sql 111 | 112 | @property 113 | def para(self): 114 | import copy 115 | _para = copy.deepcopy(self._para) 116 | _para.append(self._offset) 117 | _para.append(self._limit) 118 | return _para 119 | 120 | @property 121 | def total_para(self): 122 | return self._para 123 | 124 | @property 125 | def sql(self): 126 | _sql = '\n'.join([self._SQL, self._condition_sql, 127 | self._order_by, 'limit %s,%s']) 128 | return _sql 129 | 130 | @property 131 | def total_sql(self): 132 | _total_sql = '\n'.join([self._TOTAL_SQL, self._condition_sql]) 133 | return _total_sql 134 | 135 | 136 | class Q_Data(object): 137 | # 设置投资数据 138 | def __init__(self, qs): 139 | self._sql = qs.sql 140 | self._para = qs.para 141 | self._total_sql = qs.total_sql 142 | self._total_para = qs.total_para 143 | 144 | def _get_data(self, databases_c): 145 | return databases_c.getall(self._sql, self._para) 146 | 147 | def _data_clean(self, data): 148 | res = {} 149 | for key,val in data.items(): 150 | res[key] = self._data_conversion(val) 151 | return res 152 | 153 | def _data_conversion(self, val): 154 | # 数据转换 155 | new_val = None 156 | if isinstance(val, datetime.datetime): 157 | new_val = val.strftime('%Y-%m-%d %H:%M:%S') 158 | 159 | if isinstance(val, decimal.Decimal): 160 | new_val = float(val) 161 | 162 | return new_val or val 163 | 164 | def _get_rows(self, databases_c): 165 | # rows [{key1: val1, key2: val2, ... ...}] 166 | rows = [] 167 | data = self._get_data(databases_c) 168 | for dt in data: 169 | row = self._data_clean(dt) 170 | rows.append(row) 171 | 172 | return rows 173 | 174 | def _get_total(self, databases_c): 175 | total_data = databases_c.getall(self._total_sql, self._total_para) 176 | total = total_data[0]['count'] 177 | return total 178 | 179 | 180 | class Download_Sql(Q_Sql): 181 | """ 182 | 导出文件的sql 183 | 查询数据时使用重写的sql和total_para去查询 184 | 主要是去掉offset limit,导出数据时不需要分页查询 185 | """ 186 | def __init__(self, cvtpara, **tables): 187 | super(Download_Sql, self).__init__(cvtpara, **tables) 188 | 189 | @property 190 | def sql(self): 191 | _sql = '\n'.join([self._SQL, self._condition_sql, 192 | self._order_by]) 193 | return _sql 194 | 195 | @property 196 | def para(self): 197 | return self._para -------------------------------------------------------------------------------- /controller/core/unicode_width.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #-*-coding:utf-8-*- 3 | 4 | 5 | def get_max_length(arg): 6 | length = str_len(arg[0]) + 2 7 | return length 8 | 9 | 10 | def sort_arg(arg): 11 | arg = list(arg) 12 | arg.sort(cmp=cmp_length) 13 | return arg 14 | 15 | 16 | def cmp_length(a, b): 17 | la = str_len(a) 18 | lb = str_len(b) 19 | 20 | if la > lb: 21 | return -1 22 | elif la < lb: 23 | return 1 24 | else: 25 | return 0 26 | 27 | 28 | def str_len(string): 29 | try: 30 | string = u'%s' % string 31 | row_l=len(string) 32 | utf8_l=len(string.encode('utf-8')) 33 | return (utf8_l-row_l)/2+row_l 34 | except: 35 | return row_l 36 | 37 | 38 | def get_width(*var): 39 | out = zip(*var) 40 | res = map(sort_arg, out) 41 | width = map(get_max_length, res) 42 | return width 43 | 44 | 45 | -------------------------------------------------------------------------------- /controller/public/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/controller/public/__init__.py -------------------------------------------------------------------------------- /controller/public/log.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python env 2 | # -*- coding: UTF-8 -*- 3 | # Description: 日志记录 4 | # Author: 黄小雪 5 | # Date: 2017年02月15日 6 | # Company: 东方银谷 7 | 8 | import logging 9 | 10 | # 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 11 | class Logger(object): 12 | # 用字典保存日志级别 13 | _format_dict = { 14 | 1: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 15 | 2: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 16 | 3: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 17 | 4: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 18 | 5: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 19 | } 20 | 21 | def __init__(self, logname, loglevel, logger): 22 | ''' 23 | 指定保存日志的文件路径,日志级别,以及调用文件 24 | 将日志存入到指定的文件中 25 | ''' 26 | 27 | # 创建一个logger 28 | self.logger = logging.getLogger(logger) 29 | self.logger.setLevel(logging.DEBUG) 30 | 31 | # 创建一个handler,用于写入日志文件 32 | fh = logging.FileHandler(logname) 33 | fh.setLevel(logging.DEBUG) 34 | 35 | # 再创建一个handler,用于输出到控制台 36 | ch = logging.StreamHandler() 37 | ch.setLevel(logging.DEBUG) 38 | 39 | # 定义handler的输出格式 40 | # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 41 | formatter = self._format_dict[int(loglevel)] 42 | fh.setFormatter(formatter) 43 | ch.setFormatter(formatter) 44 | 45 | # 给logger添加handler 46 | self.logger.addHandler(fh) 47 | self.logger.addHandler(ch) 48 | 49 | def getlog(self): 50 | return self.logger 51 | 52 | 53 | -------------------------------------------------------------------------------- /controller/public/mailclass.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # -*-coding:utf-8-*- 3 | ################################################## 4 | # Function: 银谷在线注册统计及出借统计脚本 5 | # Usage: python start.py 6 | # Author: 黄小雪 7 | # Date: 2016年7月19日 8 | # Company: 9 | # Version: 1.2 10 | ################################################## 11 | 12 | import os 13 | import sys 14 | import xlrd 15 | import smtplib 16 | import datetime 17 | from email.header import Header 18 | from email.mime.text import MIMEText 19 | from email.mime.image import MIMEImage 20 | from email.mime.multipart import MIMEMultipart 21 | from email.utils import parseaddr, formataddr 22 | 23 | reload(sys) 24 | sys.setdefaultencoding("utf-8") 25 | 26 | 27 | class MailHelper(object): 28 | # 发html邮件 29 | def __init__(self, mail_host, mail_user, mail_pass, sender, 30 | sender_zh_name, receivers, cc, logger): 31 | # 第三方 SMTP 服务 32 | self.mail_host = mail_host # 设置服务器 33 | self.mail_user = mail_user # 用户名 34 | self.mail_pass = mail_pass # 口令 35 | 36 | self.sender = sender 37 | self.sender_zh_name = sender_zh_name 38 | self.receivers = receivers # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 39 | self.cc = cc # 抄送 40 | 41 | self.message = MIMEMultipart() # 设置附件 42 | self.logger = logger 43 | 44 | def add_attch(self, res_file): 45 | # 添加附件 46 | # 附件为绝对路径 /opt/script/yingu_rt/res/充值提现明细.xls 47 | 48 | # 附件 49 | att1 = MIMEText(open(res_file, 'rb').read(), 'base64', 'utf-8') 50 | att1["Content-Type"] = 'application/octet-stream' 51 | # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 52 | att1["Content-Disposition"] = 'attachment; filename=%s' % Header(res_file.split('/')[-1], 'UTF-8') 53 | self.message.attach(att1) 54 | 55 | def insert_img(self, file): 56 | # 插入图片 57 | # 指定图片为当前目录 58 | fp = open(file, 'rb') 59 | msgImage = MIMEImage(fp.read()) 60 | fp.close() 61 | 62 | # 定义图片 ID,在 HTML 文本中引用 63 | msgImage.add_header('Content-ID', '') 64 | self.message.attach(msgImage) 65 | 66 | def add_content(self, content, subject): 67 | self.message['Subject'] = Header(subject, 'utf-8') 68 | self.message['From'] = self._format_addr(u'%s <%s>'% (self.sender_zh_name, self.sender)) 69 | self.message['To'] = ''.join(self._cvt_receivers(self.receivers)) 70 | self.message['Cc'] = ''.join(self._cvt_receivers(self.cc)) 71 | head_content = """""" 72 | mail_msg = ''.join([head_content, content]) 73 | self.message.attach(MIMEText(mail_msg, 'html', 'utf-8')) 74 | 75 | def _cvt_receivers(self, receivers): 76 | # 收件人乱码处理 77 | return [self._cvt_user(u) for u in receivers] 78 | 79 | def _cvt_user(self, user): 80 | return ''.join(['<', user, '>']) 81 | 82 | def send_htm(self): 83 | # 发送邮件 84 | # 创建一个带附件的实例 85 | 86 | try: 87 | smtpObj = smtplib.SMTP() 88 | smtpObj.connect(self.mail_host, 25) # 25 为 SMTP 端口号 89 | smtpObj.login(self.mail_user, self.mail_pass) 90 | smtpObj.sendmail(self.sender, self.receivers + self.cc, self.message.as_string()) 91 | self.logger.info(u"邮件发送成功") 92 | except smtplib.SMTPException,e: 93 | self.logger.error(u"Error: 无法发送邮件 %s" % e) 94 | 95 | def _format_addr(self, s): 96 | name, addr = parseaddr(s) 97 | return formataddr(( \ 98 | Header(name, 'utf-8').encode(), \ 99 | addr.encode('utf-8') if isinstance(addr, unicode) else addr)) 100 | -------------------------------------------------------------------------------- /controller/public/mysql_helper.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # -*-coding:utf-8-*- 3 | ################################################## 4 | # Function: 银谷在线注册统计及出借统计脚本 5 | # Usage: python start.py 6 | # Author: 黄小雪 7 | # Date: 2016年7月19日 8 | # Company: 9 | # Version: 1.2 10 | ################################################## 11 | import MySQLdb 12 | 13 | 14 | class MysqlHelper(object): 15 | """ 16 | 数据访问层 17 | status:查询状态,True 查询正常,False 查询失败,默认为True 18 | """ 19 | def __init__(self, host, user, passwd, db, logger): 20 | self.__host = host 21 | self.__user = user 22 | self.__passwd = passwd 23 | self.__db = db 24 | self._logger = logger 25 | self.row0 = None 26 | self.rowcount = None 27 | self.error_msg = '' 28 | self.status = True 29 | 30 | def __conn(self): 31 | try: 32 | conn = MySQLdb.connect(host=self.__host, user=self.__user, 33 | passwd=self.__passwd, db=self.__db, 34 | init_command="set names utf8", 35 | charset='utf8') 36 | except Exception, e: 37 | self.error_msg = '%s' % e 38 | self._logger.error(e) 39 | self.status = False 40 | conn = None 41 | return conn 42 | 43 | def getall(self, sql, paramters=None): 44 | conn = self.__conn() 45 | if not conn: 46 | return None 47 | try: 48 | cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) # 返回字典 49 | cur.execute(sql, paramters) 50 | data = cur.fetchall() 51 | self.rowcount = cur.rowcount 52 | self.row0 = [d[0] for d in cur.description] 53 | except Exception, e: 54 | self.error_msg = '%s' % e 55 | self._logger.error(e) 56 | data = None 57 | finally: 58 | cur.close() 59 | conn.commit() 60 | conn.close() 61 | return data 62 | 63 | def getallmany(self, sql, paramters=None): 64 | conn = self.__conn() 65 | if not conn: 66 | return None 67 | try: 68 | cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) # 返回字典 69 | cur.executemany(sql, paramters) 70 | data = cur.fetchall() 71 | except Exception, e: 72 | self._logger.error(e) 73 | data = None 74 | finally: 75 | cur.close() 76 | conn.commit() 77 | conn.close() 78 | return data 79 | 80 | def getsingle(self, sql, paramters=None): 81 | conn = self.__conn() 82 | if not conn: 83 | return None 84 | try: 85 | cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) # 返回字典 86 | cur.execute(sql, paramters) 87 | data = cur.fetchone() 88 | except Exception, e: 89 | # print e 90 | self._logger.error(e) 91 | data = None 92 | finally: 93 | cur.close() 94 | conn.commit() 95 | conn.close() 96 | return data 97 | 98 | def insertmany(self, sql, paramters=None): 99 | conn = self.__conn() 100 | if not conn: 101 | return None 102 | try: 103 | cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) # 返回字典 104 | cur.executemany(sql, paramters) 105 | except Exception, e: 106 | self._logger.error(e) 107 | finally: 108 | cur.close() 109 | conn.commit() 110 | conn.close() 111 | return None 112 | 113 | def getall_list(self, sql, paramters=None): 114 | # 返回列表形式结果 115 | conn = self.__conn() 116 | if not conn: 117 | return None 118 | try: 119 | cur = conn.cursor() # 返回列表 120 | cur.execute(sql, paramters) 121 | data = cur.fetchall() 122 | self.rowcount = cur.rowcount 123 | self.row0 = [d[0] for d in cur.description] 124 | except Exception, e: 125 | self.error_msg = '%s' % e 126 | self._logger.error(e) 127 | self.status = False 128 | data = None 129 | finally: 130 | cur.close() 131 | conn.commit() 132 | conn.close() 133 | return data 134 | 135 | def getall_list_sqls(self, sqls, paramters=None): 136 | """ 137 | 执行多个sql语句,返回列表形式结果 138 | sqls = [sql1, sql2, ... ...] 139 | """ 140 | 141 | conn = self.__conn() 142 | if not conn: 143 | return None 144 | try: 145 | cur = conn.cursor() # 返回列表 146 | for sql in sqls: 147 | cur.execute(sql, paramters) 148 | data = cur.fetchall() 149 | self.rowcount = cur.rowcount 150 | self.row0 = [d[0] for d in cur.description] 151 | except Exception, e: 152 | self._logger.error(e) 153 | data = None 154 | finally: 155 | cur.close() 156 | conn.commit() 157 | conn.close() 158 | return data 159 | 160 | def delete(self, sql, paramters=None): 161 | conn = self.__conn() 162 | if not conn: 163 | return None 164 | try: 165 | cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) # 返回字典 166 | cur.execute(sql, paramters) 167 | except Exception, e: 168 | self.error_msg = '%s' % e 169 | self._logger.error(e) 170 | finally: 171 | cur.close() 172 | conn.commit() 173 | conn.close() 174 | return None 175 | 176 | 177 | class Business(MysqlHelper): 178 | # 业务处理层 179 | def __init__(self, host, user, passwd, db, logger): 180 | super(Business, self).__init__(host, user, passwd, db, logger) 181 | 182 | def insert(self, sql, para=None): 183 | return self.getsingle(sql, para) 184 | 185 | def search(self, sql, para=None): 186 | return self.getsingle(sql, para) 187 | -------------------------------------------------------------------------------- /controller/public/pagination.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | from django.core.paginator import Paginator 5 | 6 | 7 | class Paginator_help: 8 | # 分页 9 | 10 | def __init__(self, page_num, queryset, PAGE_SIZE, current_page_total, request): 11 | self.page_num = self.check_page_num(page_num) # 当前页码 12 | self.current_page_total = current_page_total # 当前页下标 13 | self.queryset = queryset # 需要分页的对象集合 14 | self.PAGE_SIZE = PAGE_SIZE # 每页显示多少条 15 | self.pages = self.get_Paginator_obj() # 获取分页对象 16 | self.page_range = self.get_page_range() # 获取当前页的页面下标 17 | self.qstr = self.get_qstr(request) 18 | self.current_page = self.get_current_page() # 获取当前页对象 19 | 20 | def get_Paginator_obj(self): 21 | # 获取分页对象 22 | pages = Paginator(self.queryset, self.PAGE_SIZE) 23 | return pages 24 | 25 | def check_page_num(self, page_num): 26 | # 检查页码 27 | if page_num <= 0: 28 | page_num = 1 29 | return page_num 30 | 31 | def get_current_page(self): 32 | # 获取当前页对象 33 | current_page = self.pages.page(self.page_num) 34 | return current_page 35 | 36 | def get_qstr(self, request): 37 | qstr = '&'.join(['%s=%s' % (k, v) for k, v in request.GET.items() if k != 'p']) 38 | return qstr 39 | 40 | def calculate_begin_end(self): 41 | # 计算当前页下标的取值范围 42 | page_total = self.pages.num_pages 43 | begin = 0 44 | end = 0 45 | if page_total <= self.current_page_total: 46 | begin = 0 47 | end = page_total 48 | else: 49 | if self.page_num <= self.current_page_total / 2: 50 | begin = 0 51 | end = self.current_page_total 52 | else: 53 | begin = self.page_num - self.current_page_total / 2 54 | end = self.page_num + self.current_page_total / 2 55 | if (self.current_page_total % 2) != 0: # 如果分页下标为奇数 56 | end += 1 57 | if end > page_total: 58 | end = page_total 59 | begin = page_total - self.current_page_total 60 | return begin, end 61 | 62 | def get_page_range(self): 63 | # 获取当前页的页面下标 64 | begin, end = self.calculate_begin_end() 65 | 66 | # 草了,1.9的Paginator分页类的page_range方法得到的尽然是xrange,用[begin:end]切片报错 67 | page_range = [i for i in self.pages.page_range] 68 | page_range = page_range[begin:end] 69 | 70 | return page_range 71 | 72 | 73 | class Paginator_ajax(object): 74 | # bootstrap-table 插件 后端分页 75 | 76 | def __init__(self, offset, queryset, PAGE_SIZE): 77 | self.page_num = offset/PAGE_SIZE + 1 # 当前页码 78 | self.queryset = queryset # 需要分页的对象集合 79 | self.PAGE_SIZE = PAGE_SIZE # 每页显示多少条 80 | self.pages = self.get_Paginator_obj # 获取分页对象 81 | self.current_page = self.get_current_page # 获取当前页对象 82 | self.total = self.pages.count # queryset 对象集合的总数 83 | self.rows = self._get_rows 84 | 85 | 86 | @property 87 | def get_current_page(self): 88 | # 获取当前页对象 89 | return self.pages.page(self.page_num) 90 | 91 | @property 92 | def get_Paginator_obj(self): 93 | # 获取分页对象 94 | return Paginator(self.queryset, self.PAGE_SIZE) 95 | 96 | @property 97 | def _get_rows(self): 98 | return list(self.current_page) 99 | 100 | @property 101 | def data(self): 102 | return {'total': self.total, 'rows': self.rows} 103 | 104 | 105 | class Paginator_sql(object): 106 | # bootstrap-table 插件 后端分页 107 | # sql 连接远程数据库查询 分页 108 | def __init__(self, offset, queryset, PAGE_SIZE): 109 | 110 | self.offset = offset # 偏移量 111 | self.PAGE_SIZE = PAGE_SIZE # 每页显示多少条 112 | 113 | self.page_num = offset/PAGE_SIZE + 1 # 当前页码 114 | self.queryset = queryset # 需要分页的对象集合 115 | self.pages = self.get_Paginator_obj # 获取分页对象 116 | self.current_page = self.get_current_page # 获取当前页对象 117 | self.total = self.pages.count # queryset 对象集合的总数 118 | self.rows = self._get_rows 119 | 120 | 121 | @property 122 | def get_current_page(self): 123 | # 获取当前页对象 124 | return self.pages.page(self.page_num) 125 | 126 | @property 127 | def get_Paginator_obj(self): 128 | # 获取分页对象 129 | return Paginator(self.queryset, self.PAGE_SIZE) 130 | 131 | @property 132 | def _get_rows(self): 133 | return list(self.current_page) 134 | 135 | @property 136 | def data(self): 137 | return {'total': self.total, 'rows': self.rows} -------------------------------------------------------------------------------- /custag/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/custag/__init__.py -------------------------------------------------------------------------------- /custag/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /custag/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class CustagConfig(AppConfig): 7 | name = 'custag' 8 | -------------------------------------------------------------------------------- /custag/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/custag/migrations/__init__.py -------------------------------------------------------------------------------- /custag/models.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.db import models 4 | 5 | # Create your models here. 6 | -------------------------------------------------------------------------------- /custag/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/custag/templatetags/__init__.py -------------------------------------------------------------------------------- /custag/templatetags/ygol_filter_tag.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | ################################################## 3 | # Function: 自定义标签、过滤器 4 | # Author: 黄小雪 5 | # Date: 2016年11月4日 6 | # Company: 东方银谷 7 | # Version: 1.2 8 | ################################################## 9 | from django import template 10 | 11 | register = template.Library() 12 | 13 | @register.filter 14 | def format_bool(value,args): 15 | data = args.split(',') 16 | return data[0] if value else data[1] 17 | 18 | 19 | @register.filter 20 | def request_type(key): 21 | types = { 22 | 'CONFIRM_WITHHOLD':u'确认快捷充值', 23 | 'CONFIRM_BIND_CARD':u'确认绑卡', 24 | 'GATEWAY_WITHHOLD':u'确认网关充值', 25 | 'PAYMENT_REQUEST':u'确认提现' 26 | } 27 | return types[key] 28 | -------------------------------------------------------------------------------- /custag/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /custag/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "YinguOnline.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | celery==3.1.25 2 | celery-with-redis==3.0 3 | 4 | Django==1.9.13 5 | django-celery==3.2.1 6 | 7 | MySQL-python==1.2.5 8 | 9 | redis==2.10.6 10 | 11 | supervisor==3.3.4 12 | -------------------------------------------------------------------------------- /scheduled_tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/scheduled_tasks/__init__.py -------------------------------------------------------------------------------- /scheduled_tasks/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /scheduled_tasks/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class ScheduledTasksConfig(AppConfig): 7 | name = 'scheduled_tasks' 8 | -------------------------------------------------------------------------------- /scheduled_tasks/conf/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/scheduled_tasks/conf/__init__.py -------------------------------------------------------------------------------- /scheduled_tasks/conf/config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python env 2 | # -*- coding: UTF-8 -*- 3 | import sys 4 | import os 5 | reload(sys) 6 | sys.setdefaultencoding("utf-8") 7 | from django.conf import settings as _settings 8 | 9 | _parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 10 | _YinguOnline_dir = os.path.dirname(_parentdir) 11 | sys.path.append(_parentdir) 12 | sys.path.append(_YinguOnline_dir) 13 | 14 | _log_dir = _YinguOnline_dir + '/log/' 15 | img_dir = _settings.STATICFILES_DIRS[0] + '/img/' 16 | res_dir = u'/home/huangxiaoxue/mail_file/' 17 | # res_dir = u'/data/' 18 | unencrypted_res_dir = u'/tmp/' 19 | 20 | # 日志文件 21 | _logfilename = u'script_invest.log' 22 | logfile = u'%s%s' % (_log_dir, _logfilename) 23 | 24 | # 第三方 SMTP 服务 25 | mail_host = "smtp.123.123.com" # 设置服务器 26 | mail_user = "huangxiaoxue" # 用户名 27 | mail_pass = "huangxiaoxue" # 口令 28 | # 发送人 29 | sender = '229396865@qq.com' 30 | sender_zh_name = u'LOL信息科技服务台' 31 | 32 | 33 | # 数据库 34 | databases = { 35 | 'business1': { 36 | 'name': u'业务1', 37 | 'host': '1.1.1.1', 38 | 'user': 'test', 39 | 'passwd': 'test', 40 | 'db': 'test' 41 | }, 42 | 'business2': { 43 | 'name': u'业务2', 44 | 'host': '1.1.1.2', 45 | 'user': 'huangxiaoxue', 46 | 'passwd': 'huangxiaoxue', 47 | 'db': 'test' 48 | }, 49 | 'business3': { 50 | 'name': u'业务3', 51 | 'host': '1.1.1.3', 52 | 'user': 'test', 53 | 'passwd': 'test#', 54 | 'db': 'test' 55 | } 56 | } 57 | 58 | # redis 59 | host2 = '127.0.0.1' 60 | port2 = 6379 61 | db2 = 0 62 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2017-10-18 17:21 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='ScheduledTask', 18 | fields=[ 19 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ], 21 | options={ 22 | 'db_table': 'scheduledTask', 23 | 'permissions': (('view_scheduledTask', '\u67e5\u770b\u5b9a\u65f6\u4efb\u52a1'), ('edit', '\u4fee\u6539\u5b9a\u65f6\u4efb\u52a1')), 24 | }, 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/0002_auto_20171018_1723.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2017-10-18 17:23 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduled_tasks', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterModelOptions( 16 | name='scheduledtask', 17 | options={'permissions': (('view_scheduledTask', '\u67e5\u770b\u5b9a\u65f6\u4efb\u52a1'), ('edit_scheduledTask', '\u4fee\u6539\u5b9a\u65f6\u4efb\u52a1'))}, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/0003_delete_scheduledtask.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2017-10-18 17:26 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduled_tasks', '0002_auto_20171018_1723'), 12 | ] 13 | 14 | operations = [ 15 | migrations.DeleteModel( 16 | name='ScheduledTask', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/0004_scheduledtask.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2017-10-18 17:27 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ('scheduled_tasks', '0003_delete_scheduledtask'), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='ScheduledTask', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ], 22 | options={ 23 | 'db_table': 'scheduledTask', 24 | 'permissions': (('viewTask', '\u67e5\u770b\u5b9a\u65f6\u4efb\u52a1'), ('editTask', '\u4fee\u6539\u5b9a\u65f6\u4efb\u52a1')), 25 | }, 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/0005_database.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2017-11-01 15:04 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduled_tasks', '0004_scheduledtask'), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='DataBase', 17 | fields=[ 18 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u540d\u79f0')), 20 | ('description', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u63cf\u8ff0')), 21 | ('host', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u4e3b\u673a')), 22 | ('user', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237')), 23 | ('passwd', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5bc6\u7801')), 24 | ('db', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6570\u636e\u5e93\u5b9e\u4f8b')), 25 | ('type', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6570\u636e\u5e93\u7c7b\u578b')), 26 | ], 27 | options={ 28 | 'db_table': 'database', 29 | }, 30 | ), 31 | ] 32 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/0006_auto_20171101_1558.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2017-11-01 15:58 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduled_tasks', '0005_database'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameModel( 16 | old_name='DataBase', 17 | new_name='DataBaseInfo', 18 | ), 19 | migrations.AlterModelTable( 20 | name='databaseinfo', 21 | table='databaseinfo', 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/0007_auto_20171101_1616.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2017-11-01 16:16 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduled_tasks', '0006_auto_20171101_1558'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='databaseinfo', 17 | name='host', 18 | field=models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='\u4e3b\u673a'), 19 | ), 20 | migrations.AlterField( 21 | model_name='databaseinfo', 22 | name='name', 23 | field=models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='\u540d\u79f0'), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /scheduled_tasks/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/scheduled_tasks/migrations/__init__.py -------------------------------------------------------------------------------- /scheduled_tasks/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models 5 | 6 | # Create your models here. 7 | 8 | 9 | class ScheduledTask(models.Model): 10 | """ 11 | 投资批量查询 12 | """ 13 | class Meta: 14 | db_table = 'scheduledTask' 15 | permissions = ( 16 | ("viewTask", u"查看定时任务"), 17 | ("editTask", u"修改定时任务") 18 | ) 19 | 20 | 21 | class DataBaseInfo(models.Model): 22 | """ 23 | 数据库信息 24 | """ 25 | name = models.CharField(max_length=255, null=True, blank=True, unique=True, verbose_name=u'名称') 26 | description = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'描述') 27 | host = models.CharField(max_length=255, null=True, blank=True, unique=True, verbose_name=u'主机') 28 | user = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'用户') 29 | passwd = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'密码') 30 | db = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'数据库实例') 31 | type = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'数据库类型') 32 | 33 | def __unicode__(self): 34 | return '%s - %s - %s' % (self.name, self.host, self.type) 35 | 36 | class Meta: 37 | db_table = 'databaseinfo' -------------------------------------------------------------------------------- /scheduled_tasks/tests.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | # from django.test import TestCase 3 | # from djcelery.schedulers import DatabaseScheduler 4 | # Create your tests here. 5 | 6 | # -*- coding: utf8 -*- 7 | # from datetime import timedelta 8 | # from celery import Celery 9 | # app = Celery('hello', broker='redis://localhost:6379') 10 | # app.conf.CELERYBEAT_SCHEDULE = { 11 | # "add-every-30-seconds": { 12 | # "task": "celery_app.hello", 13 | # "schedule": timedelta(seconds=30) 14 | # } 15 | # } 16 | # app.conf.CELERY_ROUTES = { 17 | # "celery_app.hello": { 18 | # "queue": "test" 19 | # } 20 | # } 21 | # app.conf.CELERY_TIMEZONE = "Asia/Shanghai" 22 | # @app.task 23 | # def hello(): 24 | # return 'hello world' 25 | 26 | def fun(**kwargs): 27 | print kwargs,kwargs.pop('a'),kwargs 28 | 29 | 30 | para = {'a':1, 'b':2} 31 | 32 | fun(**para) -------------------------------------------------------------------------------- /scheduled_tasks/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from django.conf.urls import url 3 | from scheduled_tasks import views 4 | 5 | urlpatterns = [ 6 | # Examples: 7 | # url(r'^$', 'YinguOnline.views.home', name='home'), 8 | # url(r'^blog/', include('blog.urls')), 9 | 10 | url(r'^periodic_task/$', views.periodic_task), # 周期任务 11 | url(r'^get_periodic_task_data/$', views.get_periodic_task_data), # 周期任务 列表数据 12 | url(r'^add_periodic_task/$', views.add_periodic_task), # 新增 周期任务 13 | url(r'^get_task_template/$', views.get_task_template), # 获取任务模板列表 get tasks list 14 | url(r'^get_crontab/$', views.get_crontab), # 新增 周期任务时 获取 crontab 定时时间 15 | url(r'^add_crontab/$', views.add_crontab), # 新增 crontab 定时时间 16 | url(r'^get_database/$', views.get_database), # 获取 数据库信息 17 | url(r'^add_periodic_task_data/$', views.add_periodic_task_data), # 提交 新增周期任务 数据 18 | url(r'^test_periodic_task_data/$', views.test_periodic_task_data), # 测试 新增周期任务 数据 19 | url(r'^test_periodic_task_result/$', views.test_periodic_task_result), # 获取 测试 新增周期任务 结果 20 | url(r'^mod_periodic_task/(?P\d+)/$', views.mod_periodic_task), # 修改周期任务 页面 21 | url(r'^get_mod_periodic_task_data/$', views.get_mod_periodic_task_data), # 获取 需要修改的周期任务 数据 22 | url(r'^mod_periodic_task_data/$', views.mod_periodic_task_data), # 修改周期任务 数据 23 | url(r'^test_periodic_task_mod/$', views.test_periodic_task_mod), # 测试 修改周期任务 数据 24 | url(r'^delete_periodic_task/$', views.delete_periodic_task), # 删除 周期任务 25 | url(r'^crontabs/$', views.crontabs), # crontab 定时时间 26 | url(r'^crontabs_get_data/$', views.crontabs_get_data), # 获取 crontab 定时时间 27 | url(r'^add_crontab_index/$', views.add_crontab_index), # 新增 crontab 定时时间 页面 28 | url(r'^mod_crontabs_index/(?P\d+)/$', views.mod_crontabs_index), # 修改 crontab 定时时间 页面 29 | url(r'^get_mod_crontab_data/$', views.get_mod_crontab_data), # 获取需要修改的 crontab 定时时间 数据 30 | url(r'^delete_crontab/$', views.delete_crontab), # 删除 crontab 定时时间 数据 31 | ] 32 | 33 | 34 | -------------------------------------------------------------------------------- /static/css/login.css: -------------------------------------------------------------------------------- 1 | 2 | body{background: url(/static/img/login_bg.jpg) 0 -200px no-repeat #000; 3 | background-size: cover;margin:0; color:#FFF} 4 | *{-webkit-box-sizing:border-box;box-sizing:border-box;} 5 | a{-webkit-transition: All 1s ease;text-decoration: none; 6 | color: #dfc684;} 7 | input , button{border:0;background:none;color: #dfc684;} 8 | #login-box{position:absolute; width:500px; left:30%; top:29%;} 9 | .login-box-wh{height:53px;width:800px;margin-bottom:16px;} 10 | .to-index{padding-left:16px;overflow:hidden; position:absolute;left:69px;} 11 | .to-index-m{width:360px; height:53px; margin-top:-53px;margin-left:-16px;position:absolute;z-index:-1;background:yellow;transition:margin 0.8s;-moz-transition:margin 0.8s; -webkit-transition:margin 0.8s 0.3s; } 12 | .login-box-wh:hover .to-index-m{margin-top:0;} 13 | .login-box-wh:hover a{color:#f00} 14 | .box-mov{width: 53px;height: 53px;float: left; display: inline-block;opacity: .72;filter: alpha(opacity=72);background: url(/static/img/icons.png) -212px 0 #000; margin-right: 16px;position: relative;overflow:hidden;z-index:0;} 15 | .box-mov-s{width: 53px;height: 53px;z-index:1;position:absolute;background:#ff0;margin-left:-53px; 16 | background:yellow; 17 | transition:margin 0.8s;-moz-transition:margin 0.8s; -webkit-transition:margin 0.8s; } 18 | .login-box-wh:hover .box-mov-s{margin:0;} 19 | .box-mov-d{width: 53px;height: 53px;z-index:2;position:absolute;background:url(/static/img/icons.png) -212px -53px;);opacity:0; } 20 | .login-box-wh:hover .box-mov-d {opacity:1;} 21 | .text-box{width:360px; height:53px;background:#000;opacity: .72; float:left;line-height:53px;} 22 | #vdcode{width:270px;} 23 | .text-box-login{} 24 | .text-box-login-btn{width:360px; height:53px;background:#000;opacity: .72; float:left;line-height:53px;-webkit-box-sizing:border-box; position:absolute;left:69px;overflow:hidden; } 25 | .login-btn-m{width:360px; height:53px;margin-top:-53px; position:absolute;z-index:1;background:yellow;transition:margin 0.8s;-moz-transition:margin 0.8s; -webkit-transition:margin 0.8s 0.3s;} 26 | .text-box-login:hover .login-btn-m{margin-top:0} 27 | .login-btn{width:100%;height:100%; cursor:pointer;font-size:16px;position:absolute;z-index:5;transition: 0.8s;-moz-transition: 0.8s; -webkit-transition: 0.8s 0.3s;} 28 | .login-btn:hover{color:#f00;} 29 | input{height:100%;width:100%;padding:8px 0 8px 8px;background:none;color:#fff;} 30 | input:focus { 31 | outline:none; 32 | } -------------------------------------------------------------------------------- /static/img/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/img/icons.png -------------------------------------------------------------------------------- /static/img/login_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/img/login_bg.jpg -------------------------------------------------------------------------------- /static/js/csrf.js: -------------------------------------------------------------------------------- 1 | function getCookie(name) { 2 | var cookieValue = null; 3 | if (document.cookie && document.cookie != '') { 4 | var cookies = document.cookie.split(';'); 5 | for (var i = 0; i < cookies.length; i++) { 6 | var cookie = jQuery.trim(cookies[i]); 7 | // Does this cookie string begin with the name we want? 8 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 9 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 10 | break; 11 | } 12 | } 13 | } 14 | return cookieValue; 15 | } 16 | var csrftoken = getCookie('csrftoken'); 17 | function csrfSafeMethod(method) { 18 | // these HTTP methods do not require CSRF protection 19 | return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 20 | } 21 | $.ajaxSetup({ 22 | beforeSend: function(xhr, settings) { 23 | if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 24 | xhr.setRequestHeader("X-CSRFToken", csrftoken); 25 | } 26 | } 27 | }); -------------------------------------------------------------------------------- /static/plugins/bootstarp-table/bootstrap-table-zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bootstrap Table Chinese translation 3 | * Author: Zhixin Wen 4 | */ 5 | (function ($) { 6 | 'use strict'; 7 | 8 | $.fn.bootstrapTable.locales['zh-CN'] = { 9 | formatLoadingMessage: function () { 10 | return '正在努力地加载数据中,请稍候……'; 11 | }, 12 | formatRecordsPerPage: function (pageNumber) { 13 | return '每页显示 ' + pageNumber + ' 条记录'; 14 | }, 15 | formatShowingRows: function (pageFrom, pageTo, totalRows) { 16 | return '显示第 ' + pageFrom + ' 到第 ' + pageTo + ' 条记录,总共 ' + totalRows + ' 条记录'; 17 | }, 18 | formatSearch: function () { 19 | return '搜索'; 20 | }, 21 | formatNoMatches: function () { 22 | return '没有找到匹配的记录'; 23 | }, 24 | formatPaginationSwitch: function () { 25 | return '隐藏/显示分页'; 26 | }, 27 | formatRefresh: function () { 28 | return '刷新'; 29 | }, 30 | formatToggle: function () { 31 | return '切换'; 32 | }, 33 | formatColumns: function () { 34 | return '列'; 35 | }, 36 | formatExport: function () { 37 | return '导出数据'; 38 | }, 39 | formatClearFilters: function () { 40 | return '清空过滤'; 41 | } 42 | }; 43 | 44 | $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']); 45 | 46 | })(jQuery); 47 | -------------------------------------------------------------------------------- /static/plugins/bootstarp-table/bootstrap-table.min.css: -------------------------------------------------------------------------------- 1 | .fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table:not(.table-condensed),.bootstrap-table .table:not(.table-condensed)>tbody>tr>td,.bootstrap-table .table:not(.table-condensed)>tbody>tr>th,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>td,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>th,.bootstrap-table .table:not(.table-condensed)>thead>tr>td{padding:8px}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.bootstrap-table .table.table-no-bordered>tbody>tr>td:last-child{border-right:none}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:focus{outline:transparent solid 0}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bs-bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0;padding:0!important}.pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden} -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/plugins/layer/skin/default/icon-ext.png -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/plugins/layer/skin/default/icon.png -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/plugins/layer/skin/default/loading-0.gif -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/plugins/layer/skin/default/loading-1.gif -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/plugins/layer/skin/default/loading-2.gif -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /static/template/css/bootstrap-timepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Timepicker Component for Twitter Bootstrap 3 | * 4 | * Copyright 2013 Joris de Wit 5 | * 6 | * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | .bootstrap-timepicker { 12 | position: relative; 13 | } 14 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu { 15 | left: auto; 16 | right: 0; 17 | } 18 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before { 19 | left: auto; 20 | right: 12px; 21 | } 22 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after { 23 | left: auto; 24 | right: 13px; 25 | } 26 | .bootstrap-timepicker .add-on { 27 | cursor: pointer; 28 | } 29 | .bootstrap-timepicker .add-on i { 30 | display: inline-block; 31 | width: 16px; 32 | height: 16px; 33 | } 34 | .bootstrap-timepicker-widget.dropdown-menu { 35 | padding: 2px 3px 2px 2px; 36 | } 37 | .bootstrap-timepicker-widget.dropdown-menu.open { 38 | display: inline-block; 39 | } 40 | .bootstrap-timepicker-widget.dropdown-menu:before { 41 | border-bottom: 7px solid rgba(0, 0, 0, 0.2); 42 | border-left: 7px solid transparent; 43 | border-right: 7px solid transparent; 44 | content: ""; 45 | display: inline-block; 46 | left: 9px; 47 | position: absolute; 48 | top: -7px; 49 | } 50 | .bootstrap-timepicker-widget.dropdown-menu:after { 51 | border-bottom: 6px solid #FFFFFF; 52 | border-left: 6px solid transparent; 53 | border-right: 6px solid transparent; 54 | content: ""; 55 | display: inline-block; 56 | left: 10px; 57 | position: absolute; 58 | top: -6px; 59 | } 60 | .bootstrap-timepicker-widget a.btn, 61 | .bootstrap-timepicker-widget input { 62 | border-radius: 4px; 63 | } 64 | .bootstrap-timepicker-widget table { 65 | width: 100%; 66 | margin: 0; 67 | } 68 | .bootstrap-timepicker-widget table td { 69 | text-align: center; 70 | height: 30px; 71 | margin: 0; 72 | padding: 2px; 73 | } 74 | .bootstrap-timepicker-widget table td:not(.separator) { 75 | min-width: 30px; 76 | } 77 | .bootstrap-timepicker-widget table td span { 78 | width: 100%; 79 | } 80 | .bootstrap-timepicker-widget table td a { 81 | border: 1px transparent solid; 82 | width: 100%; 83 | display: inline-block; 84 | margin: 0; 85 | padding: 8px 0; 86 | outline: 0; 87 | color: #333; 88 | } 89 | .bootstrap-timepicker-widget table td a:hover { 90 | text-decoration: none; 91 | background-color: #eee; 92 | -webkit-border-radius: 4px; 93 | -moz-border-radius: 4px; 94 | border-radius: 4px; 95 | border-color: #ddd; 96 | } 97 | .bootstrap-timepicker-widget table td a i { 98 | margin-top: 2px; 99 | } 100 | .bootstrap-timepicker-widget table td input { 101 | width: 25px; 102 | margin: 0; 103 | text-align: center; 104 | } 105 | .bootstrap-timepicker-widget .modal-content { 106 | padding: 4px; 107 | } 108 | @media (min-width: 767px) { 109 | .bootstrap-timepicker-widget.modal { 110 | width: 200px; 111 | margin-left: -100px; 112 | } 113 | } 114 | @media (max-width: 767px) { 115 | .bootstrap-timepicker { 116 | width: 100%; 117 | } 118 | .bootstrap-timepicker .dropdown-menu { 119 | width: 100%; 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /static/template/css/bootstrap-wysihtml5.css: -------------------------------------------------------------------------------- 1 | ul.wysihtml5-toolbar { 2 | margin: 0; 3 | padding: 0; 4 | display: block; 5 | } 6 | 7 | ul.wysihtml5-toolbar::after { 8 | clear: both; 9 | display: table; 10 | content: ""; 11 | } 12 | 13 | ul.wysihtml5-toolbar > li { 14 | float: left; 15 | display: list-item; 16 | list-style: none; 17 | margin: 0 5px 10px 0; 18 | } 19 | 20 | ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] { 21 | font-weight: bold; 22 | } 23 | 24 | ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] { 25 | font-style: italic; 26 | } 27 | 28 | ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] { 29 | text-decoration: underline; 30 | } 31 | 32 | ul.wysihtml5-toolbar a.btn.wysihtml5-command-active { 33 | background-image: none; 34 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); 35 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); 36 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); 37 | background-color: #E6E6E6; 38 | background-color: #D9D9D9; 39 | outline: 0; 40 | } 41 | 42 | ul.wysihtml5-commands-disabled .dropdown-menu { 43 | display: none !important; 44 | } 45 | 46 | ul.wysihtml5-toolbar div.wysihtml5-colors { 47 | display:block; 48 | width: 50px; 49 | height: 20px; 50 | margin-top: 2px; 51 | margin-left: 5px; 52 | position: absolute; 53 | pointer-events: none; 54 | } 55 | 56 | ul.wysihtml5-toolbar a.wysihtml5-colors-title { 57 | padding-left: 70px; 58 | } 59 | 60 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] { 61 | background: black !important; 62 | } 63 | 64 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] { 65 | background: silver !important; 66 | } 67 | 68 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] { 69 | background: gray !important; 70 | } 71 | 72 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] { 73 | background: maroon !important; 74 | } 75 | 76 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] { 77 | background: red !important; 78 | } 79 | 80 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] { 81 | background: purple !important; 82 | } 83 | 84 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] { 85 | background: green !important; 86 | } 87 | 88 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] { 89 | background: olive !important; 90 | } 91 | 92 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] { 93 | background: navy !important; 94 | } 95 | 96 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] { 97 | background: blue !important; 98 | } 99 | 100 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] { 101 | background: orange !important; 102 | } 103 | -------------------------------------------------------------------------------- /static/template/css/chosen/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/chosen/chosen-sprite.png -------------------------------------------------------------------------------- /static/template/css/chosen/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/chosen/chosen-sprite@2x.png -------------------------------------------------------------------------------- /static/template/css/colorbox/colorbox.css: -------------------------------------------------------------------------------- 1 | /* 2 | Colorbox Core Style: 3 | The following CSS is consistent between example themes and should not be altered. 4 | */ 5 | #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} 6 | #cboxOverlay{position:fixed; width:100%; height:100%;} 7 | #cboxMiddleLeft, #cboxBottomLeft{clear:left;} 8 | #cboxContent{position:relative;} 9 | #cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;} 10 | #cboxTitle{margin:0;} 11 | #cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} 12 | #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} 13 | .cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;} 14 | .cboxIframe{width:100%; height:100%; display:block; border:0;} 15 | #colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;} 16 | 17 | /* 18 | User Style: 19 | Change the following styles to modify the appearance of Colorbox. They are 20 | ordered & tabbed in a way that represents the nesting of the generated HTML. 21 | */ 22 | #cboxOverlay{background:url(images/overlay.png) repeat 0 0;} 23 | #colorbox{outline:0;} 24 | #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;} 25 | #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;} 26 | #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;} 27 | #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;} 28 | #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;} 29 | #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;} 30 | #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;} 31 | #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;} 32 | #cboxContent{background:#fff; overflow:hidden;} 33 | .cboxIframe{background:#fff;} 34 | #cboxError{padding:50px; border:1px solid #ccc;} 35 | #cboxLoadedContent{margin-bottom:28px;} 36 | #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;} 37 | #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;} 38 | #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;} 39 | #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;} 40 | 41 | /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */ 42 | #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; } 43 | 44 | /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */ 45 | #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;} 46 | 47 | #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;} 48 | #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;} 49 | #cboxPrevious:hover{background-position:-75px -25px;} 50 | #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;} 51 | #cboxNext:hover{background-position:-50px -25px;} 52 | #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;} 53 | #cboxClose:hover{background-position:-25px -25px;} 54 | 55 | /* 56 | The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill 57 | when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9. 58 | See: http://jacklmoore.com/notes/ie-transparency-problems/ 59 | */ 60 | .cboxIE #cboxTopLeft, 61 | .cboxIE #cboxTopCenter, 62 | .cboxIE #cboxTopRight, 63 | .cboxIE #cboxBottomLeft, 64 | .cboxIE #cboxBottomCenter, 65 | .cboxIE #cboxBottomRight, 66 | .cboxIE #cboxMiddleLeft, 67 | .cboxIE #cboxMiddleRight { 68 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF); 69 | } -------------------------------------------------------------------------------- /static/template/css/colorbox/images/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/colorbox/images/border.png -------------------------------------------------------------------------------- /static/template/css/colorbox/images/controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/colorbox/images/controls.png -------------------------------------------------------------------------------- /static/template/css/colorbox/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/colorbox/images/loading.gif -------------------------------------------------------------------------------- /static/template/css/colorbox/images/loading_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/colorbox/images/loading_background.png -------------------------------------------------------------------------------- /static/template/css/colorbox/images/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/colorbox/images/overlay.png -------------------------------------------------------------------------------- /static/template/css/datepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Datepicker for Bootstrap 3 | * 4 | * Copyright 2012 Stefan Petre 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | */ 9 | .datepicker { 10 | top: 0; 11 | left: 0; 12 | padding: 4px; 13 | margin-top: 1px; 14 | -webkit-border-radius: 4px; 15 | -moz-border-radius: 4px; 16 | border-radius: 4px; 17 | /*.dow { 18 | border-top: 1px solid #ddd !important; 19 | }*/ 20 | 21 | } 22 | .datepicker:before { 23 | content: ''; 24 | display: inline-block; 25 | border-left: 7px solid transparent; 26 | border-right: 7px solid transparent; 27 | border-bottom: 7px solid #ccc; 28 | border-bottom-color: rgba(0, 0, 0, 0.2); 29 | position: absolute; 30 | top: -7px; 31 | left: 6px; 32 | } 33 | .datepicker:after { 34 | content: ''; 35 | display: inline-block; 36 | border-left: 6px solid transparent; 37 | border-right: 6px solid transparent; 38 | border-bottom: 6px solid #ffffff; 39 | position: absolute; 40 | top: -6px; 41 | left: 7px; 42 | } 43 | .datepicker > div { 44 | display: none; 45 | } 46 | .datepicker table { 47 | width: 100%; 48 | margin: 0; 49 | } 50 | .datepicker td, 51 | .datepicker th { 52 | text-align: center; 53 | width: 20px; 54 | height: 20px; 55 | -webkit-border-radius: 4px; 56 | -moz-border-radius: 4px; 57 | border-radius: 4px; 58 | } 59 | .datepicker td.day:hover { 60 | background: #eeeeee; 61 | cursor: pointer; 62 | } 63 | .datepicker td.day.disabled { 64 | color: #eeeeee; 65 | } 66 | .datepicker td.old, 67 | .datepicker td.new { 68 | color: #999999; 69 | } 70 | .datepicker td.active, 71 | .datepicker td.active:hover { 72 | color: #ffffff; 73 | background-color: #006dcc; 74 | background-image: -moz-linear-gradient(top, #0088cc, #0044cc); 75 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); 76 | background-image: -webkit-linear-gradient(top, #A9E2F3, #A9E2F3); 77 | background-image: -o-linear-gradient(top, #0088cc, #0044cc); 78 | background-image: linear-gradient(to bottom, #0088ff, #0088ff); 79 | background-repeat: repeat-x; 80 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); 81 | border-color: #0044cc #0044cc #002a80; 82 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 83 | *background-color: #0044cc; 84 | /* Darken IE7 buttons by default so they stand out more given they won't have borders */ 85 | 86 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 87 | color: #fff; 88 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 89 | } 90 | .datepicker td.active:hover, 91 | .datepicker td.active:hover:hover, 92 | .datepicker td.active:focus, 93 | .datepicker td.active:hover:focus, 94 | .datepicker td.active:active, 95 | .datepicker td.active:hover:active, 96 | .datepicker td.active.active, 97 | .datepicker td.active:hover.active, 98 | .datepicker td.active.disabled, 99 | .datepicker td.active:hover.disabled, 100 | .datepicker td.active[disabled], 101 | .datepicker td.active:hover[disabled] { 102 | color: #ffffff; 103 | background-color: #0044cc; 104 | *background-color: #003bb3; 105 | } 106 | .datepicker td.active:active, 107 | .datepicker td.active:hover:active, 108 | .datepicker td.active.active, 109 | .datepicker td.active:hover.active { 110 | background-color: #003399 \9; 111 | } 112 | .datepicker td span { 113 | display: block; 114 | width: 47px; 115 | height: 54px; 116 | line-height: 54px; 117 | float: left; 118 | margin: 2px; 119 | cursor: pointer; 120 | -webkit-border-radius: 4px; 121 | -moz-border-radius: 4px; 122 | border-radius: 4px; 123 | } 124 | .datepicker td span:hover { 125 | background: #eeeeee; 126 | } 127 | .datepicker td span.active { 128 | color: #ffffff; 129 | background-color: #006dcc; 130 | background-image: -moz-linear-gradient(top, #0088cc, #0044cc); 131 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); 132 | background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); 133 | background-image: -o-linear-gradient(top, #0088cc, #0044cc); 134 | background-image: linear-gradient(to bottom, #0088cc, #0044cc); 135 | background-repeat: repeat-x; 136 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); 137 | border-color: #0044cc #0044cc #002a80; 138 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 139 | *background-color: #0044cc; 140 | /* Darken IE7 buttons by default so they stand out more given they won't have borders */ 141 | 142 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 143 | color: #fff; 144 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 145 | } 146 | .datepicker td span.active:hover, 147 | .datepicker td span.active:focus, 148 | .datepicker td span.active:active, 149 | .datepicker td span.active.active, 150 | .datepicker td span.active.disabled, 151 | .datepicker td span.active[disabled] { 152 | color: #ffffff; 153 | background-color: #0044cc; 154 | *background-color: #003bb3; 155 | } 156 | .datepicker td span.active:active, 157 | .datepicker td span.active.active { 158 | background-color: #003399 \9; 159 | } 160 | .datepicker td span.old { 161 | color: #999999; 162 | } 163 | .datepicker th.switch { 164 | width: 145px; 165 | } 166 | .datepicker th.next, 167 | .datepicker th.prev { 168 | font-size: 21px; 169 | } 170 | .datepicker thead tr:first-child th { 171 | cursor: pointer; 172 | } 173 | .datepicker thead tr:first-child th:hover { 174 | background: #eeeeee; 175 | } 176 | .input-append.date .add-on i, 177 | .input-prepend.date .add-on i { 178 | display: block; 179 | cursor: pointer; 180 | width: 16px; 181 | height: 16px; 182 | } -------------------------------------------------------------------------------- /static/template/css/dropzone/images/spritemap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/dropzone/images/spritemap.png -------------------------------------------------------------------------------- /static/template/css/dropzone/images/spritemap@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/dropzone/images/spritemap@2x.png -------------------------------------------------------------------------------- /static/template/css/endless-landing.min.css: -------------------------------------------------------------------------------- 1 | body{font-size:14px}#landing-content{padding-top:51px;min-height:800px}.navbar-toggle .icon-bar{background:#777}#main-slider .carousel-inner .item{overflow:hidden;opacity:0;height:500px;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}@media (max-width:480px){#main-slider .carousel-inner .item{height:200px}#main-slider .carousel-inner .item h2{font-size:17px}}@media (min-width:481px) and (max-width:767px){#main-slider .carousel-inner .item{height:300px}}@media (min-width:768px) and (max-width:979px){#main-slider .carousel-inner .item{height:400px}}#main-slider .carousel-inner .item .slide-caption{animation:none;-webkit-animation:none;-moz-animation:none;-ms-animation:none;-o-animation:none}#main-slider .carousel-inner .item.active{opacity:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.left.active{left:0;opacity:0;z-index:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.left.next{opacity:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.right.active{left:0;opacity:0;z-index:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.right.prev{opacity:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item .img-background{position:absolute;left:0;width:100%}#main-slider .carousel-control{background-image:none;z-index:2}#main-slider .carousel-control span{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.feature-icon{width:80px;height:80px;border-radius:50em;-moz-border-radius:50em;-webkit-border-radius:50em;background:rgba(0,0,0,.1);margin:0 auto 10px;cursor:pointer;transition:all .5s ease;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-ms-transition:all .5s ease;-o-transition:all .5s ease}.feature-icon [class*=fa-]{line-height:80px}.feature-icon:hover{background:#FC8675;color:#fff;text-shadow:none;transition:all .5s ease;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-ms-transition:all .5s ease;-o-transition:all .5s ease}.input-lg::-webkit-input-placeholder{font-size:17px;line-height:17px}.input-lg:-moz-placeholder{font-size:17px;line-height:17px}.input-lg::-moz-placeholder{font-size:17px;line-height:17px}.input-lg:-ms-input-placeholder{font-size:17px;line-height:17px}#newsletter{width:300px}@media (max-width:767px){#newsletter{width:100%}}.recent-work a{position:relative;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;color:#626262}.recent-work a img{width:100%}.recent-work a:hover{text-decoration:none}.recent-work a:hover img{opacity:.5;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.recent-work .detail{margin-bottom:30px}.hoverBorder:hover .hoverBorderWrapper .hoverBorderInner{box-shadow:0 0 0 3px #FC8675 inset;-moz-box-shadow:0 0 0 3px #FC8675 inset;-webkit-box-shadow:0 0 0 3px #FC8675 inset;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.hoverBorder:hover .hoverBorderWrapper .readMore{left:10px;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.hoverBorder .hoverBorderWrapper{position:relative;display:inline-block}.hoverBorder .hoverBorderWrapper .hoverBorderInner{display:block;position:absolute;top:0;left:0;right:0;bottom:0;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.hoverBorder .hoverBorderWrapper .readMore{position:absolute;bottom:10px;left:-20px;border:1px solid rgba(0,0,0,.2);background-color:#FC8675;color:#fff;padding:3px 12px;font-size:11px;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}footer{margin-left:0;background:#504f63;color:#d5d4dd}footer p{display:block}footer .useful-link li a{color:#d5d4dd;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}footer .useful-link li a:hover{color:#fff;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.social-connect{background:#d5d4dd;border-color:#d5d4dd;color:#777}.social-connect:hover{border-color:transparent}.animated-element{opacity:1}.animated-element.no-animation{visibility:hidden;animation:none!important;-webkit-animation:none!important;-moz-animation:none!important;-ms-animation:none!important;-o-animation:none!important}.font-lg{font-size:17px!important}.content-padding{padding:40px}@media (max-width:480px){.content-padding{padding:10px}}.m-top-lg{margin-top:100px}@media (max-width:480px){.m-top-lg{margin-top:20px}}@media (min-width:481px) and (max-width:767px){.m-top-lg{margin-top:50px}}.m-bottom-lg{margin-bottom:100px}@media (max-width:480px){.m-bottom-lg{margin-bottom:20px}}@media (min-width:481px) and (max-width:767px){.m-bottom-lg{margin-bottom:50px}}.m-top-md{margin-top:50px}.m-left-md{margin-left:50px}.m-right-md{margin-right:50px} -------------------------------------------------------------------------------- /static/template/css/gritter/images/gritter-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/gritter/images/gritter-light.png -------------------------------------------------------------------------------- /static/template/css/gritter/images/gritter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/gritter/images/gritter.png -------------------------------------------------------------------------------- /static/template/css/gritter/images/ie-spacer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/css/gritter/images/ie-spacer.gif -------------------------------------------------------------------------------- /static/template/css/gritter/jquery.gritter.css: -------------------------------------------------------------------------------- 1 | /* the norm */ 2 | #gritter-notice-wrapper { 3 | position:fixed; 4 | top:20px; 5 | right:20px; 6 | width:301px; 7 | z-index:9999; 8 | } 9 | #gritter-notice-wrapper.top-left { 10 | left: 20px; 11 | right: auto; 12 | } 13 | #gritter-notice-wrapper.bottom-right { 14 | top: auto; 15 | left: auto; 16 | bottom: 20px; 17 | right: 20px; 18 | } 19 | #gritter-notice-wrapper.bottom-left { 20 | top: auto; 21 | right: auto; 22 | bottom: 20px; 23 | left: 20px; 24 | } 25 | .gritter-item-wrapper { 26 | position:relative; 27 | margin:0 0 10px 0; 28 | background:url('images/ie-spacer.gif'); /* ie7/8 fix */ 29 | } 30 | .gritter-top { 31 | background:url(images/gritter.png) no-repeat left -30px; 32 | height:10px; 33 | } 34 | .hover .gritter-top { 35 | background-position:right -30px; 36 | } 37 | .gritter-bottom { 38 | background:url(images/gritter.png) no-repeat left bottom; 39 | height:8px; 40 | margin:0; 41 | } 42 | .hover .gritter-bottom { 43 | background-position: bottom right; 44 | } 45 | .gritter-item { 46 | display:block; 47 | background:url(images/gritter.png) no-repeat left -40px; 48 | color:#eee; 49 | padding:2px 11px 8px 11px; 50 | font-size: 11px; 51 | font-family:verdana; 52 | } 53 | .hover .gritter-item { 54 | background-position:right -40px; 55 | } 56 | .gritter-item p { 57 | padding:0; 58 | margin:0; 59 | word-wrap:break-word; 60 | } 61 | .gritter-close { 62 | display:none; 63 | position:absolute; 64 | top:5px; 65 | left:3px; 66 | background:url(images/gritter.png) no-repeat left top; 67 | cursor:pointer; 68 | width:30px; 69 | height:30px; 70 | } 71 | .gritter-title { 72 | font-size:14px; 73 | font-weight:bold; 74 | padding:0 0 7px 0; 75 | display:block; 76 | text-shadow:1px 1px 0 #000; /* Not supported by IE :( */ 77 | } 78 | .gritter-image { 79 | width:48px; 80 | height:48px; 81 | float:left; 82 | } 83 | .gritter-with-image, 84 | .gritter-without-image { 85 | padding:0; 86 | } 87 | .gritter-with-image { 88 | width:220px; 89 | float:right; 90 | } 91 | /* for the light (white) version of the gritter notice */ 92 | .gritter-light .gritter-item, 93 | .gritter-light .gritter-bottom, 94 | .gritter-light .gritter-top, 95 | .gritter-light .gritter-close { 96 | background-image: url(images/gritter-light.png); 97 | color: #222; 98 | } 99 | .gritter-light .gritter-title { 100 | text-shadow: none; 101 | } 102 | -------------------------------------------------------------------------------- /static/template/css/jcarousel.responsive.css: -------------------------------------------------------------------------------- 1 | .jcarousel-wrapper { 2 | margin: 20px auto; 3 | position: relative; 4 | border: 10px solid #fff; 5 | -webkit-border-radius: 5px; 6 | -moz-border-radius: 5px; 7 | border-radius: 5px; 8 | -webkit-box-shadow: 0 0 2px #999; 9 | -moz-box-shadow: 0 0 2px #999; 10 | box-shadow: 0 0 2px #999; 11 | } 12 | 13 | /** Carousel **/ 14 | 15 | .jcarousel { 16 | position: relative; 17 | overflow: hidden; 18 | width: 100%; 19 | } 20 | 21 | .jcarousel ul { 22 | width: 20000em; 23 | position: relative; 24 | list-style: none; 25 | margin: 0; 26 | padding: 0; 27 | } 28 | 29 | .jcarousel li { 30 | width: 200px; 31 | float: left; 32 | border: 1px solid #fff; 33 | -moz-box-sizing: border-box; 34 | -webkit-box-sizing: border-box; 35 | box-sizing: border-box; 36 | } 37 | 38 | .jcarousel img { 39 | display: block; 40 | max-width: 100%; 41 | height: auto !important; 42 | } 43 | 44 | /** Carousel Controls **/ 45 | 46 | .jcarousel-control-prev, 47 | .jcarousel-control-next { 48 | position: absolute; 49 | top: 50%; 50 | margin-top: -15px; 51 | width: 30px; 52 | height: 30px; 53 | text-align: center; 54 | background: #4E443C; 55 | color: #fff; 56 | text-decoration: none; 57 | text-shadow: 0 0 1px #000; 58 | font: 24px/27px Arial, sans-serif; 59 | -webkit-border-radius: 30px; 60 | -moz-border-radius: 30px; 61 | border-radius: 30px; 62 | -webkit-box-shadow: 0 0 4px #F0EFE7; 63 | -moz-box-shadow: 0 0 4px #F0EFE7; 64 | box-shadow: 0 0 4px #F0EFE7; 65 | } 66 | 67 | .jcarousel-control-prev { 68 | left: 15px; 69 | } 70 | 71 | .jcarousel-control-next { 72 | right: 15px; 73 | } 74 | 75 | /** Carousel Pagination **/ 76 | 77 | .jcarousel-pagination { 78 | position: absolute; 79 | bottom: -40px; 80 | left: 50%; 81 | -webkit-transform: translate(-50%, 0); 82 | -ms-transform: translate(-50%, 0); 83 | transform: translate(-50%, 0); 84 | margin: 0; 85 | } 86 | 87 | .jcarousel-pagination a { 88 | text-decoration: none; 89 | display: inline-block; 90 | 91 | font-size: 11px; 92 | height: 10px; 93 | width: 10px; 94 | line-height: 10px; 95 | 96 | background: #fff; 97 | color: #4E443C; 98 | border-radius: 10px; 99 | text-indent: -9999px; 100 | 101 | margin-right: 7px; 102 | 103 | 104 | -webkit-box-shadow: 0 0 2px #4E443C; 105 | -moz-box-shadow: 0 0 2px #4E443C; 106 | box-shadow: 0 0 2px #4E443C; 107 | } 108 | 109 | .jcarousel-pagination a.active { 110 | background: #4E443C; 111 | color: #fff; 112 | opacity: 1; 113 | 114 | -webkit-box-shadow: 0 0 2px #F0EFE7; 115 | -moz-box-shadow: 0 0 2px #F0EFE7; 116 | box-shadow: 0 0 2px #F0EFE7; 117 | } 118 | -------------------------------------------------------------------------------- /static/template/css/jquery.dataTables_themeroller.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | * Table 5 | */ 6 | table.dataTable { 7 | margin: 0 auto; 8 | clear: both; 9 | width: 100%; 10 | border-collapse: collapse; 11 | } 12 | 13 | table.dataTable thead th { 14 | padding: 3px 0px 3px 10px; 15 | cursor: pointer; 16 | *cursor: hand; 17 | } 18 | 19 | table.dataTable tfoot th { 20 | padding: 3px 10px; 21 | } 22 | 23 | table.dataTable td { 24 | padding: 3px 10px; 25 | } 26 | 27 | table.dataTable td.center, 28 | table.dataTable td.dataTables_empty { 29 | text-align: center; 30 | } 31 | 32 | table.dataTable tr.odd { background-color: #E2E4FF; } 33 | table.dataTable tr.even { background-color: white; } 34 | 35 | table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; } 36 | table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; } 37 | table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; } 38 | table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; } 39 | table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; } 40 | table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; } 41 | 42 | 43 | /* 44 | * Table wrapper 45 | */ 46 | .dataTables_wrapper { 47 | position: relative; 48 | clear: both; 49 | *zoom: 1; 50 | } 51 | .dataTables_wrapper .ui-widget-header { 52 | font-weight: normal; 53 | } 54 | .dataTables_wrapper .ui-toolbar { 55 | padding: 5px; 56 | } 57 | 58 | 59 | /* 60 | * Page length menu 61 | */ 62 | .dataTables_length { 63 | float: left; 64 | } 65 | 66 | 67 | /* 68 | * Filter 69 | */ 70 | .dataTables_filter { 71 | float: right; 72 | text-align: right; 73 | } 74 | 75 | 76 | /* 77 | * Table information 78 | */ 79 | .dataTables_info { 80 | padding-top: 3px; 81 | clear: both; 82 | float: left; 83 | } 84 | 85 | 86 | /* 87 | * Pagination 88 | */ 89 | .dataTables_paginate { 90 | float: right; 91 | text-align: right; 92 | } 93 | 94 | .dataTables_paginate .ui-button { 95 | margin-right: -0.1em !important; 96 | } 97 | 98 | .paging_two_button .ui-button { 99 | float: left; 100 | cursor: pointer; 101 | * cursor: hand; 102 | } 103 | 104 | .paging_full_numbers .ui-button { 105 | padding: 2px 6px; 106 | margin: 0; 107 | cursor: pointer; 108 | * cursor: hand; 109 | color: #333 !important; 110 | } 111 | 112 | /* Two button pagination - previous / next */ 113 | .paginate_disabled_previous, 114 | .paginate_enabled_previous, 115 | .paginate_disabled_next, 116 | .paginate_enabled_next { 117 | height: 19px; 118 | float: left; 119 | cursor: pointer; 120 | *cursor: hand; 121 | color: #111 !important; 122 | } 123 | .paginate_disabled_previous:hover, 124 | .paginate_enabled_previous:hover, 125 | .paginate_disabled_next:hover, 126 | .paginate_enabled_next:hover { 127 | text-decoration: none !important; 128 | } 129 | .paginate_disabled_previous:active, 130 | .paginate_enabled_previous:active, 131 | .paginate_disabled_next:active, 132 | .paginate_enabled_next:active { 133 | outline: none; 134 | } 135 | 136 | .paginate_disabled_previous, 137 | .paginate_disabled_next { 138 | color: #666 !important; 139 | } 140 | .paginate_disabled_previous, 141 | .paginate_enabled_previous { 142 | padding-left: 23px; 143 | } 144 | .paginate_disabled_next, 145 | .paginate_enabled_next { 146 | padding-right: 23px; 147 | margin-left: 10px; 148 | } 149 | 150 | .paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; } 151 | .paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; } 152 | .paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; } 153 | 154 | .paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; } 155 | .paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; } 156 | .paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; } 157 | 158 | /* Full number pagination */ 159 | .paging_full_numbers a:active { 160 | outline: none 161 | } 162 | .paging_full_numbers a:hover { 163 | text-decoration: none; 164 | } 165 | 166 | .paging_full_numbers a.paginate_button, 167 | .paging_full_numbers a.paginate_active { 168 | border: 1px solid #aaa; 169 | -webkit-border-radius: 5px; 170 | -moz-border-radius: 5px; 171 | border-radius: 5px; 172 | padding: 2px 5px; 173 | margin: 0 3px; 174 | cursor: pointer; 175 | *cursor: hand; 176 | color: #333 !important; 177 | } 178 | 179 | .paging_full_numbers a.paginate_button { 180 | background-color: #ddd; 181 | } 182 | 183 | .paging_full_numbers a.paginate_button:hover { 184 | background-color: #ccc; 185 | text-decoration: none !important; 186 | } 187 | 188 | .paging_full_numbers a.paginate_active { 189 | background-color: #99B3FF; 190 | } 191 | 192 | 193 | /* 194 | * Processing indicator 195 | */ 196 | .dataTables_processing { 197 | position: absolute; 198 | top: 50%; 199 | left: 50%; 200 | width: 250px; 201 | height: 30px; 202 | margin-left: -125px; 203 | margin-top: -15px; 204 | padding: 14px 0 2px 0; 205 | border: 1px solid #ddd; 206 | text-align: center; 207 | color: #999; 208 | font-size: 14px; 209 | background-color: white; 210 | } 211 | 212 | 213 | /* 214 | * Sorting 215 | */ 216 | table.dataTable thead th div.DataTables_sort_wrapper { 217 | position: relative; 218 | padding-right: 20px; 219 | } 220 | 221 | table.dataTable thead th div.DataTables_sort_wrapper span { 222 | position: absolute; 223 | top: 50%; 224 | margin-top: -8px; 225 | right: 0; 226 | } 227 | 228 | table.dataTable th:active { 229 | outline: none; 230 | } 231 | 232 | 233 | /* 234 | * Scrolling 235 | */ 236 | .dataTables_scroll { 237 | clear: both; 238 | } 239 | 240 | .dataTables_scrollBody { 241 | *margin-top: -1px; 242 | -webkit-overflow-scrolling: touch; 243 | } 244 | 245 | -------------------------------------------------------------------------------- /static/template/css/jquery.tagsinput.css: -------------------------------------------------------------------------------- 1 | div.tagsinput { border:1px solid #CCC; background: #FFF; padding:5px; width:300px; height:100px; overflow-y: auto;} 2 | div.tagsinput span.tag { border: 1px solid #a5d24a; -moz-border-radius:2px; -webkit-border-radius:2px; display: block; float: left; padding: 5px; text-decoration:none; background: #cde69c; color: #638421; margin-right: 5px; margin-bottom:5px;font-family: helvetica; font-size:13px;} 3 | div.tagsinput span.tag a { font-weight: bold; color: #82ad2b; text-decoration:none; font-size: 11px; } 4 | div.tagsinput input { width:80px; margin:0px; font-family: helvetica; font-size: 13px; border:1px solid transparent; padding:5px; background: transparent; color: #000; outline:0px; margin-right:5px; margin-bottom:5px; } 5 | div.tagsinput div { display:block; float: left; } 6 | .tags_clear { clear: both; width: 100%; height: 0px; } 7 | .not_valid {background: #FBD8DB !important; color: #90111A !important;} 8 | -------------------------------------------------------------------------------- /static/template/css/morris.css: -------------------------------------------------------------------------------- 1 | .morris-hover{position:absolute;z-index:1000;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255, 255, 255, 0.8);border:solid 2px rgba(230, 230, 230, 0.8);font-family:sans-serif;font-size:12px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;} 2 | .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;} 3 | -------------------------------------------------------------------------------- /static/template/css/pace.css: -------------------------------------------------------------------------------- 1 | /* This is a compiled file, you should be editing the file in the templates directory */ 2 | .pace { 3 | -webkit-pointer-events: none; 4 | pointer-events: none; 5 | -webkit-user-select: none; 6 | -moz-user-select: none; 7 | user-select: none; 8 | } 9 | 10 | .pace-inactive { 11 | display: none; 12 | } 13 | 14 | .pace .pace-progress { 15 | background: #29d; 16 | position: fixed; 17 | z-index: 2000; 18 | top: 0; 19 | left: 0; 20 | height: 2px; 21 | 22 | -webkit-transition: width 1s; 23 | -moz-transition: width 1s; 24 | -o-transition: width 1s; 25 | transition: width 1s; 26 | } 27 | 28 | .pace .pace-progress-inner { 29 | display: block; 30 | position: absolute; 31 | right: 0px; 32 | width: 100px; 33 | height: 100%; 34 | box-shadow: 0 0 10px #29d, 0 0 5px #29d; 35 | opacity: 1.0; 36 | -webkit-transform: rotate(3deg) translate(0px, -4px); 37 | -moz-transform: rotate(3deg) translate(0px, -4px); 38 | -ms-transform: rotate(3deg) translate(0px, -4px); 39 | -o-transform: rotate(3deg) translate(0px, -4px); 40 | transform: rotate(3deg) translate(0px, -4px); 41 | } 42 | 43 | .pace .pace-activity { 44 | display: block; 45 | position: fixed; 46 | z-index: 2000; 47 | top: 15px; 48 | right: 15px; 49 | width: 14px; 50 | height: 14px; 51 | border: solid 2px transparent; 52 | border-top-color: #29d; 53 | border-left-color: #29d; 54 | border-radius: 10px; 55 | -webkit-animation: pace-spinner 400ms linear infinite; 56 | -moz-animation: pace-spinner 400ms linear infinite; 57 | -ms-animation: pace-spinner 400ms linear infinite; 58 | -o-animation: pace-spinner 400ms linear infinite; 59 | animation: pace-spinner 400ms linear infinite; 60 | } 61 | 62 | @-webkit-keyframes pace-spinner { 63 | 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 64 | 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 65 | } 66 | @-moz-keyframes pace-spinner { 67 | 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 68 | 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } 69 | } 70 | @-o-keyframes pace-spinner { 71 | 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 72 | 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } 73 | } 74 | @-ms-keyframes pace-spinner { 75 | 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 76 | 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } 77 | } 78 | @keyframes pace-spinner { 79 | 0% { transform: rotate(0deg); transform: rotate(0deg); } 80 | 100% { transform: rotate(360deg); transform: rotate(360deg); } 81 | } 82 | -------------------------------------------------------------------------------- /static/template/css/prettify.css: -------------------------------------------------------------------------------- 1 | /* Pretty printing styles. Used with prettify.js. */ 2 | 3 | /* SPAN elements with the classes below are added by prettyprint. */ 4 | .pln { color: #000 } /* plain text */ 5 | 6 | @media screen { 7 | .str { color: #080 } /* string content */ 8 | .kwd { color: #008 } /* a keyword */ 9 | .com { color: #800 } /* a comment */ 10 | .typ { color: #606 } /* a type name */ 11 | .lit { color: #066 } /* a literal value */ 12 | /* punctuation, lisp open bracket, lisp close bracket */ 13 | .pun, .opn, .clo { color: #660 } 14 | .tag { color: #008 } /* a markup tag name */ 15 | .atn { color: #606 } /* a markup attribute name */ 16 | .atv { color: #080 } /* a markup attribute value */ 17 | .dec, .var { color: #606 } /* a declaration; a variable name */ 18 | .fun { color: red } /* a function name */ 19 | } 20 | 21 | /* Use higher contrast and text-weight for printable form. */ 22 | @media print, projection { 23 | .str { color: #060 } 24 | .kwd { color: #006; font-weight: bold } 25 | .com { color: #600; font-style: italic } 26 | .typ { color: #404; font-weight: bold } 27 | .lit { color: #044 } 28 | .pun, .opn, .clo { color: #440 } 29 | .tag { color: #006; font-weight: bold } 30 | .atn { color: #404 } 31 | .atv { color: #060 } 32 | } 33 | 34 | /* Put a border around prettyprinted code snippets. */ 35 | pre.prettyprint { padding: 2px; border: 1px solid #888 } 36 | 37 | /* Specify class=linenums on a pre to get line numbering */ 38 | ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ 39 | li.L0, 40 | li.L1, 41 | li.L2, 42 | li.L3, 43 | li.L5, 44 | li.L6, 45 | li.L7, 46 | li.L8 { list-style-type: none } 47 | /* Alternate shading for lines */ 48 | li.L1, 49 | li.L3, 50 | li.L5, 51 | li.L7, 52 | li.L9 { background: #eee } 53 | -------------------------------------------------------------------------------- /static/template/css/slider.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Slider for Bootstrap 3 | * 4 | * Copyright 2012 Stefan Petre 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | */ 9 | .slider { 10 | display: inline-block; 11 | vertical-align: middle; 12 | position: relative; 13 | } 14 | .slider.slider-horizontal { 15 | width: 210px; 16 | height: 20px; 17 | } 18 | .slider.slider-horizontal .slider-track { 19 | height: 10px; 20 | width: 100%; 21 | margin-top: -5px; 22 | top: 50%; 23 | left: 0; 24 | } 25 | .slider.slider-horizontal .slider-selection { 26 | height: 100%; 27 | top: 0; 28 | bottom: 0; 29 | } 30 | .slider.slider-horizontal .slider-handle { 31 | margin-left: -10px; 32 | margin-top: -5px; 33 | } 34 | .slider.slider-horizontal .slider-handle.triangle { 35 | border-width: 0 10px 10px 10px; 36 | width: 0; 37 | height: 0; 38 | border-bottom-color: #0480be; 39 | margin-top: 0; 40 | } 41 | .slider.slider-vertical { 42 | height: 210px; 43 | width: 20px; 44 | } 45 | .slider.slider-vertical .slider-track { 46 | width: 10px; 47 | height: 100%; 48 | margin-left: -5px; 49 | left: 50%; 50 | top: 0; 51 | } 52 | .slider.slider-vertical .slider-selection { 53 | width: 100%; 54 | left: 0; 55 | top: 0; 56 | bottom: 0; 57 | } 58 | .slider.slider-vertical .slider-handle { 59 | margin-left: -5px; 60 | margin-top: -10px; 61 | } 62 | .slider.slider-vertical .slider-handle.triangle { 63 | border-width: 10px 0 10px 10px; 64 | width: 1px; 65 | height: 1px; 66 | border-left-color: #0480be; 67 | margin-left: 0; 68 | } 69 | .slider input { 70 | display: none; 71 | } 72 | .slider .tooltip-inner { 73 | white-space: nowrap; 74 | } 75 | .slider-track { 76 | position: absolute; 77 | cursor: pointer; 78 | background-color: #f7f7f7; 79 | background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); 80 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); 81 | background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); 82 | background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); 83 | background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); 84 | background-repeat: repeat-x; 85 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); 86 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 87 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 88 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 89 | -webkit-border-radius: 4px; 90 | -moz-border-radius: 4px; 91 | border-radius: 4px; 92 | } 93 | .slider-selection { 94 | position: absolute; 95 | background-color: #f7f7f7; 96 | background-image: -moz-linear-gradient(top, #f9f9f9, #f5f5f5); 97 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f5f5f5)); 98 | background-image: -webkit-linear-gradient(top, #f9f9f9, #f5f5f5); 99 | background-image: -o-linear-gradient(top, #f9f9f9, #f5f5f5); 100 | background-image: linear-gradient(to bottom, #f9f9f9, #f5f5f5); 101 | background-repeat: repeat-x; 102 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); 103 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 104 | -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 105 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 106 | -webkit-box-sizing: border-box; 107 | -moz-box-sizing: border-box; 108 | box-sizing: border-box; 109 | -webkit-border-radius: 4px; 110 | -moz-border-radius: 4px; 111 | border-radius: 4px; 112 | } 113 | .slider-handle { 114 | position: absolute; 115 | width: 20px; 116 | height: 20px; 117 | background-color: #0e90d2; 118 | background-image: -moz-linear-gradient(top, #149bdf, #0480be); 119 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); 120 | background-image: -webkit-linear-gradient(top, #149bdf, #0480be); 121 | background-image: -o-linear-gradient(top, #149bdf, #0480be); 122 | background-image: linear-gradient(to bottom, #149bdf, #0480be); 123 | background-repeat: repeat-x; 124 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); 125 | -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 126 | -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 127 | box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 128 | opacity: 0.8; 129 | border: 0px solid transparent; 130 | } 131 | .slider-handle.round { 132 | -webkit-border-radius: 20px; 133 | -moz-border-radius: 20px; 134 | border-radius: 20px; 135 | } 136 | .slider-handle.triangle { 137 | background: transparent none; 138 | } -------------------------------------------------------------------------------- /static/template/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/template/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/template/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/template/img/email_template/color1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/email_template/color1.png -------------------------------------------------------------------------------- /static/template/img/email_template/color2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/email_template/color2.png -------------------------------------------------------------------------------- /static/template/img/email_template/color3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/email_template/color3.png -------------------------------------------------------------------------------- /static/template/img/email_template/color4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/email_template/color4.png -------------------------------------------------------------------------------- /static/template/img/email_template/color5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/email_template/color5.png -------------------------------------------------------------------------------- /static/template/img/email_template/color6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/email_template/color6.png -------------------------------------------------------------------------------- /static/template/img/gallery1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery1.jpg -------------------------------------------------------------------------------- /static/template/img/gallery10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery10.jpg -------------------------------------------------------------------------------- /static/template/img/gallery11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery11.jpg -------------------------------------------------------------------------------- /static/template/img/gallery12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery12.jpg -------------------------------------------------------------------------------- /static/template/img/gallery13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery13.jpg -------------------------------------------------------------------------------- /static/template/img/gallery14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery14.jpg -------------------------------------------------------------------------------- /static/template/img/gallery15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery15.jpg -------------------------------------------------------------------------------- /static/template/img/gallery2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery2.jpg -------------------------------------------------------------------------------- /static/template/img/gallery3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery3.jpg -------------------------------------------------------------------------------- /static/template/img/gallery4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery4.jpg -------------------------------------------------------------------------------- /static/template/img/gallery5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery5.jpg -------------------------------------------------------------------------------- /static/template/img/gallery6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery6.jpg -------------------------------------------------------------------------------- /static/template/img/gallery7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery7.jpg -------------------------------------------------------------------------------- /static/template/img/gallery8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery8.jpg -------------------------------------------------------------------------------- /static/template/img/gallery9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/gallery9.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview1.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview10.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview11.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview12.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview13.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview14.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview15.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview2.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview3.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview4.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview5.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview6.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview7.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview8.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/movie/preview9.jpg -------------------------------------------------------------------------------- /static/template/img/responsive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/responsive.png -------------------------------------------------------------------------------- /static/template/img/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/screenshot.jpg -------------------------------------------------------------------------------- /static/template/img/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/user.jpg -------------------------------------------------------------------------------- /static/template/img/user2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/user2.jpg -------------------------------------------------------------------------------- /static/template/img/user3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/user3.jpg -------------------------------------------------------------------------------- /static/template/img/user4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/user4.jpg -------------------------------------------------------------------------------- /static/template/img/user5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/img/user5.jpg -------------------------------------------------------------------------------- /static/template/js/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); -------------------------------------------------------------------------------- /static/template/js/endless/endless_form.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | // Chosen 3 | $(".chzn-select").chosen(); 4 | 5 | // Datepicker 6 | $('.datepicker').datepicker(); 7 | 8 | // Timepicker 9 | $('.timepicker').timepicker(); 10 | 11 | // Slider 12 | $('#sl1').slider(); 13 | $('#sl2').slider(); 14 | $('#sl3').slider(); 15 | $('#sl4').slider(); 16 | $('#sl5').slider(); 17 | 18 | // Tags input 19 | $('.tag-demo1').tagsInput({ 20 | 'height':'auto', 21 | 'width':'90%' 22 | }); 23 | 24 | // Masked input 25 | $(".date").mask("99/99/9999"); 26 | $(".phone").mask("(999) 999-9999"); 27 | $(".ssn").mask("999-99-9999"); 28 | $(".eyescript").mask("~9.99 ~9.99 999"); 29 | $(".product-key").mask("a*-999-a999"); 30 | 31 | // Wysihtml5 32 | $('#wysihtml5-textarea').wysihtml5(); 33 | 34 | // Toggle border of control group 35 | $('#toggleLine').click(function() { 36 | if($(this).is(':checked')) { 37 | $('#formToggleLine').addClass('form-border'); 38 | } 39 | else { 40 | $('#formToggleLine').removeClass('form-border'); 41 | } 42 | }); 43 | 44 | // Draggable Multiselect 45 | $('#btnSelect').click(function() { 46 | 47 | $('#selectedBox1 option:selected').appendTo('#selectedBox2'); 48 | return false; 49 | }); 50 | 51 | $('#btnRemove').click(function() { 52 | $('#selectedBox2 option:selected').appendTo('#selectedBox1'); 53 | return false; 54 | }); 55 | 56 | $('#btnSelectAll').click(function() { 57 | 58 | $('#selectedBox1 option').each(function() { 59 | $(this).appendTo('#selectedBox2'); 60 | }); 61 | 62 | return false; 63 | }); 64 | 65 | $('#btnRemoveAll').click(function() { 66 | 67 | $('#selectedBox2 option').each(function() { 68 | $(this).appendTo('#selectedBox1'); 69 | }); 70 | 71 | return false; 72 | }); 73 | }); -------------------------------------------------------------------------------- /static/template/js/endless/endless_wizard.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | //Form Wizard 1 4 | var currentStep_1 = 1; 5 | 6 | //Form Wizard 2 7 | var currentStep_2 = 1; 8 | 9 | $('.wizard-demo li a').click(function() { 10 | alert('You must enter your information') 11 | return false; 12 | }); 13 | 14 | //Form Validation 15 | $('#basic-constraint').parsley( { listeners: { 16 | onFormSubmit: function ( isFormValid, event ) { 17 | if(isFormValid) { 18 | return false; 19 | } 20 | } 21 | }}); 22 | 23 | $('#type-constraint').parsley( { listeners: { 24 | onFormSubmit: function ( isFormValid, event ) { 25 | if(isFormValid) { 26 | return false; 27 | } 28 | } 29 | }}); 30 | 31 | $('#formValidate1').parsley( { listeners: { 32 | onFormSubmit: function ( isFormValid, event ) { 33 | if(isFormValid) { 34 | alert('Registration Complete'); 35 | return false; 36 | } 37 | } 38 | }}); 39 | 40 | $('#formValidate2').parsley( { listeners: { 41 | onFormSubmit: function ( isFormValid, event ) { 42 | if(isFormValid) { 43 | alert('Your message has been sent'); 44 | return false; 45 | } 46 | } 47 | }}); 48 | 49 | $('#formWizard1').parsley( { listeners: { 50 | onFieldValidate: function ( elem ) { 51 | // if field is not visible, do not apply Parsley validation! 52 | if ( !$( elem ).is( ':visible' ) ) { 53 | return true; 54 | } 55 | 56 | return false; 57 | }, 58 | onFormSubmit: function ( isFormValid, event ) { 59 | if(isFormValid) { 60 | 61 | currentStep_1++; 62 | 63 | if(currentStep_1 == 2) { 64 | $('#wizardDemo1 li:eq(1) a').tab('show'); 65 | $('#wizardProgress').css("width","66%"); 66 | 67 | $('#prevStep1').attr('disabled',false); 68 | $('#prevStep1').removeClass('disabled'); 69 | } 70 | else if(currentStep_1 == 3) { 71 | $('#wizardDemo1 li:eq(2) a').tab('show'); 72 | $('#wizardProgress').css("width","100%"); 73 | 74 | $('#nextStep1').attr('disabled',true); 75 | $('#nextStep1').addClass('disabled'); 76 | } 77 | 78 | return false; 79 | } 80 | } 81 | }}); 82 | 83 | $('#formWizard2').parsley( { listeners: { 84 | onFieldValidate: function ( elem ) { 85 | // if field is not visible, do not apply Parsley validation! 86 | if ( !$( elem ).is( ':visible' ) ) { 87 | return true; 88 | } 89 | 90 | return false; 91 | }, 92 | onFormSubmit: function ( isFormValid, event ) { 93 | if(isFormValid) { 94 | 95 | currentStep_2++; 96 | 97 | if(currentStep_2 == 2) { 98 | $('#wizardDemo2 li:eq(1) a').tab('show'); 99 | 100 | $('#prevStep2').attr('disabled',false); 101 | $('#prevStep2').removeClass('disabled'); 102 | } 103 | else if(currentStep_2 == 3) { 104 | $('#wizardDemo2 li:eq(2) a').tab('show'); 105 | } 106 | else if(currentStep_2 == 4) { 107 | $('#wizardDemo2 li:eq(3) a').tab('show'); 108 | 109 | $('#nextStep2').attr('disabled',true); 110 | $('#nextStep2').addClass('disabled'); 111 | } 112 | 113 | return false; 114 | } 115 | } 116 | }}); 117 | 118 | $('#prevStep1').click(function() { 119 | 120 | currentStep_1--; 121 | 122 | if(currentStep_1 == 1) { 123 | 124 | $('#wizardDemo1 li:eq(0) a').tab('show'); 125 | $('#wizardProgress').css("width","66%"); 126 | 127 | $('#prevStep1').attr('disabled',true); 128 | $('#prevStep1').addClass('disabled'); 129 | 130 | $('#wizardProgress').css("width","33%"); 131 | } 132 | else if(currentStep_1 == 2) { 133 | 134 | $('#wizardDemo1 li:eq(1) a').tab('show'); 135 | $('#wizardProgress').css("width","66%"); 136 | 137 | $('#nextStep1').attr('disabled',false); 138 | $('#nextStep1').removeClass('disabled'); 139 | 140 | $('#wizardProgress').css("width","66%"); 141 | } 142 | 143 | return false; 144 | }); 145 | 146 | $('#prevStep2').click(function() { 147 | 148 | currentStep_2--; 149 | 150 | if(currentStep_2 == 1) { 151 | 152 | $('#wizardDemo2 li:eq(0) a').tab('show'); 153 | 154 | $('#prevStep2').attr('disabled',true); 155 | $('#prevStep2').addClass('disabled'); 156 | 157 | } 158 | else if(currentStep_2 == 2) { 159 | $('#wizardDemo2 li:eq(1) a').tab('show'); 160 | } 161 | 162 | else if(currentStep_2 == 3) { 163 | 164 | $('#wizardDemo2 li:eq(2) a').tab('show'); 165 | 166 | $('#nextStep2').attr('disabled',false); 167 | $('#nextStep2').removeClass('disabled'); 168 | 169 | } 170 | 171 | return false; 172 | }); 173 | }); -------------------------------------------------------------------------------- /static/template/js/jquery-ui-map/ui/min/jquery.ui.map.full.min.js: -------------------------------------------------------------------------------- 1 | /*! jquery-ui-map rc1 | Johan Säll Larsson */ 2 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('(3(d){d.a=3(a,b){j c=a.v(".")[0],a=a.v(".")[1];d[c]=d[c]||{};d[c][a]=3(a,b){I.O&&2.1i(a,b)};d[c][a].K=d.n({1s:c,1u:a},b);d.N[a]=3(b){j g="1p"===1k b,f=L.K.X.W(I,1),i=2;l(g&&"1j"===b.1l(0,1))6 i;2.18(3(){j h=d.1b(2,a);h||(h=d.1b(2,a,k d[c][a](b,2)));g&&(i=h[b].14(h,f))});6 i}};d.a("1J.1G",{u:{1A:"1x",1y:5},1B:3(a,b){6 b?(2.u[a]=b,2.4("9").x(a,b),2):2.u[a]},1i:3(a,b){2.E=b;a=a||{};m.n(2.u,a,{1h:2.w(a.1h)});2.1g();2.1f&&2.1f()},1g:3(){j a=2;2.o={9:k 8.7.1D(a.E,a.u),M:[],p:[],q:[]};8.7.G.1C(a.o.9,"1F",3(){d(a.E).19("1E",a.o.9)});a.C(a.u.1t,a.o.9)},Z:3(a){j b=2.4("12",k 8.7.1z);b.n(2.w(a));2.4("9").1M(b);6 2},1L:3(a){j b=2.4("9").1O();6 b?b.1N(a.Y()):!1},1K:3(a,b){2.4("9").1H[b].J(2.F(a));6 2},1I:3(a,b){a.9=2.4("9");a.13=2.w(a.13);j c=k(a.1n||8.7.1o)(a),e=2.4("M");c.16?e[c.16]=c:e.J(c);c.12&&2.Z(c.Y());2.C(b,a.9,c);6 d(c)},z:3(a){2.B(2.4(a));2.x(a,[]);6 2},B:3(a){y(j b Q a)a.11(b)&&(a[b]r 8.7.17?(8.7.G.1v(a[b]),a[b].A&&a[b].A(t)):a[b]r L&&2.B(a[b]),a[b]=t)},1w:3(a,b,c){a=2.4(a);b.s=d.1m(b.s)?b.s:[b.s];y(j e Q a)l(a.11(e)){j g=!1,f;y(f Q b.s)l(-1")){y(j e=a.T(/ /g,"").v(">"),d=0;d U",k 8.7.U),f=2.4("q > S",k 8.7.S);b&&f.R(b);g.1U(a,3(a,b){"1T"===b?(f.26(a),f.A(d.4("9"))):f.A(t);c(a,b)})},27:3(a,b){2.4("9").29(2.4("q > 1d",k 8.7.1d(2.F(a),b)))},28:3(a,b){2.4("q > 1a",k 8.7.1a).21(a,b)},20:3(a,b){j c=k 8.7[a](m.n({9:2.4("9")},b));2.4("p > "+a,[]).J(c);6 d(c)},22:3(a,b){(!b?2.4("p > D",k 8.7.D):2.4("p > D",k 8.7.D(b,a))).R(m.n({9:2.4("9")},a))},23:3(a,b,c){2.4("p > "+a,k 8.7.1Y(b,m.n({9:2.4("9")},c)))}});m.N.n({1e:3(a){8.7.G.19(2[0],a);6 2},15:3(a,b,c){8.7&&2[0]r 8.7.17?8.7.G.24(2[0],a,b):c?2.1c(a,b,c):2.1c(a,b);6 2}});m.18("25 1R 1Z 1V 2m 2l 2j".v(" "),3(a,b){m.N[b]=3(a,d){6 2.15(b,a,d)}})})(m);',62,151,'||this|function|get||return|maps|google|map||||||||||var|new|if|jQuery|extend|instance|overlays|services|instanceof|value|null|options|split|_latLng|set|for|clear|setMap|_c|_call|FusionTablesLayer|el|_unwrap|event|iw|arguments|push|prototype|Array|markers|fn|length|LatLng|in|setOptions|DirectionsRenderer|replace|DirectionsService|operator|call|slice|getPosition|addBounds|else|hasOwnProperty|bounds|position|apply|addEventListener|id|MVCObject|each|trigger|Geocoder|data|bind|StreetViewPanorama|triggerEvent|_init|_create|center|_setup|_|typeof|substring|isArray|marker|Marker|string|property|inArray|namespace|callback|pluginName|clearInstanceListeners|find|roadmap|zoom|LatLngBounds|mapTypeId|option|addListenerOnce|Map|init|bounds_changed|gmap|controls|addMarker|ui|addControl|inViewport|fitBounds|contains|getBounds|AND|Object|rightclick|displayDirections|OK|route|mouseover|name|isFunction|KmlLayer|dblclick|addShape|geocode|loadFusion|loadKML|addListener|click|setDirections|displayStreetView|search|setStreetView|close|closeInfoWindow|break|refresh|indexOf|infoWindow|openInfoWindow|open|InfoWindow|dragend|destroy|drag|mouseout|removeData|getCenter|setCenter|resize'.split('|'),0,{})) -------------------------------------------------------------------------------- /static/template/js/jquery-ui-map/ui/min/jquery.ui.map.microformat.min.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/YGOL/98bdff19b2d828fab0a664f515e00183a8819cf3/static/template/js/jquery-ui-map/ui/min/jquery.ui.map.microformat.min.js -------------------------------------------------------------------------------- /static/template/js/jquery.cookie.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.3.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | 9 | (function(e){if(typeof define==="function"&&define.amd){define(["jquery"],e)}else{e(jQuery)}})(function(e){function n(e){if(i.raw){return e}return decodeURIComponent(e.replace(t," "))}function r(e){if(e.indexOf('"')===0){e=e.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")}e=n(e);try{return i.json?JSON.parse(e):e}catch(t){}}var t=/\+/g;var i=e.cookie=function(t,s,o){if(s!==undefined){o=e.extend({},i.defaults,o);if(typeof o.expires==="number"){var u=o.expires,a=o.expires=new Date;a.setDate(a.getDate()+u)}s=i.json?JSON.stringify(s):String(s);return document.cookie=[i.raw?t:encodeURIComponent(t),"=",i.raw?s:encodeURIComponent(s),o.expires?"; expires="+o.expires.toUTCString():"",o.path?"; path="+o.path:"",o.domain?"; domain="+o.domain:"",o.secure?"; secure":""].join("")}var f=document.cookie.split("; ");var l=t?undefined:{};for(var c=0,h=f.length;c',_tpl_title:'[[title]]',_tpl_item:'',_tpl_wrap:'
',add:function(g){if(typeof(g)=="string"){g={text:g}}if(g.text===null){throw'You must supply "text" parameter.'}if(!this._is_setup){this._runSetup()}var k=g.title,n=g.text,e=g.image||"",l=g.sticky||false,m=g.class_name||b.gritter.options.class_name,j=b.gritter.options.position,d=g.time||"";this._verifyWrapper();this._item_count++;var f=this._item_count,i=this._tpl_item;b(["before_open","after_open","before_close","after_close"]).each(function(p,q){a["_"+q+"_"+f]=(b.isFunction(g[q]))?g[q]:function(){}});this._custom_timer=0;if(d){this._custom_timer=d}var c=(e!="")?'':"",h=(e!="")?"gritter-with-image":"gritter-without-image";if(k){k=this._str_replace("[[title]]",k,this._tpl_title)}else{k=""}i=this._str_replace(["[[title]]","[[text]]","[[close]]","[[image]]","[[number]]","[[class_name]]","[[item_class]]"],[k,n,this._tpl_close,c,this._item_count,h,m],i);if(this["_before_open_"+f]()===false){return false}b("#gritter-notice-wrapper").addClass(j).append(i);var o=b("#gritter-item-"+this._item_count);o.fadeIn(this.fade_in_speed,function(){a["_after_open_"+f](b(this))});if(!l){this._setFadeTimer(o,f)}b(o).bind("mouseenter mouseleave",function(p){if(p.type=="mouseenter"){if(!l){a._restoreItemIfFading(b(this),f)}}else{if(!l){a._setFadeTimer(b(this),f)}}a._hoverState(b(this),p.type)});b(o).find(".gritter-close").click(function(){a.removeSpecific(f,{},null,true)});return f},_countRemoveWrapper:function(c,d,f){d.remove();this["_after_close_"+c](d,f);if(b(".gritter-item-wrapper").length==0){b("#gritter-notice-wrapper").remove()}},_fade:function(g,d,j,f){var j=j||{},i=(typeof(j.fade)!="undefined")?j.fade:true,c=j.speed||this.fade_out_speed,h=f;this["_before_close_"+d](g,h);if(f){g.unbind("mouseenter mouseleave")}if(i){g.animate({opacity:0},c,function(){g.animate({height:0},300,function(){a._countRemoveWrapper(d,g,h)})})}else{this._countRemoveWrapper(d,g)}},_hoverState:function(d,c){if(c=="mouseenter"){d.addClass("hover");d.find(".gritter-close").show()}else{d.removeClass("hover");d.find(".gritter-close").hide()}},removeSpecific:function(c,g,f,d){if(!f){var f=b("#gritter-item-"+c)}this._fade(f,c,g||{},d)},_restoreItemIfFading:function(d,c){clearTimeout(this["_int_id_"+c]);d.stop().css({opacity:"",height:""})},_runSetup:function(){for(opt in b.gritter.options){this[opt]=b.gritter.options[opt]}this._is_setup=1},_setFadeTimer:function(f,d){var c=(this._custom_timer)?this._custom_timer:this.time;this["_int_id_"+d]=setTimeout(function(){a._fade(f,d)},c)},stop:function(e){var c=(b.isFunction(e.before_close))?e.before_close:function(){};var f=(b.isFunction(e.after_close))?e.after_close:function(){};var d=b("#gritter-notice-wrapper");c(d);d.fadeOut(function(){b(this).remove();f()})},_str_replace:function(v,e,o,n){var k=0,h=0,t="",m="",g=0,q=0,l=[].concat(v),c=[].concat(e),u=o,d=c instanceof Array,p=u instanceof Array;u=[].concat(u);if(n){this.window[n]=0}for(k=0,g=u.length;k ').attr(j,d).css({position:'absolute',top:$(window).scrollTop(),left:$(window).scrollLeft()});f[j]='';$('body').prepend(k);location=e.hash;k.remove();f[j]=d}h.scrollTo(f,b).trigger('notify.serialScroll',[f])}})(jQuery); -------------------------------------------------------------------------------- /static/template/js/jquery.maskedinput.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | Masked Input plugin for jQuery 3 | Copyright (c) 2007-2013 Josh Bush (digitalbush.com) 4 | Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 5 | Version: 1.3.1 6 | */ 7 | 8 | (function(e){function t(){var e=document.createElement("input"),t="onpaste";e.setAttribute(t,"");return typeof e[t]==="function"?"paste":"input"}var n=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),s=/android/i.test(r),o;e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"};e.fn.extend({caret:function(e,t){var n;if(this.length===0||this.is(":hidden")){return}if(typeof e=="number"){t=typeof t==="number"?t:e;return this.each(function(){if(this.setSelectionRange){this.setSelectionRange(e,t)}else if(this.createTextRange){n=this.createTextRange();n.collapse(true);n.moveEnd("character",t);n.moveStart("character",e);n.select()}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;t=this[0].selectionEnd}else if(document.selection&&document.selection.createRange){n=document.selection.createRange();e=0-n.duplicate().moveStart("character",-1e5);t=e+n.text.length}return{begin:e,end:t}}},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var u,a,f,l,c,h;if(!t&&this.length>0){u=e(this[0]);return u.data(e.mask.dataName)()}r=e.extend({placeholder:e.mask.placeholder,completed:null},r);a=e.mask.definitions;f=[];l=h=t.length;c=null;e.each(t.split(""),function(e,t){if(t=="?"){h--;l=e}else if(a[t]){f.push(new RegExp(a[t]));if(c===null){c=f.length-1}}else{f.push(null)}});return this.trigger("unmask").each(function(){function v(e){while(++e=0&&!f[e]);return e}function g(e,t){var n,i;if(e<0){return}for(n=e,i=v(t);n=h){r.completed.call(u)}}}t.preventDefault()}}function E(e,t){var n;for(n=e;nt.length){break}}else if(p[i]===t.charAt(pos)&&i!==l){pos++;n=i}}if(e){S()}else if(n+1Expand',collapseBtnHTML:'',group:0,maxDepth:5,threshold:20};l.prototype={init:function(){var n=this;n.reset();n.el.data("nestable-group",this.options.group);n.placeEl=e('
');e.each(this.el.find(n.options.itemNodeName),function(t,r){n.setParent(e(r))});n.el.on("click","button",function(t){if(n.dragEl||!i&&t.button!==0){return}var r=e(t.currentTarget),s=r.data("action"),o=r.parent(n.options.itemNodeName);if(s==="collapse"){n.collapseItem(o)}if(s==="expand"){n.expandItem(o)}});var r=function(t){var r=e(t.target);if(!r.hasClass(n.options.handleClass)){if(r.closest("."+n.options.noDragClass).length){return}r=r.closest("."+n.options.handleClass)}if(!r.length||n.dragEl||!i&&t.button!==0||i&&t.touches.length!==1){return}t.preventDefault();n.dragStart(i?t.touches[0]:t)};var s=function(e){if(n.dragEl){e.preventDefault();n.dragMove(i?e.touches[0]:e)}};var f=function(e){if(n.dragEl){e.preventDefault();n.dragStop(i?e.touches[0]:e)}};if(i){n.el[0].addEventListener(o,r,false);t.addEventListener(u,s,false);t.addEventListener(a,f,false);t.addEventListener(eCancel,f,false)}else{n.el.on(o,r);n.w.on(u,s);n.w.on(a,f)}},serialize:function(){var t,n=0,r=this;step=function(t,n){var i=[],s=t.children(r.options.itemNodeName);s.each(function(){var t=e(this),s=e.extend({},t.data()),o=t.children(r.options.listNodeName);if(o.length){s.children=step(o,n+1)}i.push(s)});return i};t=step(r.el.find(r.options.listNodeName).first(),n);return t},serialise:function(){return this.serialize()},reset:function(){this.mouse={offsetX:0,offsetY:0,startX:0,startY:0,lastX:0,lastY:0,nowX:0,nowY:0,distX:0,distY:0,dirAx:0,dirX:0,dirY:0,lastDirX:0,lastDirY:0,distAxX:0,distAxY:0};this.moving=false;this.dragEl=null;this.dragRootEl=null;this.dragDepth=0;this.hasNewRoot=false;this.pointEl=null},expandItem:function(e){e.removeClass(this.options.collapsedClass);e.children('[data-action="expand"]').hide();e.children('[data-action="collapse"]').show();e.children(this.options.listNodeName).show()},collapseItem:function(e){var t=e.children(this.options.listNodeName);if(t.length){e.addClass(this.options.collapsedClass);e.children('[data-action="collapse"]').hide();e.children('[data-action="expand"]').show();e.children(this.options.listNodeName).hide()}},expandAll:function(){var t=this;t.el.find(t.options.itemNodeName).each(function(){t.expandItem(e(this))})},collapseAll:function(){var t=this;t.el.find(t.options.itemNodeName).each(function(){t.collapseItem(e(this))})},setParent:function(t){if(t.children(this.options.listNodeName).length){t.prepend(e(this.options.expandBtnHTML));t.prepend(e(this.options.collapseBtnHTML))}t.children('[data-action="expand"]').hide()},unsetParent:function(e){e.removeClass(this.options.collapsedClass);e.children("[data-action]").remove();e.children(this.options.listNodeName).remove()},dragStart:function(t){var i=this.mouse,s=e(t.target),o=s.closest(this.options.itemNodeName);this.placeEl.css("height",o.height());i.offsetX=t.offsetX!==r?t.offsetX:t.pageX-s.offset().left;i.offsetY=t.offsetY!==r?t.offsetY:t.pageY-s.offset().top;i.startX=i.lastX=t.pageX;i.startY=i.lastY=t.pageY;this.dragRootEl=this.el;this.dragEl=e(n.createElement(this.options.listNodeName)).addClass(this.options.listClass+" "+this.options.dragClass);this.dragEl.css("width",o.width());o.after(this.placeEl);o[0].parentNode.removeChild(o[0]);o.appendTo(this.dragEl);e(n.body).append(this.dragEl);this.dragEl.css({left:t.pageX-i.offsetX,top:t.pageY-i.offsetY});var u,a,f=this.dragEl.find(this.options.itemNodeName);for(u=0;uthis.dragDepth){this.dragDepth=a}}},dragStop:function(e){var t=this.dragEl.children(this.options.itemNodeName).first();t[0].parentNode.removeChild(t[0]);this.placeEl.replaceWith(t);this.dragEl.remove();this.el.trigger("change");if(this.hasNewRoot){this.dragRootEl.trigger("change")}this.reset()},dragMove:function(r){var i,o,u,a,f,l=this.options,c=this.mouse;this.dragEl.css({left:r.pageX-c.offsetX,top:r.pageY-c.offsetY});c.lastX=c.nowX;c.lastY=c.nowY;c.nowX=r.pageX;c.nowY=r.pageY;c.distX=c.nowX-c.lastX;c.distY=c.nowY-c.lastY;c.lastDirX=c.dirX;c.lastDirY=c.dirY;c.dirX=c.distX===0?0:c.distX>0?1:-1;c.dirY=c.distY===0?0:c.distY>0?1:-1;var h=Math.abs(c.distX)>Math.abs(c.distY)?1:0;if(!c.moving){c.dirAx=h;c.moving=true;return}if(c.dirAx!==h){c.distAxX=0;c.distAxY=0}else{c.distAxX+=Math.abs(c.distX);if(c.dirX!==0&&c.dirX!==c.lastDirX){c.distAxX=0}c.distAxY+=Math.abs(c.distY);if(c.dirY!==0&&c.dirY!==c.lastDirY){c.distAxY=0}}c.dirAx=h;if(c.dirAx&&c.distAxX>=l.threshold){c.distAxX=0;u=this.placeEl.prev(l.itemNodeName);if(c.distX>0&&u.length&&!u.hasClass(l.collapsedClass)){i=u.find(l.listNodeName).last();f=this.placeEl.parents(l.listNodeName).length;if(f+this.dragDepth<=l.maxDepth){if(!i.length){i=e("<"+l.listNodeName+"/>").addClass(l.listClass);i.append(this.placeEl);u.append(i);this.setParent(u)}else{i=u.children(l.listNodeName).last();i.append(this.placeEl)}}}if(c.distX<0){a=this.placeEl.next(l.itemNodeName);if(!a.length){o=this.placeEl.parent();this.placeEl.closest(l.itemNodeName).after(this.placeEl);if(!o.children().length){this.unsetParent(o.parent())}}}}var p=false;if(!s){this.dragEl[0].style.visibility="hidden"}this.pointEl=e(n.elementFromPoint(r.pageX-n.body.scrollLeft,r.pageY-(t.pageYOffset||n.documentElement.scrollTop)));if(!s){this.dragEl[0].style.visibility="visible"}if(this.pointEl.hasClass(l.handleClass)){this.pointEl=this.pointEl.parent(l.itemNodeName)}if(this.pointEl.hasClass(l.emptyClass)){p=true}else if(!this.pointEl.length||!this.pointEl.hasClass(l.itemClass)){return}var d=this.pointEl.closest("."+l.rootClass),v=this.dragRootEl.data("nestable-id")!==d.data("nestable-id");if(!c.dirAx||v||p){if(v&&l.group!==d.data("nestable-group")){return}f=this.dragDepth-1+this.pointEl.parents(l.listNodeName).length;if(f>l.maxDepth){return}var m=r.pageY')}if(v){this.dragRootEl=d;this.hasNewRoot=this.el[0]!==this.dragRootEl[0]}}}};e.fn.nestable=function(t){var n=this,r=this;n.each(function(){var n=e(this).data("nestable");if(!n){e(this).data("nestable",new l(this,t));e(this).data("nestable-id",(new Date).getTime())}else{if(typeof t==="string"&&typeof n[t]==="function"){r=n[t]()}}});return r||n}})(window.jQuery||window.Zepto,window,document) -------------------------------------------------------------------------------- /static/template/js/jquery.popupoverlay.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Popup Overlay 3 | * 4 | * @version 1.6.0 5 | * @requires jQuery v1.7.1+ 6 | * @link http://vast-engineering.github.com/jquery-popup-overlay/ 7 | */ 8 | 9 | !function(t){var e,i=t(window),o={},n=[],a=[],s=!1,p=!1,l=null,d=null,c=null,r=null,u="_open",f="_close",h=null,v={_init:function(e){var i=t(e),o=i.data("popupoptions");a[e.id]=!1,n[e.id]=0,i.data("popup-initialized")||(i.attr("data-popup-initialized","true"),v._initonce(e)),o.autoopen&&setTimeout(function(){v.show(e,0)},0)},_initonce:function(i){var o,n=t("body"),a=$el.data("popupoptions");if(r=parseInt(n.css("margin-right"),10),"tooltip"==a.type&&(a.background=!1,a.scrolllock=!1),a.scrolllock){var s,p;"undefined"==typeof e&&(s=t('
').appendTo("body"),p=s.children(),e=p.innerWidth()-p.height(99).innerWidth(),s.remove())}if($el.attr("id")||$el.attr("id","j-popup-"+parseInt(1e8*Math.random())),$el.addClass("popup_content"),n.prepend(i),$el.wrap('