diff --git a/4_blog/.idea/.gitignore b/4_blog/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/4_blog/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/4_blog/.idea/blog.iml b/4_blog/.idea/blog.iml
new file mode 100644
index 0000000..a737045
--- /dev/null
+++ b/4_blog/.idea/blog.iml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4_blog/.idea/misc.xml b/4_blog/.idea/misc.xml
new file mode 100644
index 0000000..db8786c
--- /dev/null
+++ b/4_blog/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4_blog/.idea/modules.xml b/4_blog/.idea/modules.xml
new file mode 100644
index 0000000..e81aaae
--- /dev/null
+++ b/4_blog/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4_blog/blog/__init__.py b/4_blog/blog/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/4_blog/blog/__init__.pyc b/4_blog/blog/__init__.pyc
new file mode 100644
index 0000000..b14bfeb
Binary files /dev/null and b/4_blog/blog/__init__.pyc differ
diff --git a/4_blog/blog/settings.py b/4_blog/blog/settings.py
new file mode 100644
index 0000000..1070fc2
--- /dev/null
+++ b/4_blog/blog/settings.py
@@ -0,0 +1,134 @@
+"""
+Django settings for blog project.
+
+Generated by 'django-admin startproject' using Django 1.11.6.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.11/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/1.11/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+from django.conf import global_settings
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'ry!upfimxiq7+559yq3skd%xc6+7dml(+lmy_n#ylw8!#ub-ld'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'post'
+]
+
+MIDDLEWARE = [
+ 'django.middleware.security.SecurityMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'blog.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [os.path.join(BASE_DIR, 'templates')]
+ ,
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'blog.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.mysql',
+ 'NAME': '180810db',
+ 'USER': 'root',
+ 'PASSWORD': '123456',
+ 'HOST': '127.0.0.1',
+ 'PORT': '3306'
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/1.11/topics/i18n/
+
+LANGUAGE_CODE = 'zh-Hans'
+
+TIME_ZONE = 'Asia/Shanghai'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/1.11/howto/static-files/
+
+STATIC_URL = '/static/'
+
+STATICFILES_DIRS = [
+ os.path.join(BASE_DIR,'static','css')
+]
+
+# global_settings
diff --git a/4_blog/blog/settings.pyc b/4_blog/blog/settings.pyc
new file mode 100644
index 0000000..63cef39
Binary files /dev/null and b/4_blog/blog/settings.pyc differ
diff --git a/4_blog/blog/urls.py b/4_blog/blog/urls.py
new file mode 100644
index 0000000..acf12b5
--- /dev/null
+++ b/4_blog/blog/urls.py
@@ -0,0 +1,22 @@
+"""blog URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/1.11/topics/http/urls/
+Examples:
+Function views
+ 1. Add an import: from my_app import views
+ 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
+Class-based views
+ 1. Add an import: from other_app.views import Home
+ 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
+Including another URLconf
+ 1. Import the include() function: from django.conf.urls import url, include
+ 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
+"""
+from django.conf.urls import url, include
+from django.contrib import admin
+
+urlpatterns = [
+ url(r'^admin/', admin.site.urls),
+ url(r'^', include('post.urls')),
+]
diff --git a/4_blog/blog/urls.pyc b/4_blog/blog/urls.pyc
new file mode 100644
index 0000000..8a7d542
Binary files /dev/null and b/4_blog/blog/urls.pyc differ
diff --git a/4_blog/blog/wsgi.py b/4_blog/blog/wsgi.py
new file mode 100644
index 0000000..bae86cb
--- /dev/null
+++ b/4_blog/blog/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for blog 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.11/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "blog.settings")
+
+application = get_wsgi_application()
diff --git a/4_blog/blog/wsgi.pyc b/4_blog/blog/wsgi.pyc
new file mode 100644
index 0000000..9ed5d0a
Binary files /dev/null and b/4_blog/blog/wsgi.pyc differ
diff --git a/4_blog/db.sqlite3 b/4_blog/db.sqlite3
new file mode 100644
index 0000000..b9d314a
Binary files /dev/null and b/4_blog/db.sqlite3 differ
diff --git a/4_blog/manage.py b/4_blog/manage.py
new file mode 100644
index 0000000..0ea0e80
--- /dev/null
+++ b/4_blog/manage.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "blog.settings")
+ try:
+ from django.core.management import execute_from_command_line
+ except ImportError:
+ # The above import may fail for some other reason. Ensure that the
+ # issue is really that Django is missing to avoid masking other
+ # exceptions on Python 2.
+ try:
+ import django
+ except ImportError:
+ raise ImportError(
+ "Couldn't import Django. Are you sure it's installed and "
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?"
+ )
+ raise
+ execute_from_command_line(sys.argv)
diff --git a/4_blog/post/__init__.py b/4_blog/post/__init__.py
new file mode 100644
index 0000000..e10a4d0
--- /dev/null
+++ b/4_blog/post/__init__.py
@@ -0,0 +1,17 @@
+# coding:utf-8
+
+from django.apps import AppConfig
+import os
+
+default_app_config = 'post.PrimaryBlogConfig'
+
+VERBOSE_APP_NAME = u"博客管理"
+
+
+def get_current_app_name(_file):
+ return os.path.split(os.path.dirname(_file))[-1]
+
+
+class PrimaryBlogConfig(AppConfig):
+ name = get_current_app_name(__file__)
+ verbose_name = VERBOSE_APP_NAME
\ No newline at end of file
diff --git a/4_blog/post/__init__.pyc b/4_blog/post/__init__.pyc
new file mode 100644
index 0000000..0200ba6
Binary files /dev/null and b/4_blog/post/__init__.pyc differ
diff --git a/4_blog/post/__pycache__/models.cpython-312.pyc b/4_blog/post/__pycache__/models.cpython-312.pyc
new file mode 100644
index 0000000..7673573
Binary files /dev/null and b/4_blog/post/__pycache__/models.cpython-312.pyc differ
diff --git a/4_blog/post/admin.py b/4_blog/post/admin.py
new file mode 100644
index 0000000..cc86658
--- /dev/null
+++ b/4_blog/post/admin.py
@@ -0,0 +1,13 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.contrib import admin
+from .models import *
+# Register your models here.
+
+class PostModelAdmin(admin.ModelAdmin):
+ list_display = ('title','created')
+
+admin.site.register(Category)
+admin.site.register(Tag)
+admin.site.register(Post,PostModelAdmin)
\ No newline at end of file
diff --git a/4_blog/post/admin.pyc b/4_blog/post/admin.pyc
new file mode 100644
index 0000000..6375fe9
Binary files /dev/null and b/4_blog/post/admin.pyc differ
diff --git a/4_blog/post/apps.py b/4_blog/post/apps.py
new file mode 100644
index 0000000..75d673e
--- /dev/null
+++ b/4_blog/post/apps.py
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.apps import AppConfig
+
+
+class PostConfig(AppConfig):
+ name = 'post'
diff --git a/4_blog/post/migrations/0001_initial.py b/4_blog/post/migrations/0001_initial.py
new file mode 100644
index 0000000..8af59b5
--- /dev/null
+++ b/4_blog/post/migrations/0001_initial.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.6 on 2018-08-10 07:51
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Category',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('cname', models.CharField(max_length=30, unique=True)),
+ ],
+ options={
+ 'db_table': 't_category',
+ },
+ ),
+ migrations.CreateModel(
+ name='Post',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=100, unique=True)),
+ ('desc', models.CharField(max_length=100)),
+ ('content', models.TextField()),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='post.Category')),
+ ],
+ options={
+ 'db_table': 't_post',
+ },
+ ),
+ migrations.CreateModel(
+ name='Tag',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('tname', models.CharField(max_length=30, unique=True)),
+ ],
+ options={
+ 'db_table': 't_tag',
+ },
+ ),
+ migrations.AddField(
+ model_name='post',
+ name='tag',
+ field=models.ManyToManyField(to='post.Tag'),
+ ),
+ ]
diff --git a/4_blog/post/migrations/0001_initial.pyc b/4_blog/post/migrations/0001_initial.pyc
new file mode 100644
index 0000000..a2b71a4
Binary files /dev/null and b/4_blog/post/migrations/0001_initial.pyc differ
diff --git a/4_blog/post/migrations/__init__.py b/4_blog/post/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/4_blog/post/migrations/__init__.pyc b/4_blog/post/migrations/__init__.pyc
new file mode 100644
index 0000000..665b11b
Binary files /dev/null and b/4_blog/post/migrations/__init__.pyc differ
diff --git a/4_blog/post/models.py b/4_blog/post/models.py
new file mode 100644
index 0000000..c23c5b8
--- /dev/null
+++ b/4_blog/post/models.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models
+
+# Create your models here.
+class Category(models.Model):
+ cname = models.CharField(max_length=30,unique=True,verbose_name=u'类别名称')
+
+
+ class Meta:
+ db_table = 't_category'
+ verbose_name_plural=u'类别'
+
+ def __unicode__(self):
+ return u'Category:%s'%self.cname
+
+class Tag(models.Model):
+ tname = models.CharField(max_length=30,unique=True,verbose_name=u'标签名称')
+
+ class Meta:
+ db_table = 't_tag'
+ verbose_name_plural = u'标签'
+
+ def __unicode__(self):
+ return u'Tag:%s' % self.tname
+
+class Post(models.Model):
+ title = models.CharField(max_length=100,unique=True)
+ desc = models.CharField(max_length=100)
+ content = models.TextField()
+ created = models.DateTimeField(auto_now_add=True)
+ category = models.ForeignKey(Category,on_delete=models.CASCADE)
+ tag = models.ManyToManyField(Tag)
+
+ class Meta:
+ db_table = 't_post'
+ verbose_name_plural = u'帖子'
+
+ def __unicode__(self):
+ return u'Post:%s' % self.title
+
diff --git a/4_blog/post/models.pyc b/4_blog/post/models.pyc
new file mode 100644
index 0000000..4e8778c
Binary files /dev/null and b/4_blog/post/models.pyc differ
diff --git a/4_blog/post/templates/detail.html b/4_blog/post/templates/detail.html
new file mode 100644
index 0000000..31a8fec
--- /dev/null
+++ b/4_blog/post/templates/detail.html
@@ -0,0 +1,39 @@
+{% extends 'base.html' %}
+{% load myfilter %}
+
+{% block title %}
+ 详情页面
+{% endblock %}
+
+{% block left %}
+
+
+
+
+
+
+
+
前言
+ {{ post.desc }}
+
+ {{ post.content|md|safe }}
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/4_blog/post/templates/index.html b/4_blog/post/templates/index.html
new file mode 100644
index 0000000..55c1f80
--- /dev/null
+++ b/4_blog/post/templates/index.html
@@ -0,0 +1,111 @@
+{% extends 'base.html' %}
+
+{% block title %}首页{% endblock %}
+
+
+
+{% block left %}
+
+
+ {% for post in postList %}
+
+
+
+
+
+
前言
+
+ {{ post.desc }}
+
+
+
+ 阅读全文
+
+
+
+ 分享
+
+
+ {% for t in post.tag.all %}
+
+
+ {{ t.tname }}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+ {% endfor %}
+
+
+
+
+
+
+ {% if postList.has_previous %}
+ « Prev
+ {% endif %}
+
+
+
+ {% for page in pageList %}
+ {% if currentNum == page %}
+ {{ page }}
+ {% else %}
+ {{ page }}
+ {% endif %}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+ {% if postList.has_next %}
+ Next »
+ {% endif %}
+
+
+
+
+
+
+
+{% endblock %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/4_blog/post/templatetags/__init__.py b/4_blog/post/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/4_blog/post/templatetags/__init__.pyc b/4_blog/post/templatetags/__init__.pyc
new file mode 100644
index 0000000..e156558
Binary files /dev/null and b/4_blog/post/templatetags/__init__.pyc differ
diff --git a/4_blog/post/templatetags/myfilter.py b/4_blog/post/templatetags/myfilter.py
new file mode 100644
index 0000000..0988f67
--- /dev/null
+++ b/4_blog/post/templatetags/myfilter.py
@@ -0,0 +1,10 @@
+#coding=utf-8
+
+from django.template import Library
+
+register = Library()
+
+@register.filter
+def md(value):
+ import markdown
+ return markdown.markdown(value)
\ No newline at end of file
diff --git a/4_blog/post/templatetags/myfilter.pyc b/4_blog/post/templatetags/myfilter.pyc
new file mode 100644
index 0000000..f6a6592
Binary files /dev/null and b/4_blog/post/templatetags/myfilter.pyc differ
diff --git a/4_blog/post/tests.py b/4_blog/post/tests.py
new file mode 100644
index 0000000..5982e6b
--- /dev/null
+++ b/4_blog/post/tests.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/4_blog/post/urls.py b/4_blog/post/urls.py
new file mode 100644
index 0000000..0d4c789
--- /dev/null
+++ b/4_blog/post/urls.py
@@ -0,0 +1,10 @@
+#coding=utf-8
+
+from django.conf.urls import url
+import views
+
+urlpatterns=[
+ url(r'^$',views.queryAll),
+ url(r'^page/(\d+)$',views.queryAll),
+ url(r'^post/(\d+)$',views.detail),
+]
diff --git a/4_blog/post/urls.pyc b/4_blog/post/urls.pyc
new file mode 100644
index 0000000..89fd1f0
Binary files /dev/null and b/4_blog/post/urls.pyc differ
diff --git a/4_blog/post/views.py b/4_blog/post/views.py
new file mode 100644
index 0000000..890fecf
--- /dev/null
+++ b/4_blog/post/views.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.shortcuts import render
+
+# Create your views here.
+#渲染主页面
+# from post.models import Post
+from templates.models import Post
+
+from django.core.paginator import Paginator
+import math
+
+def queryAll(request,num=1):
+
+ num = int(num)
+
+ #获取所有帖子信息
+ postList = Post.objects.all().order_by('-created')
+
+ #创建分页器对象
+ pageObj = Paginator(postList,1)
+
+ #获取当前页的数据
+ perPageList = pageObj.page(num)
+
+
+ #生成页码数列表
+ # 每页开始页码
+ begin = (num - int(math.ceil(10.0 / 2)))
+ if begin < 1:
+ begin = 1
+
+ # 每页结束页码
+ end = begin + 9
+ if end > pageObj.num_pages:
+ end = pageObj.num_pages
+
+ if end <= 10:
+ begin = 1
+ else:
+ begin = end - 9
+
+ pageList = range(begin, end + 1)
+
+
+ return render(request,'index.html',{'postList':perPageList,'pageList':pageList,'currentNum':num})
+
+#阅读全文功能
+def detail(request,postid):
+ postid = int(postid)
+
+ #根据postid查询帖子的详情信息
+ post = Post.objects.get(id=postid)
+
+ return render(request,'detail.html',{'post':post})
\ No newline at end of file
diff --git a/4_blog/post/views.pyc b/4_blog/post/views.pyc
new file mode 100644
index 0000000..7b841a9
Binary files /dev/null and b/4_blog/post/views.pyc differ
diff --git a/4_blog/static/css/style.css b/4_blog/static/css/style.css
new file mode 100644
index 0000000..710fc50
--- /dev/null
+++ b/4_blog/static/css/style.css
@@ -0,0 +1,1492 @@
+
+body {
+ zoom: 1;
+ width: 100%;
+}
+body:before,
+body:after {
+ content: "";
+ display: table;
+}
+body:after {
+ clear: both;
+}
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-family: inherit;
+ font-size: 100%;
+ vertical-align: baseline;
+}
+body {
+ line-height: 1;
+ color: #000;
+ background: #fff;
+}
+ol,
+ul {
+ list-style: none;
+}
+table {
+ border-collapse: separate;
+ border-spacing: 0;
+ vertical-align: middle;
+}
+caption,
+th,
+td {
+ text-align: left;
+ font-weight: normal;
+ vertical-align: middle;
+}
+a img {
+ border: none;
+}
+input,
+button {
+ margin: 0;
+ padding: 0;
+}
+input::-moz-focus-inner,
+button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+@font-face {
+ font-family: FontAwesome;
+ font-style: normal;
+ font-weight: normal;
+ }
+html,
+body,
+#container {
+ height: 100%;
+}
+body {
+ background: #eee;
+ font: 14px/1.6em "寰蒋闆呴粦", "Microsoft Yahei", "Droid Sans", Helvetica Neue, Helvetica, Arial, sans-serif;
+ -webkit-text-size-adjust: 100%;
+}
+.outer {
+ zoom: 1;
+ max-width: 1220px;
+ margin: 0 auto;
+ padding: 0 10px;
+}
+.outer:before,
+.outer:after {
+ content: "";
+ display: table;
+}
+.outer:after {
+ clear: both;
+}
+.inner {
+ display: inline;
+ float: left;
+ width: 98.3333333333333%;
+ margin: 0 0.8333333333333%;
+}
+.left,
+.alignleft {
+ float: left;
+}
+.right,
+.alignright {
+ float: right;
+}
+.clear {
+ clear: both;
+}
+#container {
+ position: relative;
+}
+.mobile-nav-on {
+ overflow: hidden;
+}
+#wrap {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-transition: 0.2s ease-out;
+ -moz-transition: 0.2s ease-out;
+ -o-transition: 0.2s ease-out;
+ -ms-transition: 0.2s ease-out;
+ transition: 0.2s ease-out;
+ z-index: 1;
+ background: #eee;
+}
+.mobile-nav-on #wrap {
+ left: 280px;
+}
+@media screen and (min-width: 768px) {
+ #main {
+ display: inline;
+ float: left;
+ width: 73.3333333333333%;
+ margin: 0 0.8333333333333%;
+ }
+}
+.article-date,
+.article-category-link,
+.archive-year,
+.widget-title {
+ text-decoration: none;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ color: #999;
+ margin-bottom: 1em;
+ margin-left: 5px;
+ line-height: 1em;
+ text-shadow: 0 1px #fff;
+ font-weight: bold;
+}
+.article-inner,
+.archive-article-inner {
+ background: #fff;
+ -webkit-box-shadow: 1px 2px 3px #ddd;
+ box-shadow: 1px 2px 3px #ddd;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+.article-entry h1,
+.widget h1,
+.article-entry h2,
+.widget h2,
+.article-entry h3,
+.widget h3,
+.article-entry h4,
+.widget h4,
+.article-entry h5,
+.widget h5,
+.article-entry h6,
+.widget h6 {
+ font-weight: bold;
+ color: #000;
+ font-family: "Droid Serif", Georgia, Serif;
+}
+.article-entry h1 a,
+.widget h1 a,
+.article-entry h2 a,
+.widget h2 a,
+.article-entry h3 a,
+.widget h3 a,
+.article-entry h4 a,
+.widget h4 a,
+.article-entry h5 a,
+.widget h5 a,
+.article-entry h6 a,
+.widget h6 a {
+ color: #000;
+ text-decoration: none;
+}
+.article-entry h1 a:hover,
+.widget h1 a:hover,
+.article-entry h2 a:hover,
+.widget h2 a:hover,
+.article-entry h3 a:hover,
+.widget h3 a:hover,
+.article-entry h4 a:hover,
+.widget h4 a:hover,
+.article-entry h5 a:hover,
+.widget h5 a:hover,
+.article-entry h6 a:hover,
+.widget h6 a:hover {
+ color: #e32d40;
+}
+.article-entry h2,
+.widget h2,
+.article-entry h3,
+.widget h3,
+.article-entry h4,
+.widget h4,
+.article-entry h5,
+.widget h5,
+.article-entry h6,
+.widget h6 {
+ font-weight: 600;
+ margin-bottom: 10px;
+}
+.article-entry h1,
+.widget h1 {
+ font-size: 2em;
+}
+.article-entry h2,
+.widget h2 {
+ font-size: 1.5em;
+}
+.article-entry h3,
+.widget h3 {
+ font-size: 1.3em;
+}
+.article-entry h4,
+.widget h4 {
+ font-size: 1.2em;
+}
+.article-entry h5,
+.widget h5 {
+ font-size: 1em;
+}
+.article-entry h6,
+.widget h6 {
+ font-size: 1em;
+ color: #999;
+}
+.article-entry hr,
+.widget hr {
+ border: 1px dashed #ddd;
+}
+.article-entry strong,
+.widget strong {
+ font-weight: bold;
+}
+.article-entry em,
+.widget em,
+.article-entry cite,
+.widget cite {
+ font-style: italic;
+}
+.article-entry sup,
+.widget sup,
+.article-entry sub,
+.widget sub {
+ font-size: 0.75em;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+.article-entry sup,
+.widget sup {
+ top: -0.5em;
+}
+.article-entry sub,
+.widget sub {
+ bottom: -0.2em;
+}
+.article-entry small,
+.widget small {
+ font-size: 0.85em;
+}
+.article-entry acronym,
+.widget acronym,
+.article-entry abbr,
+.widget abbr {
+ border-bottom: 1px dotted;
+}
+.article-entry ul,
+.widget ul,
+.article-entry ol,
+.widget ol,
+.article-entry dl,
+.widget dl {
+ margin: 0 20px;
+ line-height: 1.6em;
+}
+.article-entry ul ul,
+.widget ul ul,
+.article-entry ol ul,
+.widget ol ul,
+.article-entry ul ol,
+.widget ul ol,
+.article-entry ol ol,
+.widget ol ol {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+.article-entry ul,
+.widget ul {
+ list-style: disc;
+}
+.article-entry ol,
+.widget ol {
+ list-style: decimal;
+}
+.article-entry dt,
+.widget dt {
+ font-weight: bold;
+}
+#header {
+ height: 67px;
+ position: relative;
+ border-bottom: 1px solid #ddd;
+}
+#header:before,
+#header:after {
+ content: "";
+ position: absolute;
+ left: 0;
+ right: 0;
+ height: 40px;
+}
+#header:before {
+ top: 0;
+ background: -webkit-linear-gradient(rgba(0,0,0,0.2), transparent);
+ background: -moz-linear-gradient(rgba(0,0,0,0.2), transparent);
+ background: -o-linear-gradient(rgba(0,0,0,0.2), transparent);
+ background: -ms-linear-gradient(rgba(0,0,0,0.2), transparent);
+ background: linear-gradient(rgba(0,0,0,0.2), transparent);
+}
+#header:after {
+ bottom: 0;
+ background: -webkit-linear-gradient(transparent, rgba(0,0,0,0.2));
+ background: -moz-linear-gradient(transparent, rgba(0,0,0,0.2));
+ background: -o-linear-gradient(transparent, rgba(0,0,0,0.2));
+ background: -ms-linear-gradient(transparent, rgba(0,0,0,0.2));
+ background: linear-gradient(transparent, rgba(0,0,0,0.2));
+}
+#header-outer {
+ height: 100%;
+ position: relative;
+}
+#header-inner {
+ position: relative;
+ overflow: hidden;
+}
+#banner {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #21282e;
+ -webkit-background-size: cover;
+ -moz-background-size: cover;
+ background-size: cover;
+ z-index: -1;
+}
+#header-title {
+ text-align: center;
+ height: 40px;
+ position: absolute;
+ top: 50%;
+ left: 0;
+ margin-top: -20px;
+}
+#logo,
+#subtitle {
+ text-decoration: none;
+ color: #fff;
+ font-weight: 300;
+ text-shadow: 0 1px 4px rgba(0,0,0,0.3);
+}
+#logo {
+ font-size: 40px;
+ line-height: 40px;
+ letter-spacing: 2px;
+ background: #e32d40;
+ padding: 5px 10px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+}
+#subtitle {
+ font-size: 16px;
+ line-height: 16px;
+ letter-spacing: 1px;
+ color: #687e91;
+}
+#subtitle-wrap {
+ margin-top: 16px;
+}
+#main-nav {
+ float: left;
+ margin-left: -15px;
+}
+.nav-icon,
+.main-nav-link {
+ float: left;
+ color: #fff;
+ opacity: 0.6;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
+ filter: alpha(opacity=60);
+ text-decoration: none;
+ text-shadow: 0 1px rgba(0,0,0,0.2);
+ -webkit-transition: opacity 0.2s;
+ -moz-transition: opacity 0.2s;
+ -o-transition: opacity 0.2s;
+ -ms-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ display: block;
+ padding: 20px 15px;
+}
+.nav-icon:hover,
+.main-nav-link:hover {
+ opacity: 1;
+ -ms-filter: none;
+ filter: none;
+}
+.nav-icon {
+ font-family: FontAwesome;
+ text-align: center;
+ font-size: 14px;
+ width: 14px;
+ height: 14px;
+ padding: 20px 15px;
+ position: relative;
+ cursor: pointer;
+}
+.main-nav-link {
+ font-weight: 300;
+ letter-spacing: 1px;
+}
+@media screen and (max-width: 479px) {
+ .main-nav-link {
+ display: none;
+ }
+}
+#main-nav-toggle {
+ display: none;
+}
+#main-nav-toggle:before {
+ content: "\f0c9";
+}
+@media screen and (max-width: 479px) {
+ #main-nav-toggle {
+ display: block;
+ }
+}
+#sub-nav {
+ float: right;
+ margin-right: -15px;
+}
+#nav-rss-link:before {
+ content: "\f09e";
+}
+#nav-search-btn:before {
+ content: "\f002";
+}
+#search-form-wrap {
+ position: absolute;
+ top: 15px;
+ width: 150px;
+ height: 30px;
+ right: -150px;
+ opacity: 0;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
+ filter: alpha(opacity=0);
+ -webkit-transition: 0.2s ease-out;
+ -moz-transition: 0.2s ease-out;
+ -o-transition: 0.2s ease-out;
+ -ms-transition: 0.2s ease-out;
+ transition: 0.2s ease-out;
+}
+#search-form-wrap.on {
+ opacity: 1;
+ -ms-filter: none;
+ filter: none;
+ right: 0;
+}
+@media screen and (max-width: 479px) {
+ #search-form-wrap {
+ width: 100%;
+ right: -100%;
+ }
+}
+.search-form {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ background: #fff;
+ padding: 5px 15px;
+ -webkit-border-radius: 15px;
+ border-radius: 15px;
+ -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.3);
+ box-shadow: 0 0 10px rgba(0,0,0,0.3);
+}
+.search-form-input {
+ border: none;
+ background: none;
+ color: #000;
+ width: 100%;
+ font: 13px "寰蒋闆呴粦", "Microsoft Yahei", "Droid Sans", Helvetica Neue, Helvetica, Arial, sans-serif;
+ outline: none;
+}
+.search-form-input::-webkit-search-results-decoration,
+.search-form-input::-webkit-search-cancel-button {
+ -webkit-appearance: none;
+}
+.search-form-submit {
+ position: absolute;
+ top: 50%;
+ right: 10px;
+ margin-top: -7px;
+ font: 13px FontAwesome;
+ border: none;
+ background: none;
+ color: #bbb;
+ cursor: pointer;
+}
+.search-form-submit:hover,
+.search-form-submit:focus {
+ color: #777;
+}
+.article {
+ margin: 50px 0;
+}
+.article-inner {
+ overflow: hidden;
+}
+.article-meta {
+ zoom: 1;
+}
+.article-meta:before,
+.article-meta:after {
+ content: "";
+ display: table;
+}
+.article-meta:after {
+ clear: both;
+}
+.article-date {
+ float: left;
+}
+.article-category {
+ float: left;
+ line-height: 1em;
+ color: #ccc;
+ text-shadow: 0 1px #fff;
+ margin-left: 8px;
+}
+.article-category:before {
+ content: "\2022";
+}
+.article-category-link {
+ margin: 0 12px 1em;
+}
+.article-header {
+ padding: 20px 20px 0;
+}
+.article-title {
+ text-decoration: none;
+ font-size: 2em;
+ font-weight: bold;
+ color: #000;
+ line-height: 1.1em;
+ -webkit-transition: color 0.2s;
+ -moz-transition: color 0.2s;
+ -o-transition: color 0.2s;
+ -ms-transition: color 0.2s;
+ transition: color 0.2s;
+}
+a.article-title:hover {
+ color: #e32d40;
+}
+.article-entry {
+ zoom: 1;
+ color: #000;
+ padding: 0 20px;
+}
+.article-entry:before,
+.article-entry:after {
+ content: "";
+ display: table;
+}
+.article-entry:after {
+ clear: both;
+}
+.article-entry p,
+.article-entry table {
+ line-height: 1.6em;
+ margin: 1.6em 0;
+}
+.article-entry h1,
+.article-entry h2,
+.article-entry h3,
+.article-entry h4,
+.article-entry h5,
+.article-entry h6 {
+ font-weight: bold;
+}
+.article-entry h1,
+.article-entry h2,
+.article-entry h3,
+.article-entry h4,
+.article-entry h5,
+.article-entry h6 {
+ line-height: 1.1em;
+ margin: 1.1em 0;
+}
+.article-entry a {
+ color: #e32d40;
+ text-decoration: none;
+}
+.article-entry a:hover {
+ text-decoration: underline;
+}
+.article-entry ul,
+.article-entry ol,
+.article-entry dl {
+ margin-top: 1.6em;
+ margin-bottom: 1.6em;
+}
+.article-entry img,
+.article-entry video {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ margin: auto;
+}
+.article-entry iframe {
+ border: none;
+}
+.article-entry table {
+ width: 100%;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+.article-entry th {
+ font-weight: bold;
+ border-bottom: 3px solid #ddd;
+ padding-bottom: 0.5em;
+}
+.article-entry td {
+ border-bottom: 1px solid #ddd;
+ padding: 10px 0;
+}
+.article-entry blockquote {
+ font-family: "Droid Serif", Georgia, Serif;
+ margin: 1.6em 0;
+ padding: 0 0.8em;
+ border-left: 4px solid #ddd;
+ color: #777;
+}
+.article-entry blockquote footer {
+ font-size: 14px;
+ margin: 1.6em 0;
+ font-family: "寰蒋闆呴粦", "Microsoft Yahei", "Droid Sans", Helvetica Neue, Helvetica, Arial, sans-serif;
+}
+.article-entry blockquote footer cite:before {
+ content: "鈥�";
+ padding: 0 0.5em;
+}
+.article-entry .pullquote {
+ text-align: left;
+ width: 45%;
+ margin: 0;
+}
+.article-entry .pullquote.left {
+ margin-left: 0.5em;
+ margin-right: 1em;
+}
+.article-entry .pullquote.right {
+ margin-right: 0.5em;
+ margin-left: 1em;
+}
+.article-entry .caption {
+ color: #999;
+ display: block;
+ font-size: 0.9em;
+ margin-top: 0.5em;
+ position: relative;
+ text-align: center;
+}
+.article-entry .video-container {
+ position: relative;
+ padding-top: 56.25%;
+ height: 0;
+ overflow: hidden;
+}
+.article-entry .video-container iframe,
+.article-entry .video-container object,
+.article-entry .video-container embed {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ margin-top: 0;
+}
+.article-more-link a {
+ display: inline-block;
+ line-height: 1em;
+ padding: 6px 15px;
+ -webkit-border-radius: 15px;
+ border-radius: 15px;
+ background: #eee;
+ color: #999;
+ text-shadow: 0 1px #fff;
+ text-decoration: none;
+}
+.article-more-link a:hover {
+ background: #e32d40;
+ color: #fff;
+ text-decoration: none;
+ text-shadow: 0 1px #c01a2b;
+}
+.article-footer {
+ zoom: 1;
+ font-size: 0.85em;
+ line-height: 1.6em;
+ border-top: 2px solid #ddd;
+ padding-top: 1.6em;
+ margin: 0 20px 20px;
+}
+.article-footer:before,
+.article-footer:after {
+ content: "";
+ display: table;
+}
+.article-footer:after {
+ clear: both;
+}
+.article-footer a {
+ color: #999;
+ text-decoration: none;
+}
+.article-footer a:hover {
+ color: #000;
+}
+.article-tag-list-item {
+ float: left;
+ margin-right: 10px;
+}
+.article-tag-list-link:before {
+ content: "#";
+}
+.article-comment-link {
+ float: right;
+}
+.article-comment-link:before {
+ content: "\f075";
+ font-family: FontAwesome;
+ padding-right: 8px;
+}
+.article-share-link {
+ cursor: pointer;
+ float: right;
+ margin-left: 20px;
+}
+.article-share-link:before {
+ content: "\f064";
+ font-family: FontAwesome;
+ padding-right: 6px;
+}
+#article-nav {
+ zoom: 1;
+ position: relative;
+}
+#article-nav:before,
+#article-nav:after {
+ content: "";
+ display: table;
+}
+#article-nav:after {
+ clear: both;
+}
+@media screen and (min-width: 768px) {
+ #article-nav {
+ margin: 50px 0;
+ }
+ #article-nav:before {
+ width: 8px;
+ height: 8px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -4px;
+ margin-left: -4px;
+ content: "";
+ -webkit-border-radius: 50%;
+ border-radius: 50%;
+ background: #ddd;
+ -webkit-box-shadow: 0 1px 2px #fff;
+ box-shadow: 0 1px 2px #fff;
+ }
+}
+.article-nav-link-wrap {
+ text-decoration: none;
+ text-shadow: 0 1px #fff;
+ color: #999;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ margin-top: 50px;
+ text-align: center;
+ display: block;
+}
+.article-nav-link-wrap:hover {
+ color: #000;
+}
+@media screen and (min-width: 768px) {
+ .article-nav-link-wrap {
+ width: 50%;
+ margin-top: 0;
+ }
+}
+@media screen and (min-width: 768px) {
+ #article-nav-newer {
+ float: left;
+ text-align: right;
+ padding-right: 20px;
+ }
+}
+@media screen and (min-width: 768px) {
+ #article-nav-older {
+ float: right;
+ text-align: left;
+ padding-left: 20px;
+ }
+}
+.article-nav-caption {
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ color: #ddd;
+ line-height: 1em;
+ font-weight: bold;
+}
+#article-nav-newer .article-nav-caption {
+ margin-right: -2px;
+}
+.article-nav-title {
+ font-size: 0.85em;
+ line-height: 1.6em;
+ margin-top: 0.5em;
+}
+.article-share-box {
+ position: absolute;
+ display: none;
+ background: #fff;
+ -webkit-box-shadow: 1px 2px 10px rgba(0,0,0,0.2);
+ box-shadow: 1px 2px 10px rgba(0,0,0,0.2);
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ margin-left: -145px;
+ overflow: hidden;
+ z-index: 1;
+}
+.article-share-box.on {
+ display: block;
+}
+.article-share-input {
+ width: 100%;
+ background: none;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font: 14px "寰蒋闆呴粦", "Microsoft Yahei", "Droid Sans", Helvetica Neue, Helvetica, Arial, sans-serif;
+ padding: 0 15px;
+ color: #000;
+ outline: none;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 3px 3px 0 0;
+ border-radius: 3px 3px 0 0;
+ height: 36px;
+ line-height: 36px;
+}
+.article-share-links {
+ zoom: 1;
+ background: #eee;
+}
+.article-share-links:before,
+.article-share-links:after {
+ content: "";
+ display: table;
+}
+.article-share-links:after {
+ clear: both;
+}
+.article-share-twitter,
+.article-share-facebook,
+.article-share-pinterest,
+.article-share-google {
+ width: 50px;
+ height: 36px;
+ display: block;
+ float: left;
+ position: relative;
+ color: #999;
+ text-shadow: 0 1px #fff;
+}
+.article-share-twitter:before,
+.article-share-facebook:before,
+.article-share-pinterest:before,
+.article-share-google:before {
+ font-size: 20px;
+ font-family: FontAwesome;
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -10px;
+ margin-left: -10px;
+ text-align: center;
+}
+.article-share-twitter:hover,
+.article-share-facebook:hover,
+.article-share-pinterest:hover,
+.article-share-google:hover {
+ color: #fff;
+}
+.article-share-twitter:before {
+ content: "\f099";
+}
+.article-share-twitter:hover {
+ background: #00aced;
+ text-shadow: 0 1px #008abe;
+}
+.article-share-facebook:before {
+ content: "\f09a";
+}
+.article-share-facebook:hover {
+ background: #3b5998;
+ text-shadow: 0 1px #2f477a;
+}
+.article-share-pinterest:before {
+ content: "\f0d2";
+}
+.article-share-pinterest:hover {
+ background: #cb2027;
+ text-shadow: 0 1px #a21a1f;
+}
+.article-share-google:before {
+ content: "\f0d5";
+}
+.article-share-google:hover {
+ background: #dd4b39;
+ text-shadow: 0 1px #be3221;
+}
+.article-gallery {
+ background: #000;
+ position: relative;
+}
+.article-gallery-photos {
+ position: relative;
+ overflow: hidden;
+}
+.article-gallery-img {
+ display: none;
+ max-width: 100%;
+}
+.article-gallery-img:first-child {
+ display: block;
+}
+.article-gallery-img.loaded {
+ position: absolute;
+ display: block;
+}
+.article-gallery-img img {
+ display: block;
+ max-width: 100%;
+ margin: 0 auto;
+}
+.copyright {
+ display: block;
+ padding: 10px 20px;
+ margin: auto;
+ line-height: 24px;
+ font-size: 14px;
+}
+.copyright a {
+ color: #e32d40;
+ text-decoration: none;
+}
+.copyright a:hover {
+ text-decoration: underline;
+}
+#comments {
+ background: #fff;
+ -webkit-box-shadow: 1px 2px 3px #ddd;
+ box-shadow: 1px 2px 3px #ddd;
+ padding: 20px;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ margin: 50px 0;
+}
+#comments a {
+ color: #e32d40;
+}
+.archives-wrap {
+ margin: 50px 0;
+}
+.archives {
+ zoom: 1;
+}
+.archives:before,
+.archives:after {
+ content: "";
+ display: table;
+}
+.archives:after {
+ clear: both;
+}
+.archive-year-wrap {
+ margin-bottom: 1em;
+ line-height: 1em;
+}
+.archives {
+ -webkit-column-gap: 10px;
+ -moz-column-gap: 10px;
+ column-gap: 10px;
+}
+@media screen and (min-width: 480px) and (max-width: 767px) {
+ .archives {
+ -webkit-column-count: 2;
+ -moz-column-count: 2;
+ column-count: 2;
+ }
+}
+@media screen and (min-width: 768px) {
+ .archives {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ }
+}
+.archive-article {
+ -webkit-column-break-inside: avoid;
+ page-break-inside: avoid;
+ overflow: hidden;
+ break-inside: avoid-column;
+}
+.archive-article-inner {
+ padding: 10px;
+ margin-bottom: 15px;
+}
+.archive-article-title {
+ text-decoration: none;
+ font-weight: bold;
+ color: #000;
+ -webkit-transition: color 0.2s;
+ -moz-transition: color 0.2s;
+ -o-transition: color 0.2s;
+ -ms-transition: color 0.2s;
+ transition: color 0.2s;
+ line-height: 1.6em;
+}
+.archive-article-title:hover {
+ color: #e32d40;
+}
+.archive-article-footer {
+ margin-top: 1em;
+}
+.archive-article-date {
+ color: #999;
+ text-decoration: none;
+ font-size: 0.85em;
+ line-height: 1em;
+ margin-bottom: 0.5em;
+ display: block;
+}
+#page-nav {
+ zoom: 1;
+ margin: 50px auto;
+ background: #fff;
+ -webkit-box-shadow: 1px 2px 3px #ddd;
+ box-shadow: 1px 2px 3px #ddd;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ text-align: center;
+ color: #999;
+ overflow: hidden;
+}
+#page-nav:before,
+#page-nav:after {
+ content: "";
+ display: table;
+}
+#page-nav:after {
+ clear: both;
+}
+#page-nav a,
+#page-nav span {
+ padding: 10px 20px;
+}
+#page-nav a {
+ color: #999;
+ text-decoration: none;
+}
+#page-nav a:hover {
+ background: #999;
+ color: #fff;
+}
+#page-nav .prev {
+ float: left;
+}
+#page-nav .next {
+ float: right;
+}
+#page-nav .page-number {
+ display: inline-block;
+}
+@media screen and (max-width: 479px) {
+ #page-nav .page-number {
+ display: none;
+ }
+}
+#page-nav .current {
+ color: #000;
+ font-weight: bold;
+}
+#page-nav .space {
+ color: #ddd;
+}
+#footer {
+ background: #262a30;
+ padding: 50px 0;
+ border-top: 1px solid #ddd;
+ color: #999;
+}
+#footer a {
+ color: #e32d40;
+ text-decoration: none;
+}
+#footer a:hover {
+ text-decoration: underline;
+}
+#footer-info {
+ line-height: 1.6em;
+ font-size: 0.85em;
+}
+.article-entry pre,
+.article-entry .highlight {
+ background: #272822;
+ margin: 0 -20px;
+ padding: 15px 20px;
+ border-style: solid;
+ border-color: #ddd;
+ border-width: 1px 0;
+ overflow: auto;
+ color: #f8f8f2;
+ line-height: 22.400000000000002px;
+}
+.article-entry .highlight .gutter pre,
+.article-entry .gist .gist-file .gist-data .line-numbers {
+ color: #666;
+ font-size: 0.85em;
+}
+.article-entry pre,
+.article-entry code {
+ font-family: "Source Code Pro", Consolas, Monaco, Menlo, Consolas, monospace;
+}
+.article-entry code {
+ background: #f0f0f0;
+ text-shadow: 0 1px #fff;
+ font-size: 0.85em;
+ padding: 0 0.3em;
+ border: 1px solid #dcdcdc;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+.article-entry pre code {
+ background: none;
+ text-shadow: none;
+ padding: 0;
+ border: none;
+}
+.article-entry .highlight pre {
+ border: none;
+ margin: 0;
+ padding: 0;
+}
+.article-entry .highlight table {
+ margin: 0;
+ width: auto;
+}
+.article-entry .highlight td {
+ border: none;
+ padding: 0;
+}
+.article-entry .highlight figcaption {
+ zoom: 1;
+ font-size: 0.85em;
+ color: #75715e;
+ line-height: 1em;
+ margin-bottom: 1em;
+}
+.article-entry .highlight figcaption:before,
+.article-entry .highlight figcaption:after {
+ content: "";
+ display: table;
+}
+.article-entry .highlight figcaption:after {
+ clear: both;
+}
+.article-entry .highlight figcaption a {
+ float: right;
+}
+.article-entry .highlight .gutter pre {
+ text-align: right;
+ padding-right: 20px;
+}
+.article-entry .highlight .line {
+ height: 22.400000000000002px;
+}
+.article-entry .gist {
+ margin: 0 -20px;
+ border-style: solid;
+ border-color: #ddd;
+ border-width: 1px 0;
+ background: #272822;
+ padding: 15px 20px 15px 0;
+}
+.article-entry .gist .gist-file {
+ border: none;
+ font-family: "Source Code Pro", Consolas, Monaco, Menlo, Consolas, monospace;
+ margin: 0;
+}
+.article-entry .gist .gist-file .gist-data {
+ background: none;
+ border: none;
+}
+.article-entry .gist .gist-file .gist-data .line-numbers {
+ background: none;
+ border: none;
+ padding: 0 20px 0 0;
+}
+.article-entry .gist .gist-file .gist-data .line-data {
+ padding: 0 !important;
+}
+.article-entry .gist .gist-file .highlight {
+ margin: 0;
+ padding: 0;
+ border: none;
+}
+.article-entry .gist .gist-file .gist-meta {
+ background: #272822;
+ color: #75715e;
+ font: 0.85em "寰蒋闆呴粦", "Microsoft Yahei", "Droid Sans", Helvetica Neue, Helvetica, Arial, sans-serif;
+ text-shadow: 0 0;
+ padding: 0;
+ margin-top: 1em;
+ margin-left: 20px;
+}
+.article-entry .gist .gist-file .gist-meta a {
+ color: #e32d40;
+ font-weight: normal;
+}
+.article-entry .gist .gist-file .gist-meta a:hover {
+ text-decoration: underline;
+}
+pre .comment,
+pre .preprocessor {
+ color: #75715e;
+}
+pre .tag {
+ color: #f8f8f2;
+}
+pre .title,
+pre .variable,
+pre .regexp,
+pre .ruby .constant,
+pre .xml .tag .title,
+pre .xml .pi,
+pre .xml .doctype,
+pre .html .doctype,
+pre .css .id,
+pre .css .class,
+pre .css .pseudo {
+ color: #f92672;
+}
+pre .number,
+pre .built_in,
+pre .literal,
+pre .constant {
+ color: #ae81ff;
+}
+pre .params {
+ color: #fd971f;
+}
+pre .class,
+pre .ruby .class .title,
+pre .css .rules .attribute,
+pre .attribute {
+ color: #a6e22e;
+}
+pre .string,
+pre .value,
+pre .inheritance,
+pre .header,
+pre .ruby .symbol,
+pre .xml .cdata {
+ color: #e6db74;
+}
+pre .css .hexcolor {
+ color: #a1efe4;
+}
+pre .function,
+pre .python .decorator,
+pre .python .title,
+pre .ruby .function .title,
+pre .ruby .title .keyword,
+pre .perl .sub,
+pre .javascript .title,
+pre .coffeescript .title {
+ color: #66d9ef;
+}
+pre .keyword,
+pre .javascript .function {
+ color: #66d9ef;
+}
+@media screen and (max-width: 479px) {
+ #mobile-nav {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 280px;
+ height: 100%;
+ background: #191919;
+ border-right: 1px solid #fff;
+ }
+}
+@media screen and (max-width: 479px) {
+ .mobile-nav-link {
+ display: block;
+ color: #999;
+ text-decoration: none;
+ padding: 15px 20px;
+ font-weight: bold;
+ }
+ .mobile-nav-link:hover {
+ color: #fff;
+ }
+}
+@media screen and (min-width: 768px) {
+ #sidebar {
+ display: inline;
+ float: left;
+ width: 23.3333333333333%;
+ margin: 0 0.8333333333333%;
+ }
+}
+.widget-wrap {
+ margin: 50px 0;
+}
+.widget {
+ color: #777;
+ text-shadow: 0 1px #fff;
+ background: #fff;
+ -webkit-box-shadow: 1px 2px 3px #ddd;
+ box-shadow: 1px 2px 3px #ddd;
+ padding: 15px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+.widget a {
+ color: #999;
+ text-decoration: none;
+}
+.widget a:hover {
+ text-decoration: underline;
+ color: #e32d40;
+}
+.widget ul ul,
+.widget ol ul,
+.widget dl ul,
+.widget ul ol,
+.widget ol ol,
+.widget dl ol,
+.widget ul dl,
+.widget ol dl,
+.widget dl dl {
+ margin-left: 15px;
+ list-style: disc;
+}
+.widget {
+ line-height: 1.6em;
+ word-wrap: break-word;
+ font-size: 0.9em;
+}
+.widget ul,
+.widget ol {
+ list-style: none;
+ margin: 0;
+}
+.widget ul ul,
+.widget ol ul,
+.widget ul ol,
+.widget ol ol {
+ margin: 0 20px;
+}
+.widget ul ul,
+.widget ol ul {
+ list-style: disc;
+}
+.widget ul ol,
+.widget ol ol {
+ list-style: decimal;
+}
+.category-list-count,
+.tag-list-count,
+.archive-list-count {
+ padding-left: 5px;
+ color: #999;
+ font-size: 0.85em;
+}
+.category-list-count:before,
+.tag-list-count:before,
+.archive-list-count:before {
+ content: "(";
+}
+.category-list-count:after,
+.tag-list-count:after,
+.archive-list-count:after {
+ content: ")";
+}
+.tagcloud a {
+ margin-right: 5px;
+}
\ No newline at end of file
diff --git a/4_blog/templates/base.html b/4_blog/templates/base.html
new file mode 100644
index 0000000..191f52b
--- /dev/null
+++ b/4_blog/templates/base.html
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ {% block title %}{% endblock %}
+
+
+
+
+ {% block headerjs %}
+
+ {% endblock %}
+
+
+
+
+ {% include 'header.html' %}
+
+
+ {% block left %}
+
+ {% endblock %}
+
+ {% include 'right.html' %}
+
+
+
+ {% include 'footer.html' %}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4_blog/templates/footer.html b/4_blog/templates/footer.html
new file mode 100644
index 0000000..6cb7efd
--- /dev/null
+++ b/4_blog/templates/footer.html
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/4_blog/templates/header.html b/4_blog/templates/header.html
new file mode 100644
index 0000000..84de0fe
--- /dev/null
+++ b/4_blog/templates/header.html
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/4_blog/templates/right.html b/4_blog/templates/right.html
new file mode 100644
index 0000000..0290aeb
--- /dev/null
+++ b/4_blog/templates/right.html
@@ -0,0 +1,109 @@
+
\ No newline at end of file