diff --git a/2016-course-DB-master/Lib/.idea/Lib.iml b/2016-course-DB-master/Lib/.idea/Lib.iml new file mode 100644 index 0000000..c416296 --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/Lib.iml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/.idea/dataSources.local.xml b/2016-course-DB-master/Lib/.idea/dataSources.local.xml new file mode 100644 index 0000000..09430b7 --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/dataSources.local.xml @@ -0,0 +1,13 @@ + + + + + + " + + + false + *:@ + + + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/.idea/dataSources.xml b/2016-course-DB-master/Lib/.idea/dataSources.xml new file mode 100644 index 0000000..f3fc86d --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/dataSources.xml @@ -0,0 +1,16 @@ + + + + + sqlite.xerial + true + true + $PROJECT_DIR$/Lib/settings.py + org.sqlite.JDBC + jdbc:sqlite:E:\study\项目\Django-Projects\2016-course-DB-master\Lib\db.sqlite3 + + + + + + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/.idea/dataSources/c4e431f8-0777-4d22-ab99-4a988603b107.xml b/2016-course-DB-master/Lib/.idea/dataSources/c4e431f8-0777-4d22-ab99-4a988603b107.xml new file mode 100644 index 0000000..8cfd954 --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/dataSources/c4e431f8-0777-4d22-ab99-4a988603b107.xml @@ -0,0 +1,782 @@ + + + + + 3.25.1 + + + 1 + 1 + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 +
+ + 1 +
+ + 1 + integer|0s + 1 + 1 + + + 2 + varchar(80)|0s + 1 + + + 1 + name + + 1 + + + id + 1 + + + name + sqlite_autoindex_auth_group_1 + + + 1 + integer|0s + 1 + 1 + + + 2 + integer|0s + 1 + + + 3 + integer|0s + 1 + + + 1 + group_id +permission_id + + 1 + + + group_id + + + + permission_id + + + + id + 1 + + + group_id +permission_id + sqlite_autoindex_auth_group_permissions_1 + + + group_id + auth_group + id + + + permission_id + auth_permission + id + + + 1 + integer|0s + 1 + 1 + + + 2 + varchar(50)|0s + 1 + + + 3 + integer|0s + 1 + + + 4 + varchar(100)|0s + 1 + + + 1 + content_type_id +codename + + 1 + + + content_type_id + + + + id + 1 + + + content_type_id +codename + sqlite_autoindex_auth_permission_1 + + + content_type_id + django_content_type + id + + + 1 + integer|0s + 1 + 1 + + + 2 + varchar(128)|0s + 1 + + + 3 + datetime|0s + 1 + + + 4 + bool|0s + 1 + + + 5 + varchar(30)|0s + 1 + + + 6 + varchar(30)|0s + 1 + + + 7 + varchar(30)|0s + 1 + + + 8 + varchar(75)|0s + 1 + + + 9 + bool|0s + 1 + + + 10 + bool|0s + 1 + + + 11 + datetime|0s + 1 + + + 1 + username + + 1 + + + id + 1 + + + username + sqlite_autoindex_auth_user_1 + + + 1 + integer|0s + 1 + 1 + + + 2 + integer|0s + 1 + + + 3 + integer|0s + 1 + + + 1 + user_id +group_id + + 1 + + + user_id + + + + group_id + + + + id + 1 + + + user_id +group_id + sqlite_autoindex_auth_user_groups_1 + + + user_id + auth_user + id + + + group_id + auth_group + id + + + 1 + integer|0s + 1 + 1 + + + 2 + integer|0s + 1 + + + 3 + integer|0s + 1 + + + 1 + user_id +permission_id + + 1 + + + user_id + + + + permission_id + + + + id + 1 + + + user_id +permission_id + sqlite_autoindex_auth_user_user_permissions_1 + + + user_id + auth_user + id + + + permission_id + auth_permission + id + + + 1 + integer|0s + 1 + 1 + + + 2 + datetime|0s + 1 + + + 3 + text|0s + + + 4 + varchar(200)|0s + 1 + + + 5 + smallint unsigned|0s + 1 + + + 6 + text|0s + 1 + + + 7 + integer|0s + + + 8 + integer|0s + 1 + + + content_type_id + + + + user_id + + + + id + 1 + + + content_type_id + django_content_type + id + + + user_id + auth_user + id + + + 1 + integer|0s + 1 + 1 + + + 2 + varchar(100)|0s + 1 + + + 3 + varchar(100)|0s + 1 + + + 4 + varchar(100)|0s + 1 + + + 1 + app_label +model + + 1 + + + id + 1 + + + app_label +model + sqlite_autoindex_django_content_type_1 + + + 1 + integer|0s + 1 + 1 + + + 2 + varchar(255)|0s + 1 + + + 3 + varchar(255)|0s + 1 + + + 4 + datetime|0s + 1 + + + id + 1 + + + 1 + varchar(40)|0s + 1 + + + 2 + text|0s + 1 + + + 3 + datetime|0s + 1 + + + 1 + session_key + + 1 + + + expire_date + + + + session_key + 1 + sqlite_autoindex_django_session_1 + + + 1 + integer|0s + 1 + 1 + + + 2 + integer|0s + 1 + + + 3 + varchar(40)|0s + 1 + + + 4 + integer|0s + 1 + + + bookId_id + + + + staffId_id + + + + id + 1 + + + bookId_id + main_book + bookId + + + staffId_id + main_staffinfo + id + + + 1 + varchar(40)|0s + 1 + + + 2 + varchar(40)|0s + 1 + + + 3 + varchar(40)|0s + 1 + + + 4 + varchar(50)|0s + 1 + + + 5 + text|0s + 1 + + + 6 + integer|0s + 1 + + + 7 + integer|0s + 1 + + + 1 + bookId + + 1 + + + bookType_id + + + + bookId + 1 + sqlite_autoindex_main_book_1 + + + bookType_id + main_booktype + TypeNum + + + 1 + integer|0s + 1 + 1 + + + 2 + integer|0s + 1 + + + 3 + varchar(40)|0s + 1 + + + bookId_id + + + + id + 1 + + + bookId_id + main_book + bookId + + + 1 + integer|0s + 1 + + + 2 + varchar(20)|0s + 1 + + + TypeNum + 1 + + + 1 + integer|0s + 1 + + + 2 + bool|0s + 1 + + + 3 + varchar(40)|0s + 1 + + + 4 + integer|0s + 1 + + + 5 + integer|0s + 1 + + + bookId_id + + + + staffId_id + + + + userId_id + + + + borrowItemId + 1 + + + bookId_id + main_book + bookId + + + staffId_id + main_staffinfo + id + + + userId_id + main_userinfo + id + + + 1 + integer|0s + 1 + 1 + + + 2 + varchar(30)|0s + 1 + + + 3 + integer|0s + 1 + + + staffId_id + + + + id + 1 + + + staffId_id + auth_user + id + + + 1 + integer|0s + 1 + 1 + + + 2 + varchar(25)|0s + 1 + + + 3 + bool|0s + 1 + + + 4 + integer|0s + 1 + + + 5 + varchar(12)|0s + + + 6 + date|0s + 1 + + + 7 + integer|0s + 1 + + + userId_id + + + + id + 1 + + + userId_id + auth_user + id + + + 1 + text|0s + + + 2 + text|0s + + + 3 + text|0s + + + 4 + int|0s + + + 5 + text|0s + + + 1 + + + 2 + +
+
\ No newline at end of file diff --git a/2016-course-DB-master/Lib/.idea/misc.xml b/2016-course-DB-master/Lib/.idea/misc.xml new file mode 100644 index 0000000..8656114 --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/.idea/modules.xml b/2016-course-DB-master/Lib/.idea/modules.xml new file mode 100644 index 0000000..9244eec --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/.idea/vcs.xml b/2016-course-DB-master/Lib/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/.idea/workspace.xml b/2016-course-DB-master/Lib/.idea/workspace.xml new file mode 100644 index 0000000..f90352f --- /dev/null +++ b/2016-course-DB-master/Lib/.idea/workspace.xml @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1594695714059 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/Lib/__init__.py b/2016-course-DB-master/Lib/Lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/2016-course-DB-master/Lib/Lib/settings.py b/2016-course-DB-master/Lib/Lib/settings.py new file mode 100644 index 0000000..6448c00 --- /dev/null +++ b/2016-course-DB-master/Lib/Lib/settings.py @@ -0,0 +1,116 @@ +""" +Django settings for Lib project. + +For more information on this file, see +https://docs.djangoproject.com/en/1.7/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.7/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os +BASE_DIR = os.path.dirname(os.path.dirname(__file__)) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '3^y=5xuy(%igotz@mkpl$xn&7c*nrxt=*am#lpf_(@!iw1c+g%' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +TEMPLATE_DEBUG = True + +ALLOWED_HOSTS = [] +CONTEXT_PROCESSORS = [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', +] +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': {'context_processors': CONTEXT_PROCESSORS, }, + }, + { + 'BACKEND': 'django.template.backends.jinja2.Jinja2' + , + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': CONTEXT_PROCESSORS, + 'environment': '存放路径.env.environment' + }, + }, +] +# Application definition + +INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + "main", +) + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +) + +ROOT_URLCONF = 'Lib.urls' + +WSGI_APPLICATION = 'Lib.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.7/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + +# Internationalization +# https://docs.djangoproject.com/en/1.7/topics/i18n/ + +LANGUAGE_CODE = 'zh_Hans' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.7/howto/static-files/ + +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR,"collected_static") +STATICFILES_DIRS = ( + os.path.join(BASE_DIR,"common_static"), + 'path/to/others/static/', +) + +SESSION_SAVE_EVERY_REQUEST = True +SESSION_EXPIRE_AT_BROWSER_CLOSE = True \ No newline at end of file diff --git a/2016-course-DB-master/Lib/Lib/urls.py b/2016-course-DB-master/Lib/Lib/urls.py new file mode 100644 index 0000000..5483246 --- /dev/null +++ b/2016-course-DB-master/Lib/Lib/urls.py @@ -0,0 +1,23 @@ +from django.conf.urls import include, url +from django.contrib import admin +import main.views +urlpatterns = [ + + url(r'^admin/', admin.site.urls), + url(r'^loginView/',main.views.loginView,name="loginView"), + url(r'^registView/',main.views.registView,name="registView"), + url(r'^logoutView/',main.views.logoutView,name="logoutView"), + url(r'^userBorrowedBook/',main.views.userBorrowedBook,name="userBorrowedBook"), + url(r'^staffAddBookNum/',main.views.staffAddBookNum,name="staffAddBookNum"), + url(r'^staffCreateBook/',main.views.staffCreateBook,name="staffCreateBook"), + url(r'^viewBook/',main.views.viewBook,name="viewBook"), + url(r'^main/',main.views.main,name="main"), + url(r'^regist/',main.views.regist,name="regist"), + url(r'^login/',main.views.login,name="login"), + url(r'^staffBorrowUserBook/',main.views.staffBorrowUserBook,name="staffBorrowUserBook"), + url(r'^staffReturnUserBook/',main.views.staffReturnUserBook,name="staffReturnUserBook"), + url(r'^staffChangeBookInfo/',main.views.staffChangeBookInfo,name="staffChangeBookInfo"), + url(r'^getTypeOptions/',main.views.getTypeOptions,name="getTypeOptions"), + url(r'^staffViewUser/',main.views.staffViewUser,name='staffViewUser'), + url(r'^staffViewUserDetail/',main.views.staffViewUserDetail,name="staffViewUserDetail"), +] diff --git a/2016-course-DB-master/Lib/Lib/wsgi.py b/2016-course-DB-master/Lib/Lib/wsgi.py new file mode 100644 index 0000000..50196b1 --- /dev/null +++ b/2016-course-DB-master/Lib/Lib/wsgi.py @@ -0,0 +1,14 @@ +""" +WSGI config for Lib project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/ +""" + +import os +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Lib.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() diff --git a/2016-course-DB-master/Lib/db.sqlite3 b/2016-course-DB-master/Lib/db.sqlite3 new file mode 100644 index 0000000..0c24d08 Binary files /dev/null and b/2016-course-DB-master/Lib/db.sqlite3 differ diff --git a/2016-course-DB-master/Lib/main/__init__.py b/2016-course-DB-master/Lib/main/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/2016-course-DB-master/Lib/main/admin.py b/2016-course-DB-master/Lib/main/admin.py new file mode 100644 index 0000000..5a3ac01 --- /dev/null +++ b/2016-course-DB-master/Lib/main/admin.py @@ -0,0 +1,12 @@ +from django.contrib import admin + +# Register your models here. +from .models import Book,BookType,BookNum,AddItem,BorrowItem,UserInfo,StaffInfo + +admin.site.register(Book) +admin.site.register(BookType) +admin.site.register(BookNum) +admin.site.register(AddItem) +admin.site.register(BorrowItem) +admin.site.register(UserInfo) +admin.site.register(StaffInfo) \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/migrations/0001_initial.py b/2016-course-DB-master/Lib/main/migrations/0001_initial.py new file mode 100644 index 0000000..faafb39 --- /dev/null +++ b/2016-course-DB-master/Lib/main/migrations/0001_initial.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='AddItem', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('addNum', models.IntegerField()), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Book', + fields=[ + ('bookId', models.CharField(max_length=40, serialize=False, primary_key=True)), + ('bookName', models.CharField(max_length=40)), + ('bookPublisher', models.CharField(max_length=40)), + ('bookAuthor', models.CharField(max_length=50)), + ('bookIntroduction', models.TextField()), + ('bookPrice', models.IntegerField()), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BookNum', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('bookNum', models.IntegerField()), + ('bookId', models.ForeignKey(to='main.Book')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BookType', + fields=[ + ('TypeNum', models.IntegerField(serialize=False, primary_key=True)), + ('TypeName', models.CharField(max_length=20)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BorrowItem', + fields=[ + ('borrowItemId', models.IntegerField(serialize=False, primary_key=True)), + ('hasReturned', models.BooleanField(default=False)), + ('bookId', models.ForeignKey(to='main.Book')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='StaffInfo', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('staffName', models.CharField(max_length=30)), + ('staffId', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='UserInfo', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('userName', models.CharField(max_length=25)), + ('userSex', models.BooleanField(default=True)), + ('userAge', models.IntegerField()), + ('userPhoneNum', models.CharField(max_length=12, null=True, blank=True)), + ('userRegistTime', models.DateField(auto_now_add=True)), + ('userId', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='borrowitem', + name='staffId', + field=models.ForeignKey(to='main.StaffInfo'), + preserve_default=True, + ), + migrations.AddField( + model_name='borrowitem', + name='userId', + field=models.ForeignKey(to='main.UserInfo'), + preserve_default=True, + ), + migrations.AddField( + model_name='book', + name='bookType', + field=models.ForeignKey(to='main.BookType'), + preserve_default=True, + ), + migrations.AddField( + model_name='additem', + name='bookId', + field=models.ForeignKey(to='main.Book'), + preserve_default=True, + ), + migrations.AddField( + model_name='additem', + name='staffId', + field=models.ForeignKey(to='main.StaffInfo'), + preserve_default=True, + ), + ] diff --git a/2016-course-DB-master/Lib/main/migrations/__init__.py b/2016-course-DB-master/Lib/main/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/2016-course-DB-master/Lib/main/models.py b/2016-course-DB-master/Lib/main/models.py new file mode 100644 index 0000000..1b4312d --- /dev/null +++ b/2016-course-DB-master/Lib/main/models.py @@ -0,0 +1,58 @@ +from django.db import models +from django.contrib.auth.models import User as authModel + +# Create your models here. +class BookType(models.Model): + TypeNum = models.IntegerField(primary_key=True) + TypeName = models.CharField(max_length=20) + def __unicode__(self): + return '%s' % (self.TypeName) + +class Book(models.Model): + bookId = models.CharField(max_length = 40,primary_key= True) + bookName = models.CharField(max_length=40) + bookType = models.ForeignKey(BookType,on_delete=models.CASCADE) + bookPublisher = models.CharField(max_length=40) + bookAuthor = models.CharField(max_length=50) + bookIntroduction = models.TextField() + bookPrice = models.IntegerField() + def __unicode__(self): + return '%s' % (self.bookName) + +class BookNum(models.Model): + bookId = models.ForeignKey(Book,on_delete=models.CASCADE) + bookNum = models.IntegerField() + def __unicode__(self): + return '%s' % (self.bookId.bookName) + +class StaffInfo(models.Model): + staffId = models.ForeignKey(authModel,on_delete=models.CASCADE) + staffName = models.CharField(max_length = 30) + def __unicode__(self): + return '%s' % (self.staffName) + +class AddItem(models.Model): + bookId = models.ForeignKey(Book,on_delete=models.CASCADE) + staffId = models.ForeignKey(StaffInfo,on_delete=models.CASCADE) + addNum = models.IntegerField() + def __unicode__(self): + return '%s' % (self.bookId.bookName) + +class UserInfo(models.Model): + userId = models.ForeignKey(authModel,on_delete=models.CASCADE) + userName = models.CharField(max_length=25) + userSex = models.BooleanField(default = True) + userAge = models.IntegerField() + userPhoneNum = models.CharField(max_length=12,null=True,blank=True) + userRegistTime = models.DateField(auto_now_add=True) + def __unicode__(self): + return '%s' % (self.userName) + +class BorrowItem(models.Model): + borrowItemId = models.IntegerField(primary_key = True) + bookId = models.ForeignKey(Book,on_delete=models.CASCADE) + staffId = models.ForeignKey(StaffInfo,on_delete=models.CASCADE) + userId = models.ForeignKey(UserInfo,on_delete=models.CASCADE) + hasReturned = models.BooleanField(default = False) + def __unicode__(self): + return '%s' % (self.borrowItemId) \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/css/indexStaff.css b/2016-course-DB-master/Lib/main/static/css/indexStaff.css new file mode 100644 index 0000000..a715a34 --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/css/indexStaff.css @@ -0,0 +1,209 @@ +body{ + font-family: 'Microsoft YaHei',sans-serif; + position: relative; + margin:0px; + background-color: #092B40; +} +button{ + font-family: 'Microsoft YaHei',sans-serif; + cursor: pointer; +} +.fail{ + color:red; +} +.success{ + color:green; +} +.hid{ + visibility: hidden; +} +.fontBlue{ + color:#092B40; +} +.fontOrange{ + color:#FF7F00; +} +.fontWhite{ + color:#EBEBEB; +} +.backBlue{ + background-color:#092B40; +} +.backOrange{ + background-color: #FF7F00; +} +.backWhite{ + background-color: #EBEBEB; +} +.nav{ + width: 100%; + height:50px; + line-height: 50px; + font-size: 19px; + position:fixed; + background-color: rgba(135,135,135,0.5); + margin: 0px; + top:0px; + left:0px; + padding-left: 400px; + z-index: 100; +} +.bookLib{ + display: inline-block; + margin:0px; + padding:0px; + height:50px; + padding:0px 10px; + line-height: 50px; + text-decoration: none; + color:white; +} +.bookLib:hover{ + background-color: #EEEEE0; + color:#4D4D4D; +} +.container{ + width:1200px; + padding:50px; + margin:0px auto; + overflow: hidden; + position: relative; +} +.fullPage{ + background-color: #EBEBEB; + width:100%; + height:600px; + margin-bottom: 20px; + overflow: hidden; +} +.two{ + width:540px; + margin:10px; + float: left; + overflow: hidden; + height:550px; + padding: 30px 0px 0px 30px; +} +.one{ + width:1120px; + margin:10px; + float: left; + overflow: hidden; + height:550px; + padding: 30px 0px 0px 30px; +} +.line{ + margin: 10px 0px; + font-size: 20px; +} +.line>span{ + display:inline-block; + width: 120px; +} +.line>input{ + border: solid 2px #092B40; + padding: 3px 8px; +} +.line>select{ + border: solid 2px #092B40; + margin-left: 0px; + padding: 3px 8px; + width:189px; +} +.line>select:focus{ + border: solid 2px #092B40; + margin-left: 0px; + padding: 3px 8px; + width:189px; + outline: none +} +.Btn{ + outline: none; + background-color: #EBEBEB; + border: solid 2px #092B40; + padding: 5px 8px; + font-size: 18px; +} +.Btn:hover{ + background-color: #092B40; + border: solid 2px #FF7F00; + color:#EBEBEB; +} +h1{ + margin: 0px; +} +input{ + outline: none; + +} +.currentUser{ + position:fixed; + top:300px; + left:100px; + padding: 20px 20px 10px 20px; + background-color: #EBEBEB; +} +.currentUser>div>a{ + width: 50px; + text-align: center; + display:block; + margin:5px auto; + text-decoration:none; + padding:5px 8px; + background-color:#092B40; + color:#EBEBEB; +} +.container{ + width:1200px; + padding:50px; + margin:0px auto; + overflow: hidden; + position: relative; +} +.templateUserContainer{ + padding:15px 30px; +} +.userItem{ + margin-top: 20px; + display: block; + text-decoration: none; + color:black; + padding: 10px 30px; + background-color: rgba(9,43,64,0.3); +} +.userItem:hover{ + background-color: #092B40; + color:#EBEBEB; + border-style: none none none solid; + border-width: 5px; + border-color: #FF7F00; +} +.pageList{ + margin-top: 30px; + padding-left: 30px; +} +.pageBtn{ + outline: none; + border: none; + background-color:#EBEBEB; + text-align: center; + min-width: 15px; + padding: 0px 10px; + margin-right: 2px; + line-height: 30px; + height:30px; + font-size: 15px; + display: inline-block; + color:#092B40; + text-decoration: none; +} +.pageBtn:hover{ + color: #EBEBEB; + background-color: #092B40; + border-radius: 3px; +} +.active{ + color: #EBEBEB !important; + background-color: #092B40 !important; + border-radius: 3px !important ; +} \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/css/library.css b/2016-course-DB-master/Lib/main/static/css/library.css new file mode 100644 index 0000000..a14b728 --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/css/library.css @@ -0,0 +1,169 @@ +body{ + font-family: 'Microsoft YaHei',sans-serif; + position: relative; + margin:0px; + background-color: #092B40; +} +.fail{ + color:red; +} +.success{ + color:green; +} +.hid{ + visibility: hidden; +} +.chosen{ + visibility: visible !important; +} +.nav{ + width: 100%; + height:50px; + line-height: 50px; + font-size: 19px; + position:fixed; + background-color: rgba(135,135,135,0.5); + margin: 0px; + top:0px; + left:0px; + padding-left: 400px; + z-index: 100; +} +.currentUser{ + position:fixed; + top:300px; + left:100px; + padding: 20px 20px 10px 20px; + background-color: #EBEBEB; +} +.currentUser>div>a{ + width: 50px; + text-align: center; + display:block; + margin:5px auto; + text-decoration:none; + padding:5px 8px; + background-color:#092B40; + color:#EBEBEB; +} +.container{ + width:1200px; + padding:50px; + margin:0px auto; + overflow: hidden; + position: relative; +} +.bookLib{ + display: inline-block; + margin:0px; + padding:0px; + height:50px; + padding:0px 10px; + line-height: 50px; + text-decoration: none; + color:white; +} +.bookLib:hover{ + background-color: #EEEEE0; + color:#4D4D4D; +} +.searchArea{ + margin-top: 30px; + float:right; +} +.searchArea>button{ + border:solid 4px #FF7F00; + border-radius: 5px; + background-color: #6495ED; + color:white; + padding:5px 10px; + font-size: 1.3em; + color: white; + background-color: #092B40; + cursor: pointer; +} +.searchArea>input{ + border:solid 3px #FF7F00; + border-radius: 10px; + height:33px; + padding: 2px 10px; + line-height: 33px; + font-size: 1.3em; + margin-right: 5px; + outline: none; + color: white; + background-color: #092B40; +} +.bookList{ + clear: both; + position: relative; + top:20px; + width: 1010px; + margin:0px auto; + z-index: 10; +} +.bookName{ + font-size: 20px; +} +.bookType,.bookPublisher,.bookAuthor,.bookPrice,.bookNum{ + font-size: 17px; +} +.intro{ + font-size: 15px; + color:gray; +} +.book{ + width:1010px; + height:120px; + margin-bottom: 10px; + cursor: pointer; +} +.hover{ + background-color: #FF7F00; + width:10px; + float:left; + height:120px; +} +.bookMain{ + float: left; + width:980px; + padding-left:20px; + background-color: #EBEBEB; +} +.bookDetail{ + width:800px; + background-color:#D9D9D9; + margin:-10px auto 0px auto; +} +.pageListBox{ + left:10px; + top: 20px; + position: relative; + width: 1010px; + margin:10px auto; + color:#EBEBEB; +} +.pageBtn{ + text-align: center; + min-width: 15px; + padding: 0px 10px; + margin-right: 2px; + line-height: 30px; + height:30px; + font-size: 15px; + display: inline-block; + border: solid 2px #EBEBEB; + border-radius: 5px; + color:#EBEBEB; + text-decoration: none; +} +.pageBtn:hover{ + color: #092B40; + background-color: #EBEBEB; + border: solid 2px #FF7F00; +} +.active{ + color: #092B40 !important ; + background-color: #EBEBEB !important ; + border: solid 2px #FF7F00 !important ; +} \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/css/login.css b/2016-course-DB-master/Lib/main/static/css/login.css new file mode 100644 index 0000000..f2e1ea2 --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/css/login.css @@ -0,0 +1,54 @@ +body{ + font-family: 'Microsoft YaHei',sans-serif; +} +.fail{ + color:red; +} +.success{ + color:green; +} +.container{ + width:400px; + margin:300px auto; +} +.inputArea{ + color:#aaa; + width:388px; + display: inline-block; + border:solid 1px #ddd; + border-radius: 2px; + font-size: 14px; + outline: none; + padding: 10px 0px 10px 10px; + margin:15px 0px 15px 0px; +} +.btn{ + height: 38px; + width:184px; + outline: none; + margin-top: 10px; + float:left; + font-size: 14px; + display: inline-block; + text-align: center; + text-decoration: none; + line-height:38px; +} +.loginBtn{ + border: 1px solid #0381AA; + background-color: #00A7DE; + color:white; + cursor:pointer; +} +.loginBtn:hover{ + background-color: #00a1d6;\ +} +.registBtn{ + margin-left: 28px; + color: #555; + border: 1px solid #ccc; +} +.registBtn:hover{ + background-color: gray; + color:white; +} \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/css/logout.css b/2016-course-DB-master/Lib/main/static/css/logout.css new file mode 100644 index 0000000..f4fb7b8 --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/css/logout.css @@ -0,0 +1,14 @@ +body{ + font-family: 'Microsoft YaHei',sans-serif; + position: relative; + margin:0px; + background-color: #092B40; +} +.container{ + width:1200px; + padding:50px; + margin:400px auto; + overflow: hidden; + color:#EBEBEB; + text-align: center; +} \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/css/regist.css b/2016-course-DB-master/Lib/main/static/css/regist.css new file mode 100644 index 0000000..01864a4 --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/css/regist.css @@ -0,0 +1,54 @@ +body{ + font-family: 'Microsoft YaHei',sans-serif; +} +.fail{ + color:red; +} +.success{ + color:green; +} +.container{ + width:400px; + margin:100px auto; +} +.inputArea{ + color:#aaa; + width:388px; + display: inline-block; + border:solid 1px #ddd; + border-radius: 2px; + font-size: 14px; + outline: none; + padding: 10px 0px 10px 10px; + margin:15px 0px 15px 0px; +} +.btn{ + height: 38px; + width:184px; + outline: none; + margin-top: 10px; + float:left; + font-size: 14px; + display: inline-block; + text-align: center; + text-decoration: none; + line-height:38px; +} +.registBtn{ + border: 1px solid #0381AA; + background-color: #00A7DE; + color:white; + cursor:pointer; +} +.registBtn:hover{ + background-color: #00a1d6;\ +} +.backBtn{ + margin-left: 28px; + color: #555; + border: 1px solid #ccc; +} +.backBtn:hover{ + background-color: gray; + color:white; +} \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/css/userDetail.css b/2016-course-DB-master/Lib/main/static/css/userDetail.css new file mode 100644 index 0000000..c5ce20c --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/css/userDetail.css @@ -0,0 +1,107 @@ +body{ + font-family: 'Microsoft YaHei',sans-serif; + position: relative; + margin:0px; + background-color: #092B40; +} +button{ + font-family: 'Microsoft YaHei',sans-serif; + cursor: pointer; +} +.fail{ + color:red; +} +.success{ + color:green; +} +.hid{ + visibility: hidden; +} +.fontBlue{ + color:#092B40; +} +.fontOrange{ + color:#FF7F00; +} +.fontWhite{ + color:#EBEBEB; +} +.backBlue{ + background-color:#092B40; +} +.backOrange{ + background-color: #FF7F00; +} +.backWhite{ + background-color: #EBEBEB; +} +.nav{ + width: 100%; + height:50px; + line-height: 50px; + font-size: 19px; + position:fixed; + background-color: rgba(135,135,135,0.5); + margin: 0px; + top:0px; + left:0px; + padding-left: 400px; + z-index: 100; +} +.bookLib{ + display: inline-block; + margin:0px; + padding:0px; + height:50px; + padding:0px 10px; + line-height: 50px; + text-decoration: none; + color:white; +} +.bookLib:hover{ + background-color: #EEEEE0; + color:#4D4D4D; +} +.currentUser{ + position:fixed; + top:300px; + left:100px; + padding: 20px 20px 10px 20px; + background-color: #EBEBEB; +} +.currentUser>div>a{ + width: 50px; + text-align: center; + display:block; + margin:5px auto; + text-decoration:none; + padding:5px 8px; + background-color:#092B40; + color:#EBEBEB; +} +.container{ + width:1200px; + padding:50px; + margin:0px auto; + overflow: hidden; + position: relative; +} +.userInfoContainer{ + padding: 50px; +} +.infoItem{ + height:30px; + line-height: 30px; + display: block; +} +.infoBefore{ + text-align: center; + display: inline-block; + width: 90px; +} +.borrowTable{ + width: 1000px; +} +.borrowTable td{ + text-align: center; +} \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/scripts/csrf.js b/2016-course-DB-master/Lib/main/static/scripts/csrf.js new file mode 100644 index 0000000..a9a8a3e --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/scripts/csrf.js @@ -0,0 +1,36 @@ +jQuery(document).ajaxSend(function(event, xhr, settings) { + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + function sameOrigin(url) { + // url could be relative or scheme relative or absolute + var host = document.location.host; // host + port + var protocol = document.location.protocol; + var sr_origin = '//' + host; + var origin = protocol + sr_origin; + // Allow absolute or scheme relative URLs to same origin + return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || + (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || + // or any other URL that isn't scheme relative or absolute i.e relative. + !(/^(\/\/|http:|https:).*/.test(url)); + } + function safeMethod(method) { + return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); + } + + if (!safeMethod(settings.type) && sameOrigin(settings.url)) { + xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); + } +}); \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/scripts/indexStaff.js b/2016-course-DB-master/Lib/main/static/scripts/indexStaff.js new file mode 100644 index 0000000..62608a2 --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/scripts/indexStaff.js @@ -0,0 +1,182 @@ +function initUserScan(userName,Page){ + $('#startPage').val(Page); + var userHtml = '',pageHtml = ''; + var username = userName; + var offset = $('#offset').val(),startPage = Page; + $.get('/staffViewUser', + {'username':username, + 'offset':offset, + 'startPage':startPage}, + function(data) { + //console.log(data); + for(var i=0;i'+ + '
'+userItem.userid+'   '+userItem.username+'
' + +'
'+userItem.userage+'
' + +''; + } + $('.templateUserContainer').html(userHtml); + + if(startPage!=1){pageHtml = '';} + for(var i=0;i'; + else pageHtml += ''; + } + if(startPage != data.pageList[data.pageList.length-1]) pageHtml += ''; + $('.pageList').html(pageHtml); + $('.pageBtn').click(function(event) { + //var targetPage = $(this).text(); + //startPage = $('#startPage').val(targetPage); + if($(this).hasClass('next')){ + targetPage = parseInt($('#startPage').val())+1; + } + else if($(this).hasClass('prev')){ + targetPage = parseInt($('#startPage').val())-1; + } + else{ + targetPage = $(this).text(); + } + initUserScan($('#changeUserName').val(),targetPage); + }); + }); +} +initUserScan('',1); +$(document).ready(function(){ + var typeOptions = []; + $.get('/getTypeOptions', function(data) { + typeOptions = data; + //console.log(typeOptions); + }); + $('.changeUserBtnCheck').click(function(event) { + initUserScan($('#changeUserName').val(),1); + }); + $('.returnBtnCheck').click(function(event) { + var bookid=$('#returnBookid').val(); + var userid=$('#returnUserid').val(); + $.get('/staffReturnUserBook',{"bookid":bookid,"userid":userid},function(data) { + $('.returnBookMsg').removeClass('success').removeClass('fail').text(""); + bookid=$('#returnBookid').val(""); + userid=$('#returnUserid').val(""); + if(data.end){ + $('.returnBookMsg').addClass('success').text("还书成功!"); + } + else{ + $('.returnBookMsg').addClass('fail').text("还书失败!请重新操作"); + } + }); + }); + $('.borrowBtnCheck').click(function(event) { + var bookid=$('#borrowBookid').val(); + var userid=$('#borrowUserid').val(); + console.log(bookid+userid); + $.get('/staffBorrowUserBook',{"bookid":bookid,"userid":userid},function(data) { + $('.borrowBookMsg').removeClass('success').removeClass('fail').text(""); + $('#borrowBookid').val(""); + $('#borrowUserid').val(""); + if(data.end){ + $('.borrowBookMsg').addClass('success').text("借书成功!"); + } + else{ + $('.borrowBookMsg').addClass('fail').text("借书失败!请重新操作"); + } + }); + }); + $('.createBtnCheck').click(function(event){ + var bookid = $('#createBookId').val(); + var bookname = $('#createBookName').val(); + var booktype = $('#createBookType').val(); + var bookpub = $('#createBookPub').val(); + var bookauthor = $('#createBookAuthor').val(); + var bookintro = $('#createBookIntro').val(); + var bookprice = $('#createBookPrice').val(); + var booknum = $('#createBookNum').val(); + $.get('/staffCreateBook', + {"bookid":bookid, + "bookname":bookname, + "booktype":booktype, + "bookpublisher":bookpub, + "bookauthor":bookauthor, + "bookintroduction":bookintro, + "bookprice":bookprice, + "booknum":booknum},function(data) { + console.log(data); + }); + }); + $('.addBtnCheck').click(function(event) { + var bookid = $('#addBookId').val(); + var addnum = $('#addBookNum').val(); + $.get('/staffAddBookNum',{"bookid":bookid,"addBookNum":addnum},function(data) { + console.log(data); + }); + }); + $('.changeBookBtnCheck').click(function(event) { + var template =''; + var bookid = $('#changeBookId').val(); + $.get('/viewBook',{"mode":"Detail","startPage":0,"offset":10,"bookLikeName":bookid},function(data) { + optionTemplate = ''; + for(var i=0;i'+option.optionName+'' + } + else optionTemplate+='' + } + console.log(data); + template+= ''+ + '
'+ + '图书名称:'+ + '
'+ + '
'+ + '图书类型:'+ + ''+ + '
'+ + '
'+ + '作者:'+ + '
'+ + '
'+ + '出版社:'+ + '
'+ + '
'+ + '简介:'+ + '
'+ + '
'+ + '价格:'+ + '
'+ + '
'+ + '库存:'+ + '
'; + $('.templateBookContainer').html(template); + $('.changeBookBtnSubmit').removeClass('hid'); + }); + }); + $('.changeBookBtnSubmit').click(function(event) { + var bookid = $('.changeBookId').val(); + var bookname = $('.changeBookName').val(); + var booktype = $('.changeBookType').val(); + var bookauthor = $('.changeBookAuthor').val(); + var bookpublisher = $('.changeBookPublisher').val(); + var bookintro = $('.changeBookIntro').val(); + var bookprice = $('.changeBookPrice').val(); + var booknum = $('.changeBookNum').val(); + $.get('/staffChangeBookInfo', + {"bookid":bookid, + "bookname":bookname, + "booktype":booktype, + "bookauthor":bookauthor, + "bookpublisher":bookpublisher, + "bookintroduction":bookintro, + "bookprice":bookprice, + "booknum":booknum}, + function(data) { + console.log(data); + }); + }); +}); + \ No newline at end of file diff --git a/2016-course-DB-master/Lib/main/static/scripts/jquery.js b/2016-course-DB-master/Lib/main/static/scripts/jquery.js new file mode 100644 index 0000000..f2fc274 --- /dev/null +++ b/2016-course-DB-master/Lib/main/static/scripts/jquery.js @@ -0,0 +1,10074 @@ +/*eslint-disable no-unused-vars*/ +/*! + * jQuery JavaScript Library v3.1.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2016-07-07T21:44Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.1.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.0 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-01-04 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + // Known :disabled false positives: + // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) + // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Check form elements and option elements for explicit disabling + return "label" in elem && elem.disabled === disabled || + "form" in elem && elem.disabled === disabled || + + // Check non-disabled form elements for fieldset[disabled] ancestors + "form" in elem && elem.disabled === false && ( + // Support: IE6-11+ + // Ancestry is covered for us + elem.isDisabled === disabled || + + // Otherwise, assume any non-