diff --git a/.gitignore b/.gitignore
index d8c5de8..1a3529f 100755
--- a/.gitignore
+++ b/.gitignore
@@ -103,4 +103,4 @@ venv.bak/
# mypy
.mypy_cache/
migrations
-config.py
\ No newline at end of file
+
diff --git a/.idea/blog.iml b/.idea/blog.iml
index d9f91ca..e6deb5d 100644
--- a/.idea/blog.iml
+++ b/.idea/blog.iml
@@ -7,6 +7,14 @@
+
+
+
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a714374..5e19f36 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,7 +1,19 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -10,15 +22,50 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -26,49 +73,64 @@
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -78,7 +140,10 @@
+
+
+
@@ -87,6 +152,24 @@
blog
blog_customer
info_category
+ tophead
+ .user
+ tophe
+ user
+ user_login
+ topnav
+ topna
+ mnav
+ logo
+ user_btns
+ login_out
+ hometitle
+ paihang
+ print
+ paihan
+ blogpic
+ MySQLdb
+ login
@@ -97,16 +180,41 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -117,10 +225,10 @@
-
-
-
-
+
+
+
+
@@ -141,6 +249,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -148,9 +281,24 @@
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -213,29 +361,29 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
@@ -244,87 +392,390 @@
+
+
+
+
+ file://$PROJECT_DIR$/info/model/user.py
+ 114
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..8fd0080
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,18 @@
+language: python
+sudo: enabled
+services:
+ - mysql
+python:
+ - "3.5"
+env:
+ global:
+ - TRAVIS=true
+before_install:
+ - mysql -e 'CREATE DATABASE IF NOT EXISTS wechat_ticket;'
+ - mv configs.example.json configs.json
+# command to install dependencies
+install:
+ - pip install -r requirements.txt
+
+script:
+ python manage.py runserver
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..d500f12
--- /dev/null
+++ b/config.py
@@ -0,0 +1,45 @@
+import redis
+import logging
+
+
+class Config(object):
+ """工程配置信息"""
+ SECRET_KEY = "EjpNVSNQTyGi1VvWECj9TvC/+kq3oujee2kTfQUs8yCM6xX9Yjq52v54g+HVoknA"
+ DEBUG = True
+
+ # 數據庫的配置信息
+ SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/blog"
+ SQLALCHEMY_TRACK_MODIFICATIONS = True
+
+ # redis配置
+ REDIS_HOST = "127.0.0.1"
+ REDIS_PORT = 6379
+
+ # session配置
+ SESSION_TYPE = "redis" # 指定session保存到redis中
+ SESSION_USE_SIGNER = True # 讓cookie中的session_id被加密簽名處理
+ SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT) # 使用redis的實例
+ PERMANENT_SESSION_LIFETIME = 86400 # session的有效器,單位是秒
+
+
+class DevelopmentConfig(Config):
+ """開發模式下的配置"""
+ DEBUG = True
+
+ # 默認日誌等級
+ LOG_LEVEL = logging.DEBUG
+
+
+class ProductionConfig(Config):
+ """生產模式下的配置"""
+ pass
+
+ # 生產日誌等級
+ LOG_LEVEL = logging.ERROR
+
+
+# 定義配置字點
+config = {
+ "development": DevelopmentConfig,
+ "production": ProductionConfig
+}
\ No newline at end of file
diff --git a/dump.rdb b/dump.rdb
new file mode 100644
index 0000000..62d7641
Binary files /dev/null and b/dump.rdb differ
diff --git a/info/__init__.py b/info/__init__.py
index bebee23..cf538de 100644
--- a/info/__init__.py
+++ b/info/__init__.py
@@ -3,9 +3,10 @@
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import config
-from flask_wtf.csrf import CSRFProtect
+from flask_wtf.csrf import CSRFProtect, generate_csrf
from flask_session import Session
from logging.handlers import RotatingFileHandler
+from flask_restful import Api, Resource
db = SQLAlchemy()
redis_store = None # type: StrictRedis
@@ -40,9 +41,25 @@ def create_app(config_name):
CSRFProtect(app)
# 设置session保存位置
Session(app)
+
+ @app.after_request
+ def after_request(response):
+ # 调用函数生成csrf_token
+ csrf_token = generate_csrf()
+ # 通过cookie将值传给前端
+ response.set_cookie('csrf_token', csrf_token)
+ return response
+
from info.module.index import index_blu
app.register_blueprint(index_blu)
+ from info.module.passport import passport_blu
+ app.register_blueprint(passport_blu)
+ from info.utils.common import do_index_class
+ # 添加自定义过滤器
+ app.add_template_filter(do_index_class, 'index_class')
return app
+
+
diff --git a/info/common.py b/info/common.py
new file mode 100644
index 0000000..ebe0c28
--- /dev/null
+++ b/info/common.py
@@ -0,0 +1,24 @@
+import functools
+from flask import session, g
+
+
+
+def user_login_data(f):
+ @functools.wraps(f)
+ def wrapper(*args, **kwargs):
+ # 獲取到當前登錄用戶的id
+ customer_id = session.get("customer_id")
+ # 通過id獲取用戶信息
+ blog_customr = None
+ if customer_id:
+ from info.model.user import BlogCustomer
+ try:
+ blog_customr = BlogCustomer.query.get(customer_id)
+ except Exception:
+ blog_customr = None
+ g.blog_customer = blog_customr
+ return f(*args, **kwargs)
+ return wrapper
+
+
+
diff --git a/info/model/user.py b/info/model/user.py
index 8f6bcca..490708c 100644
--- a/info/model/user.py
+++ b/info/model/user.py
@@ -11,7 +11,7 @@
class BlogCustomer(BaseModel, db.Model):
- """博主个人信息"""
+ """用户信息"""
__tablename__ = 'blog_customer'
id = db.Column(db.Integer, primary_key=True) # id
@@ -35,7 +35,7 @@ class BlogCustomer(BaseModel, db.Model):
qq_url = db.Column(db.String(128)) # QQurl
keep = db.Column(db.String(128)) # 保留字段
keep_url = db.Column(db.String(128)) # 保留url
- collection_news = db.relationship('Article', secondary=tb_user_collection, lazy='dynamic')
+ collection_news = db.relationship('Articles', secondary=tb_user_collection, lazy='dynamic')
def make_password_hash(self, password):
# 将未加密的密码执行加密操作
@@ -66,9 +66,11 @@ class Articles(BaseModel, db.Model):
digest = db.Column(db.String(512), nullable=False) # 文章摘要
content = db.Column(db.Text, nullable=False) # 文章内容
clicks = db.Column(db.Integer, default=0) # 浏览量
+ tag = db.Column(db.String(64)) # 标签
index_image_url = db.Column(db.String(256)) # 文章列表图片路径
category_id = db.Column(db.Integer, db.ForeignKey('info_category.id')) # 文章分类
user_id = db.Column(db.Integer, db.ForeignKey('blog_customer.id')) # 文章作者
+ recommend = db.Column(db.Integer, default=0) # 推荐
comments = db.relationship('Comment', lazy='dynamic')
@@ -107,6 +109,23 @@ class Carousels(BaseModel, db.Model):
categ = db.Column(db.Integer, nullable=False) # 种类
+class BlogAuthor(BaseModel, db.Model):
+ __tablename__ = 'info_author'
+
+ id = db.Column(db.Integer, primary_key=True)
+ title = db.Column(db.String(64)) # 博客标题
+ keywords = db.Column(db.String(64)) # 关键字
+ description = db.Column(db.String(256)) # 描述
+ wechat = db.Column(db.String(128)) # 微信
+ qq = db.Column(db.String(128)) # QQ
+ email = db.Column(db.String(128)) # 邮箱
+ Wechat_Reward = db.Column(db.String(128)) # 打赏
+ logo = db.Column(db.String(128)) # logo
+ avator_url = db.Column(db.String(128)) # 头像
+ name = db.Column(db.String(64))
+ tag = db.Column(db.String(64))
+ about_me = db.Column(db.String(256)) # 关于我
+
diff --git a/info/module/detail/__init__.py b/info/module/detail/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/info/module/detail/views.py b/info/module/detail/views.py
new file mode 100644
index 0000000..e69de29
diff --git a/info/module/index/view.py b/info/module/index/view.py
index c9da339..2180d28 100644
--- a/info/module/index/view.py
+++ b/info/module/index/view.py
@@ -1,8 +1,293 @@
from . import index_blu
+from flask import render_template, redirect, session, current_app
+from flask import url_for, request, jsonify, current_app, g
+from info.model.user import BlogCustomer, Articles, BlogAuthor, Category, Comment
+from info.utils import constants, recode
+from common import user_login_data
+from info import db
-@index_blu.route('/index')
+@index_blu.route('/')
+@user_login_data
def index():
- return 'index'
+ blog_customer = g.blog_customer
+ customer_info = None
+ if blog_customer:
+ customer_info = {
+ 'customer_id': blog_customer.id if blog_customer else None,
+ 'nick_name': blog_customer.nick_name if blog_customer else None,
+ 'avatar_url': blog_customer.avatar_url if blog_customer else None
+ }
+ # 获取博主个人信息
+ author = None
+ try:
+ author = BlogAuthor.query.get(1)
+ except Exception as e:
+ current_app.logger.error(e)
+ author = {
+ 'title': author.title,
+ 'keywords': author.keywords,
+ 'description': author.description,
+ 'wechat': author.wechat,
+ 'qq': author.qq,
+ 'email': author.email,
+ 'wechat_reword': author.Wechat_Reward,
+ 'logo': author.logo,
+ 'avator_url': author.avator_url,
+ 'name': author.name,
+ 'tag': author.tag,
+ 'about_me': author.about_me
+ }
+ data = public()
+ data['customer_info'] = customer_info if customer_info else None
+ return render_template('index.html', data=data)
+
+@index_blu.route('/articles_list')
+def get_articles_list():
+ # 获取参数
+ args_dict = request.args
+ page = args_dict.get('p', '1')
+ per_page = args_dict.get('per_page', constants.HOME_PAGE_MAX_NEWS)
+ category_id = args_dict.get('cid', 1)
+
+ # 校验参数
+ try:
+ page = int(page)
+ per_page = int(per_page)
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.PARAMERR, errmsg='参数错误')
+
+ # 查询数据分页
+ filters = []
+ try:
+ paginate = Articles.query.order_by(Articles.create_time.desc()).paginate(page, per_page, False)
+ # 获取查询出来的数据
+ items = paginate.items
+ # 获取到总页数
+ total_page = paginate.pages
+ current_page = paginate.page
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.DBERR, errmsg='数据查询失败')
+
+ articles_list = []
+ for articles in items:
+ article_dict = {
+ 'id': articles.id,
+ 'title': articles.title,
+ 'digest': articles.digest,
+ 'index_image_url': articles.index_image_url,
+ 'create_time': articles.create_time,
+ 'clicks': articles.clicks,
+ 'tag': articles.tag
+ }
+
+ articles_list.append(article_dict)
+ return jsonify(errno=recode.OK, errmsg='OK', total_Page=total_page, current_Page=current_page, articles_List=articles_list)
+
+
+@index_blu.route('/info/')
+@user_login_data
+def articles_detail(articles_id):
+ blog_customer = g.blog_customer
+ customer_info = None
+ if blog_customer:
+ customer_info = {
+ 'customer_id': blog_customer.id if blog_customer else None,
+ 'nick_name': blog_customer.nick_name if blog_customer else None,
+ 'avatar_url': blog_customer.avatar_url if blog_customer else None
+ }
+ # 查询出详情数据
+ try:
+ article = Articles.query.filter_by(id=articles_id).scalar()
+ except Exception as e:
+ return jsonify(errno=recode.DBERR, errmsg='数据查询失败')
+ # 根据user_id查询出作者
+ try:
+ blog_customer = BlogCustomer.query.filter_by(id=article.user_id).scalar()
+ except Exception as e:
+ return jsonify(errno=recode.DBERR, errmsg='数据查询失败')
+
+
+ # 上一条数据
+ last_id = article.id - 1
+ last_article = None
+ try:
+ last_article = Articles.query.filter_by(id=last_id).scalar()
+ if not last_article:
+ last_id = None
+ except Exception:
+ last_id = None
+
+ # 下一条数据
+ next_id = article.id + 1
+ next_article = None
+ try:
+ next_article = Articles.query.filter_by(id=next_id).scalar()
+ if not next_article:
+ next_id = None
+ except Exception:
+ next_id = None
+
+ article_dict = {
+ 'id': article.id,
+ 'title': article.title,
+ 'user_name': blog_customer.nick_name if blog_customer else None,
+ 'email': blog_customer.email if blog_customer else None,
+ 'create_time': article.create_time,
+ 'clicks': article.clicks,
+ 'tag': article.tag,
+ 'digest': article.digest,
+ 'content': article.content,
+ 'last_id': last_id,
+ 'last_title': last_article.title if last_id else None,
+ 'next_id': next_id,
+ 'next_title': next_article.title if next_id else None
+ }
+
+ # # 获取当前新闻的评论
+ # comments = []
+ # try:
+ # comments = Comment.query.filter(Comment.articles_id==articles_id).order_by(Comment.like_count.desc(), Comment.create_time.desc()).all()
+ # except Exception as e:
+ # current_app.logger.error(e)
+ # comment_list = []
+ # pass
+
+
+ data = public()
+ data['customer_info'] = customer_info if customer_info else None
+ data['article_dict'] = article_dict
+ return render_template('info.html', data=data)
+
+
+def public():
+ # 获取博主个人信息
+ author = None
+ try:
+ author = BlogAuthor.query.get(1)
+ except Exception as e:
+ current_app.logger.error(e)
+
+ author = {
+ 'title': author.title,
+ 'keywords': author.keywords,
+ 'description': author.description,
+ 'wechat': author.wechat,
+ 'qq': author.qq,
+ 'email': author.email,
+ 'wechat_reword': author.Wechat_Reward,
+ 'logo': author.logo,
+ 'avator_url': author.avator_url,
+ 'name': author.name,
+ 'tag': author.tag,
+ 'about_me': author.about_me
+ }
+
+ # 获取排行数据
+ articles_list = None
+ try:
+ articles_list = Articles.query.order_by(Articles.clicks.desc()).limit(constants.Click_Max_Articles)
+ except Exception as e:
+ current_app.logger.error(e)
+
+ click_articles_list = []
+ for articles in articles_list if articles_list else []:
+ articles_dict = {
+ 'id': articles.id,
+ 'title': articles.title,
+ 'digest': articles.digest,
+ 'index_image_url': articles.index_image_url
+ }
+ click_articles_list.append(articles_dict)
+
+ # 站长推荐
+ r_articles_list = None
+ try:
+ r_articles_list = Articles.query.filter(Articles.recommend != None).order_by(Articles.recommend.desc()).limit(
+ constants.Recommend_Max_Articles)
+ except Exception as e:
+ current_app.logger.error(e)
+
+ recommend_articles_list = []
+ for r_articles in r_articles_list if r_articles_list else []:
+ r_articles_dict = {
+ 'id': r_articles.id,
+ 'title': r_articles.title,
+ 'digest': r_articles.digest,
+ 'index_image_url': r_articles.index_image_url
+ }
+ recommend_articles_list.append(r_articles_dict)
+
+ # 获取新闻分类数据
+ categories = Category.query.all()
+ # 定义列表保存分类数据
+ categories_dicts_list = []
+
+ for category in categories:
+ c_dict = {'id': category.id,
+ 'name': category.name}
+ categories_dicts_list.append(c_dict)
+
+ data = {
+ 'click_articles_list': click_articles_list,
+ 'author': author,
+ 'recommend_articles_list': recommend_articles_list,
+ 'categories': categories_dicts_list
+ }
+ return data
+
+@index_blu.route('/articles_comment', methods=['POST'])
+@user_login_data
+def add_articles_comment():
+ """添加评论"""
+
+ blog_customer = g.blog_customer
+ if not blog_customer:
+ return jsonify(errno=recode.SESSIONERR, errmsg='用户未登录')
+
+ # 获取数据
+ data_dict = request.json
+ articles_id = data_dict.get('articles_id')
+ comment_str = data_dict.get('comment')
+ parent_id = data_dict.get('parent_id')
+
+ if not all([articles_id, comment_str]):
+ return jsonify(errno=recode.PARAMERR, errmsg='参数不足')
+
+ try:
+ articles = Articles.query.get(articles_id)
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.DBERR, errmsg='查询数据失败')
+
+ if not articles:
+ return jsonify(errno=recode.NODATA, errmsg='该文章不存在或被删除')
+
+ # 数据保存
+ comment = Comment()
+ comment.user_id = blog_customer.id
+ comment.articles_id = articles_id
+ comment.content = comment_str
+ if parent_id:
+ comment.parent_id = parent_id
+
+ # 保存到数据库
+ try:
+ db.session.add(comment)
+ db.session.commit()
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.DBERR, errmsg='保存数据失败')
+
+ comment_dict = {
+ 'comment_id': comment.id,
+ 'comment_articlesid':comment.articles_id,
+ 'comment_user': comment.user,
+ 'comment_content': comment.user_id,
+ 'comment_create_time': comment.create_time,
+ }
+ return jsonify(errno=recode.OK, errmsg='评论成功', data=comment_dict)
\ No newline at end of file
diff --git a/info/module/passport/__init__.py b/info/module/passport/__init__.py
new file mode 100644
index 0000000..38d2e64
--- /dev/null
+++ b/info/module/passport/__init__.py
@@ -0,0 +1,5 @@
+from flask import Blueprint
+
+passport_blu = Blueprint('passport', __name__, url_prefix='/passport')
+
+from . import views
\ No newline at end of file
diff --git a/info/module/passport/views.py b/info/module/passport/views.py
new file mode 100644
index 0000000..d7e93a8
--- /dev/null
+++ b/info/module/passport/views.py
@@ -0,0 +1,251 @@
+import re
+import logging
+import smtplib
+from . import passport_blu
+from email.mime.text import MIMEText
+from email.header import Header
+from flask import request, session
+from flask import current_app, jsonify
+from flask import make_response
+from info import redis_store, db
+from info.utils.captcha.captcha import captcha
+from info.utils import recode, constants
+from info.model.user import BlogCustomer
+from datetime import datetime
+from random import choice
+
+logger = logging.getLogger(__name__)
+
+
+def sms_email(receiver, code):
+ # 使用网易发送邮箱验证码
+ sender = '1242861695@qq.com'
+ password = 'ykokjfhaadisigdg'
+
+ message = MIMEText(f'您的Blog验证码是B-{code},五分钟内有效!!!')
+ message['From'] = Header('Ye_Bolg', 'utf-8')
+ message['To'] = Header(receiver, 'utf-8')
+
+ subject = 'Blog注册'
+ message['Subject'] = Header(subject, 'utf-8')
+ try:
+ server = smtplib.SMTP_SSL('smtp.qq.com', 465) # SMTP协议 默认端口25
+ server.login(sender, password)
+ server.sendmail(sender, receiver, message.as_string())
+ server.quit()
+ except smtplib.SMTPException:
+ return -1
+
+
+@passport_blu.route('/image_code')
+def get_image_code():
+ """获取图片验证吗"""
+ code_id = request.args.get('imageCodeId')
+ # 生成验证吗
+ name, text, image = captcha.generate_captcha()
+ try:
+ # 保存当前生成的图片验证码内容
+ redis_store.setex(f'ImageCode_{code_id}', constants.Image_Timeout, text)
+ except Exception as e:
+ current_app.logger.error(e)
+ return make_response(jsonify(errno=recode.DATAERR, errmsg='保存数据失败!'))
+
+ # 返回响应内容
+ resp = make_response(image)
+ resp.headers['Content-Type'] = 'image/jpg'
+ return resp
+
+
+@passport_blu.route('/sms_code', methods=['POST'])
+def send_email_code():
+ """发送邮箱验证码"""
+ param_dict = request.json
+ email = param_dict.get('email')
+ image_code = param_dict.get('image_code')
+ image_code_id = param_dict.get('image_code_id')
+
+ if not all([email, image_code, image_code_id]):
+ return jsonify(errno=recode.PARAMERR, errmsg='参数不足')
+
+ if not re.match('^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$', email):
+ # 邮箱错误
+ return jsonify(errno=recode.DATAERR, errmsg='手机号不正确')
+
+ # 去redis查询图片验证吗内容
+ try:
+ real_image_code = redis_store.get(f'ImageCode_{image_code_id}')
+ if real_image_code:
+ real_image_code = real_image_code.decode()
+ redis_store.delete(f'ImageCode_{image_code_id}')
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.DBERR, errmsg='获取图片验证吗失败')
+
+ if not real_image_code:
+ return jsonify(errno=recode.NODATA, errmsg='验证码已过期')
+
+ if image_code.lower() != real_image_code.lower():
+ return jsonify(errno=recode.NODATA, errmsg='验证码输入错误')
+
+ # 校验该邮箱是否已经注册过
+ try:
+ user = BlogCustomer.query.filter_by(email=email).first()
+ except Exception as e:
+ return jsonify(errno=recode.DBERR, errmsg='数据库查询错误')
+ if user:
+ return jsonify(errno=recode.DATAEXTST, errmsg='该邮箱已被注册')
+
+ # 生成发送邮箱验证吗
+ result = ''.join(choice('0123456789') for _ in range(6))
+ a = sms_email(email, result)
+ if a == -1:
+ return jsonify(errno=recode.DATAERR, errmsg='发送邮箱验证码失败')
+ # 保存验证码内容
+ try:
+ redis_store.setex(f'SMS_{email}', constants.Verify_Code_Timeout, result)
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.DBERR, errmsg='保存短信验证吗失败')
+ return jsonify(errno=recode.OK, errmsg='发送成功')
+
+
+@passport_blu.route('/register', methods=['POST'])
+def register():
+ """邮箱注册"""
+ json_data = request.json
+ email = json_data.get('email')
+ sms_code = json_data.get('smscode')
+ password = json_data.get('password')
+
+ if not all([email, sms_code, password]):
+ return jsonify(errno=recode.PARAMERR, errmsg='参数不全')
+
+ # 从redis中获取指定邮箱对应的验证码
+ try:
+ real_sms_code = redis_store.get(f'SMS_{email}')
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.DBERR, errmsg='获取验证码失败')
+
+ if not real_sms_code:
+ return jsonify(errno=recode.NODATA, errmsg='短信验证码过期')
+
+ # 校验验证码
+ if sms_code != real_sms_code.decode():
+ return jsonify(errno=recode.DATAERR, errmsg='短信验证码错误')
+
+ # 删除验证码
+ try:
+ redis_store.delete(f'SMS_{email}')
+ except Exception as e:
+ current_app.logger.error(e)
+
+ # 初始化user模型
+ blog_customer = BlogCustomer()
+ blog_customer.email = email
+ blog_customer.password = password
+ blog_customer.nick_name = email
+
+ try:
+ db.session.add(blog_customer)
+ db.session.commit()
+ except Exception as e:
+ db.session.rollback()
+ current_app.logger.error(e)
+
+ # 数据保存错误
+ return jsonify(errno=recode.DATAERR, errmsg='数据保存失败')
+ # 保存用户的登录状态
+ session['customer_id'] = blog_customer.id
+ session['nick_name'] = blog_customer.nick_name
+ session['email'] = blog_customer.email
+
+ # 返回注册结果
+ return jsonify(errno=recode.OK, errmsg='OK')
+
+@passport_blu.route('/login', methods=['POST'])
+def login():
+ json_data = request.json
+
+ email = json_data.get('email')
+ password = json_data.get('password')
+
+ if not all([email, password]):
+ return jsonify(errno=recode.PARAMERR, errmsg='参数不全')
+
+ # 从数据库查询出指定用户
+ try:
+ blog_customer = BlogCustomer.query.filter_by(email=email).first()
+ except Exception as e:
+ current_app.logger.error(e)
+ return jsonify(errno=recode.DBERR, errmsg='查询数据错误')
+
+ if not blog_customer:
+ return jsonify(errno=recode.USERERR, errmsg='用户不存在')
+
+ # 校验密码
+ if not blog_customer.check_password(password):
+ return jsonify(errno=recode.PWDERR, errmsg='密码错误')
+
+ # 保存登录状态
+ session['customer_id'] = blog_customer.id
+ session['nick_name'] = blog_customer.nick_name
+ session['email'] = blog_customer.email
+
+ # 记录用户最后一次登录时间
+ blog_customer.last_login = datetime.now()
+
+ try:
+ db.session.commit()
+ except Exception as e:
+ current_app.logger.error(e)
+
+ return jsonify(errno=recode.OK, errmsg='OK')
+
+
+@passport_blu.route('/login_out', methods=['POST'])
+def logout():
+ """登出功能"""
+ session.pop('customer_id', None)
+ session.pop('nick_name', None)
+ session.pop('email', None)
+
+ return jsonify(errno=recode.OK, errmsg='OK')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/info/static/css/base.css b/info/static/css/base.css
new file mode 100755
index 0000000..70ea7f2
--- /dev/null
+++ b/info/static/css/base.css
@@ -0,0 +1,383 @@
+@charset "gb2312";
+/* css */
+* {
+ margin: 0;
+ padding: 0
+}
+
+body {
+ font: 14px "ź", Arial, Helvetica, sans-serif;
+ color: #555;
+ background: #f7f7f7;
+}
+
+img {
+ border: 0;
+ display: block
+}
+
+ul, li {
+ list-style: none;
+}
+
+/*Ĭɫ */
+a {
+ text-decoration: none;
+ color: #555
+}
+
+.clear {
+ clear: both;
+}
+
+.blank {
+ height: 8px;
+ overflow: hidden;
+ width: 100%;
+ margin: auto;
+ clear: both
+}
+
+.blank80 {
+ height: 100px;
+ overflow: hidden;
+ width: 100%;
+ margin: auto;
+ clear: both
+}
+
+.f_l {
+ float: left
+}
+
+.f_r {
+ float: right
+}
+
+.mt20 {
+ margin-top: 20px
+}
+
+header {
+ width: 100%;
+ background: rgba(255, 255, 255, 1);
+}
+
+article {
+ overflow: hidden
+}
+
+
+.tophead {
+ float: left;
+ width: 1350px;
+ margin-left: 100px;
+ margin-top: 0;
+ overflow: hidden;
+}
+
+/* nav */
+.logo {
+ float: left;
+ overflow: hidden;
+ font-size: 30px;
+ margin-top: 10px;
+ margin-left: 10px
+}
+
+.logo a {
+ color: #333
+}
+
+.logo img {
+ float: left
+}
+
+/**/
+.topnav {
+ float: left;
+ overflow: hidden;
+ width: 800px;
+ margin: 10px 0;
+}
+
+nav {
+ color: #999;
+ line-height: 32px;
+}
+
+nav ul {
+ text-align: right;
+}
+
+nav ul li {
+ display: inline;
+ font-size: 16px;
+ padding: 10px 20px;
+ height: 46px;
+ line-height: 46px;
+}
+
+/*ǰҳ*/
+#topnav_current {
+ color: #000;
+ border-bottom: #333 2px solid;
+ padding-bottom: 10px;
+}
+
+/*phone nav */
+#mnav {
+ display: none;
+ width: 100%;
+}
+
+#mnav h2 {
+ text-align: right;
+ color: #fff;
+ font-size: 18px;
+ height: 52px;
+ line-height: 52px;
+ padding-left: 10px;
+ width: 100%
+}
+
+#mnav h2.open {
+ text-align: right;
+ background: rgba(1, 1, 1, 0.8);
+ width: 100%;
+}
+
+#mnav ul {
+ display: none;
+ background: rgba(1, 1, 1, 0.8);
+ width: 100%;
+ padding-bottom: 40px
+}
+
+#mnav li {
+ height: 40px;
+ line-height: 40px;
+ vertical-align: top;
+ font-size: 16px;
+ display: block;
+ overflow: hidden;
+ text-align: center
+}
+
+#mnav li a {
+ color: #fff
+}
+
+/* Ĭϲ˵ */
+#mnav h2 .navicon {
+ margin-right: 15px;
+}
+
+.navicon {
+ display: inline-block;
+ position: relative;
+ width: 30px;
+ height: 5px;
+ background-color: #FFFFFF;
+}
+
+.navicon:before, .navicon:after {
+ content: '';
+ display: block;
+ width: 30px;
+ height: 5px;
+ position: absolute;
+ background: #FFFFFF;
+ -webkit-transition-property: margin, -webkit-transform;
+ transition-property: margin, -webkit-transform;
+ transition-property: margin, transform;
+ transition-property: margin, transform, -webkit-transform;
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+}
+
+.navicon:before {
+ margin-top: -10px;
+}
+
+.navicon:after {
+ margin-top: 10px;
+}
+
+/* չĿ */
+#mnav h2.open .navicon {
+ background: none
+}
+
+/* */
+#mnav h2.open .navicon:before {
+ margin-top: 0;
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+
+#mnav h2.open .navicon:after {
+ margin-top: 0;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
+
+#mnav h2.open .navicon:before, #mnav h2.open .navicon:after {
+ content: '';
+ display: block;
+ width: 30px;
+ height: 5px;
+ position: absolute;
+ background: #FFFFFF;
+ -webkit-transition-property: margin, -webkit-transform;
+ transition-property: margin, -webkit-transform;
+ transition-property: margin, transform;
+ transition-property: margin, transform, -webkit-transform;
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+}
+
+footer {
+ width: 100%;
+ background: #333;
+ color: #a5a4a4;
+ text-align: center;
+ padding: 20px 0;
+}
+
+footer a {
+ color: #a5a4a4
+}
+
+/* ҳ */
+.pagelist {
+ text-align: center;
+ color: #666;
+ width: 100%;
+ clear: both;
+ margin: 20px 0;
+ padding-top: 20px
+}
+
+.pagelist a {
+ color: #666;
+ margin: 0 2px;
+ border: 1px solid #000;
+ padding: 5px 10px;
+}
+
+.pagelist a:hover {
+ color: #f00;
+ text-decoration: underline
+}
+
+.pagelist > b {
+ border: 1px solid #000;
+ padding: 5px 10px;
+}
+
+/*content*/
+
+h1.t_nav span {
+ float: right;
+ color: #999
+}
+
+h1.t_nav {
+ border-bottom: #bfbfbf 1px solid;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 40px;
+ width: 100%;
+ overflow: hidden
+}
+
+h1.t_nav a {
+ width: 100px;
+ display: block;
+ text-align: center;
+ color: #fff;
+ float: left
+}
+
+.n1 {
+ background: #5EA51B;
+}
+
+.n2 {
+ background: #8BBF5D;
+}
+
+.litle {
+ font-size: 20px;
+ margin: 20px 0 0 0;
+ border-bottom: #d6d5d5 1px solid;
+ padding-bottom: 5px;
+ padding: 10px 0 10px 100px;
+ color: #000;
+ background: url(../images/jdbg.png) no-repeat left center;
+}
+
+.litle span {
+ float: right;
+ font-size: 14px;
+ color: #666;
+ font-weight: normal
+}
+
+.ab_box {
+ padding: 20px;
+ overflow: hidden;
+ background: rgba(255, 255, 255, 1);
+ margin-top: 20px
+}
+
+.login {
+ overflow: hidden;
+ float:right;
+ width: 250px;
+ margin-top: 10px;
+ margin-right: 10px;
+}
+
+.user_btns {
+ height: 46px;
+ overflow: hidden;
+}
+
+
+.user_btns a {
+ line-height: 46px;
+ color: #666;
+}
+
+.user_btns a:hover {
+ color: #39f;
+}
+
+.user_login{
+ height: 46px;
+ overflow: hidden;
+ display: block;
+}
+
+.user_login img {
+ float: left;
+ width: 46px;
+ border-radius: 15px;
+}
+
+.user_login a {
+ float: left;
+ font-size: 14px;
+ margin-left: 10px;
+ color: #39f;
+ line-height: 46px;
+}
+
+/* ҳʽ */
+
+.pagenation{height:32px;text-align:center;font-size:0;margin:30px auto;}
+.pagenation span{display:inline-block;border:1px solid #d2d2d2;background-color:#f8f6f7;font-size:12px;padding:7px 10px;color:#666;margin:5px}
+
+.pagenation .active{background-color:#fff;color:#43a200}
\ No newline at end of file
diff --git a/info/static/css/index.css b/info/static/css/index.css
new file mode 100755
index 0000000..36566e4
--- /dev/null
+++ b/info/static/css/index.css
@@ -0,0 +1,911 @@
+@charset "gb2312";
+.picshow {
+ width: 100%;
+ overflow: hidden;
+ margin: 20px auto;
+}
+
+.picshow li {
+ width: 20%;
+ display: inline-block;
+ float: left;
+ overflow: hidden;
+ position: relative;
+}
+
+.picshow li i {
+ overflow: hidden;
+ display: block;
+ height: 400px;
+}
+
+.picshow li img {
+ display: block;
+ width: 100%;
+ transition: all .5s;
+}
+
+.picshow li:hover img {
+ transform: scale(1.05, 1.05);
+ opacity: 1;
+}
+
+.picshow li:hover .font::before, .picshow li:hover .font::after {
+ opacity: 1;
+ transform: scale(1);
+ transition: all 0.5s;
+}
+
+.picshow li .font {
+ color: #fff;
+ padding: 0;
+ margin: 0;
+ -moz-backface-visibility: hidden;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-transition: all .4s ease-in-out;
+ -moz-transition: all .4s ease-in-out;
+ -o-transition: all .4s ease-in-out;
+ -ms-transition: all .4s ease-in-out;
+ transition: all .4s ease-in-out;
+ overflow: hidden
+}
+
+.picshow li .font::before, .picshow li .font::after {
+ position: absolute;
+ content: '';
+ opacity: 0;
+ -webkit-transition: opacity 0.4s, -webkit-transform .4s;
+ -moz-transition: opacity 0.4s, -moz-transform .4s;
+ -o-transition: opacity 0.4s, -o-transform .4s;
+ transition: opacity 0.4s, transform .4s
+}
+
+.picshow li .font::before {
+ top: 14%;
+ right: 5%;
+ bottom: 14%;
+ left: 5%;
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ -webkit-transform: scale(0, 1);
+ -moz-transform: scale(0, 1);
+ -o-transform: scale(0, 1);
+ transform: scale(0, 1);
+ -webkit-transform-origin: 0 0;
+ -moz-transform-origin: 0 0;
+ -o-transform-origin: 0 0;
+ transform-origin: 0 0
+}
+
+.picshow li .font::after {
+ top: 8%;
+ right: 10%;
+ bottom: 8%;
+ left: 10%;
+ border-right: 1px solid #fff;
+ border-left: 1px solid #fff;
+ -webkit-transform: scale(1, 0);
+ -moz-transform: scale(1, 0);
+ -o-transform: scale(1, 0);
+ transform: scale(1, 0);
+ -webkit-transform-origin: 100% 0;
+ -moz-transform-origin: 100% 0;
+ -o-transform-origin: 100% 0;
+ transform-origin: 100% 0
+}
+
+.picshow li .font h3 {
+ font-size: 16px;
+ font-weight: 700;
+ text-align: center;
+ width: 80%;
+ position: absolute;
+ top: 50%;
+ left: 10%;
+ background: rgba(0, 0, 0, 0.5);
+ line-height: 1.9;
+ -webkit-transition: all .5s ease-in-out;
+ -moz-transition: all .5s ease-in-out;
+ -o-transition: all .5s ease-in-out;
+ -ms-transition: all .5s ease-in-out;
+ transition: all .5s ease-in-out;
+ overflow: hidden;
+ opacity: 0
+}
+
+.picshow li:hover .font h3 {
+ top: 45%;
+ opacity: 1
+}
+
+article {
+ width: 1200px;
+ margin: auto
+}
+
+/* rightbox */
+.blogs {
+ float: left;
+ width: 70%;
+ overflow: hidden;
+}
+
+.blogs li {
+ margin-bottom: 10px;
+ overflow: hidden;
+ padding: 20px;
+ background: #fff
+}
+
+h3.blogtitle {
+ line-height: 30px;
+ height: 30px;
+ margin: 10px 0;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap
+}
+
+.blogpic {
+ overflow: hidden;
+ width: 30%;
+ display: block;
+ float: left;
+ margin-right: 20px;
+ border-radius: 5px;;
+}
+.autor {
+ width: 100%;
+ overflow: hidden;
+ clear: both;
+ margin: 20px 0 0 0;
+ display: inline-block;
+ color: #838383;
+ font-size: 12px
+}
+
+.autor span {
+ margin-right: 10px;
+ padding-left: 20px
+}
+
+.autor span a {
+ color: #096;
+}
+
+.autor span a:hover {
+ text-decoration: underline
+}
+
+.lm {
+ background: url(../images/newsbg01.png) no-repeat left center
+}
+
+.dtime {
+ background: url(../images/newsbg02.png) no-repeat left center
+}
+
+.viewnum {
+ background: url(../images/newsbg04.png) no-repeat left center
+}
+
+.pingl {
+ background: url(../images/newsbg03.png) no-repeat left center
+}
+
+.blogpic img {
+ /*width: 100%*/
+ width: 240px;
+ height: 160px;
+}
+
+.bloginfo p {
+ color: #888;
+ line-height: 24px
+}
+
+.more {
+ font-size: 14px;
+}
+
+.pages {
+ padding: 0 60px 25px;
+ text-align: right
+}
+
+.pages span {
+ background: #B29C77;
+ color: #fff;
+}
+
+.pages a {
+ background: #fff;
+ color: #454545;
+ padding: 5px 8px;
+ border: none;
+ margin: 0 0 0 5px;
+}
+
+.pages span {
+ padding: 5px 8px;
+ border: none;
+ margin: 0 0 0 5px;
+}
+
+.pages a:hover {
+ background: #CCC;
+}
+
+.sidebar {
+ float: right;
+ width: 28%;
+ overflow: hidden;
+ position: relative
+}
+
+.about {
+ background: #FFF url(../images/banner.png) no-repeat top center;
+ overflow: hidden;
+}
+
+.avatar {
+ margin: 80px auto 20px;
+ width: 100px
+}
+
+.avatar img {
+ width: 100px;
+ border-radius: 50%
+}
+
+.abname {
+ color: #3f3f3f;
+ font-weight: bold;
+ font-size: 16px;
+ margin-bottom: 10px;
+ text-align: center
+}
+
+.abposition {
+ color: #1abc9c;
+ text-align: center
+}
+
+.abtext {
+ padding: 20px 40px;
+ color: #9a9a9a;
+ line-height: 26px
+}
+
+.readmore {
+ float: right;
+}
+
+/*search*/
+.search {
+ background: #FFF;
+ overflow: hidden;
+ padding: 20px;
+ margin: 20px 0
+}
+
+.input_text {
+ padding-left: 5px;
+ border: 1px solid #ccc;
+ width: 70%;
+ height: 26px;
+ line-height: 26px;
+ background-color: #f2f2f2;
+ float: left;
+}
+
+.input_submit {
+ background-color: #333;
+ color: #FFF;
+ float: left;
+ width: 20%;
+ border: none;
+ cursor: pointer;
+ height: 28px;
+ line-height: 28px;
+}
+
+/*tags*/
+.cloud {
+ width: 100%;
+ clear: both;
+ overflow: hidden;
+ background: #fff;
+ margin-bottom: 20px
+}
+
+.cloud ul {
+ padding: 20px;
+ overflow: hidden;
+}
+
+.cloud ul a {
+ line-height: 24px;
+ height: 24px;
+ display: block;
+ background: #999;
+ float: left;
+ padding: 3px 11px;
+ margin: 10px 10px 0 0;
+ border-radius: 8px;
+ -moz-transition: all 0.5s;
+ -webkit-transition: all 0.5s;
+ -o-transition: all 0.5s;
+ transition: all 0.5s;
+ color: #FFF
+}
+
+.cloud ul a:nth-child(8n-7) {
+ background: #8A9B0F
+}
+
+.cloud ul a:nth-child(8n-6) {
+ background: #EB6841
+}
+
+.cloud ul a:nth-child(8n-5) {
+ background: #3FB8AF
+}
+
+.cloud ul a:nth-child(8n-4) {
+ background: #FE4365
+}
+
+.cloud ul a:nth-child(8n-3) {
+ background: #FC9D9A
+}
+
+.cloud ul a:nth-child(8n-2) {
+ background: #EDC951
+}
+
+.cloud ul a:nth-child(8n-1) {
+ background: #C8C8A9
+}
+
+.cloud ul a:nth-child(8n) {
+ background: #83AF9B
+}
+
+.cloud ul a:first-child {
+ background: #036564
+}
+
+.cloud ul a:last-child {
+ background: #3299BB
+}
+
+.cloud ul a:hover {
+ border-radius: 0;
+ text-shadow: #000 1px 1px 1px
+}
+
+
+.hometitle {
+ padding: 0 10px;
+ line-height: 50px;
+ height: 50px;
+ font-size: 18px;
+ border-bottom: 1px solid #e5e5e5;
+ color: #333;
+ position: relative
+}
+
+.hometitle:after {
+ content: '';
+ position: absolute;
+ height: 2px;
+ width: 0;
+ right: inherit;
+ top: inherit;
+ left: 0;
+ bottom: -1px;
+ background: #333;
+ transition: 2s ease all;
+}
+
+.hometitle:hover:after {
+ width: 100%;
+ transition: 2s ease all;
+}
+
+.paihang {
+ background: #FFF;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-bottom: 20px
+}
+
+.paihang ul {
+ padding: 10px;
+}
+
+.paihang ul li {
+ border-bottom: solid 1px #EAEAEA;
+ font-size: 14px;
+ margin: 0 0 10px 0;
+ padding: 0 0 10px 0;
+ height: 165px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.paihang ul li b {
+ height: 30px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ display: block;
+}
+
+.paihang ul li p {
+ line-height: 24px;
+ color: #888;
+}
+
+.paihang ul li a:hover {
+ color: #000;
+}
+
+.paihang ul li:hover p {
+ color: #000;
+}
+
+.paihang ul li:hover b a {
+ color: #000;
+}
+
+.paihang li i {
+ width: 100px;
+ height: 90px;
+ overflow: hidden;
+ display: block;
+ border: #efefef 1px solid;
+ float: left;
+ margin-right: 10px
+}
+
+.paihang li img {
+ height: 100%;
+ margin: auto;
+ -moz-transition: all .5s ease;
+ -webkit-transition: all .5s ease;
+ transition: all .5s ease;
+}
+
+.paihang ul li:hover i img {
+ transform: scale(1.1)
+}
+
+/*links*/
+.links {
+ width: 100%;
+ background: #FFF;
+ overflow: hidden;
+}
+
+.links ul {
+ padding: 20px;
+ overflow: hidden
+}
+
+.links ul a {
+ line-height: 24px;
+ margin: 0 10px 0 0;
+ display: block;
+ float: left
+}
+
+.links ul a:hover {
+ text-decoration: underline
+}
+
+.weixin {
+ background: #FFF;
+ overflow: hidden;
+ margin: 20px 0;
+}
+
+.weixin img {
+ width: 100%
+}
+
+/*lmnav*/
+.lmnav {
+ background: #FFF;
+ overflow: hidden;
+ margin-bottom: 20px
+}
+
+.lmnav li {
+ border-bottom: 1px dashed #CCCCCC;
+ margin: 10px;
+ padding-bottom: 5px;
+ padding-left: 10px;
+ font-weight: bold
+}
+
+.lmnav li a {
+ color: #333;
+}
+
+.lmnav li a:hover {
+ color: #096
+}
+
+.lmnav li ul li {
+ border: none;
+ margin: 0 0 0 30px;
+ padding: 5px 0;
+ font-weight: normal
+}
+
+.navbor {
+ border: #333 1px solid;
+ position: relative;
+ margin: 20px;
+ background: url(../images/navbg.png) no-repeat bottom right;
+ background-size: 70% 70%;
+}
+
+.navbor:before {
+ content: "";
+ width: 100px;
+ height: 20px;
+ background: #fff;
+ top: -10px;
+ left: 0;
+ position: absolute
+}
+
+.navbor:after {
+ content: "";
+ width: 20px;
+ height: 100px;
+ background: #fff;
+ top: -10px;
+ left: -10px;
+ position: absolute
+}
+
+.picbox {
+ width: 72%;
+ float: left;
+ overflow: hidden;
+ margin-top: 20px
+}
+
+.picbox ul {
+ overflow: hidden;
+ width: 268px;
+ float: left;
+ margin-right: 16px
+}
+
+.picbox ul li {
+ display: block;
+ background: #FFF;
+ margin: 0 0 20px 0;
+ border: 1px #d9d9d9 solid;
+}
+
+.picbox ul li i {
+ margin: 10px;
+ height: auto;
+ overflow: hidden;
+ display: block;
+}
+
+.picbox ul li img {
+ width: 100%;
+}
+
+.picinfo h3 {
+ border-bottom: #ccc 1px solid;
+ padding: 20px 0;
+ margin: 0 20px
+}
+
+.picinfo span {
+ padding: 20px;
+ display: block;
+ color: #666
+}
+
+.infos {
+ float: left;
+ width: 70%;
+ overflow: hidden;
+ background: #FFF;
+ margin: 20px 0
+}
+
+.newsview {
+ padding: 0 30px
+}
+
+.intitle {
+ line-height: 40px;
+ height: 40px;
+ font-size: 14px;;
+ border-bottom: #000 2px solid;
+}
+
+.intitle a {
+ font-weight: normal;
+}
+
+.news_title {
+ font-size: 24px;
+ font-weight: normal;
+ padding: 20px 0;
+ color: #333;
+}
+
+.news_author {
+ width: 100%;
+ color: #999;
+ line-height: 18px;
+}
+
+.news_author span {
+ margin-right: 10px;
+ padding-left: 20px
+}
+
+.au01 {
+ background: url(../images/author2.png) no-repeat left center
+}
+
+.au02 {
+ background: url(../images/date.png) no-repeat left center
+}
+
+.au03 b {
+ color: #333;
+ padding: 0 5px
+}
+
+.au04 {
+ font-weight: normal;
+}
+
+.news_about {
+ color: #888888;
+ border: 1px solid #F3F3F3;
+ padding: 10px;
+ margin: 20px auto 15px auto;
+ line-height: 23px;
+ background: none repeat 0 0 #F6F6F6;
+}
+
+.news_about strong {
+ color: #38485A;
+ font-weight: 400 !important;
+ font-size: 13px;
+ padding-right: 8px;
+}
+
+.news_content {
+ line-height: 24px;
+ font-size: 14px;
+}
+
+.news_content p {
+ overflow: hidden;
+ padding-bottom: 4px;
+ padding-top: 6px;
+ word-wrap: break-word;
+}
+
+.tags a {
+ background: #F4650E;
+ padding: 3px 8px;
+ margin: 0 5px 0 0;
+ color: #fff;
+}
+
+.tags {
+ margin: 10px 0;
+}
+
+.news_infos {
+ line-height: 24px;
+ text-align: justify;
+}
+
+.news_infos p {
+ margin-bottom: 10px
+}
+
+.news_infos img {
+ max-width: 650px;
+ height: auto;
+}
+
+.share {
+ padding: 20px;
+}
+
+.nextinfo {
+ line-height: 24px;
+ width: 100%;
+ background: #FFF;
+ border-radius: 10px;
+ overflow: hidden;
+ margin: 20px 0
+}
+
+/*????????*/
+.nextinfo p {
+ padding: 4px 10px;
+ border-radius: 5px;
+}
+
+.nextinfo a:hover {
+ color: #000;
+ text-decoration: underline
+}
+
+/*???????*/
+.otherlink, .xzsm, .ffsm {
+ width: 100%;
+ background: #FFF;
+ border-radius: 10px;
+ overflow: hidden;
+ margin: 20px 0
+}
+
+.otherlink h2 {
+ border-bottom: #000 2px solid;
+ line-height: 40px;
+ font-size: 14px;
+ background: url(../images/5794.png) left 10px center no-repeat;
+ padding-left: 40px;
+ color: #000
+}
+
+.otherlink ul {
+ margin: 10px 0
+}
+
+.otherlink li {
+ line-height: 24px;
+ height: 24px;
+ display: block;
+ width: 290px;
+ float: left;
+ overflow: hidden;
+ margin-right: 30px;
+ padding-left: 10px;
+}
+
+.otherlink li a:hover {
+ text-decoration: underline;
+ color: #000
+}
+
+/*????????*/
+.news_pl {
+ /*margin: 10px 0;*/
+ width: 100%;
+ background: #FFF;
+ border-radius: 10px;
+ overflow: hidden;
+ margin: 20px 0
+}
+
+.news_pl h2 {
+ background: url(../images/newsbg03.png) no-repeat left 10px center;
+ border-bottom: #000 2px solid;
+ line-height: 40px;
+ font-size: 14px;
+ padding-left: 30px;
+ color: #000
+}
+
+.xzsm ul, .ffsm ul {
+ padding: 20px;
+ line-height: 24px;
+ border-top: 6px solid #a6b5c5;
+}
+
+.bt-blue {
+ display: block;
+ line-height: 40px;
+ height: 40px;
+ background: #1e8ec5;
+ width: 100px;
+ text-align: center;
+}
+
+.bt-blue a {
+ color: #fff
+}
+
+.gbko {
+ padding: 10px;
+ background: #fff;
+}
+
+.ad {
+ overflow: hidden
+}
+
+.ad img {
+ width: 100%
+}
+
+.leftbox {
+ width: 70%;
+ float: left;
+ overflow: hidden;
+}
+
+.rightbox {
+ width: 28%;
+ float: right;
+ overflow: hidden;
+}
+
+.aboutme {
+ overflow: hidden;
+ background: #fff;
+}
+
+.ab_con {
+ line-height: 30px;
+ padding: 10px;
+}
+
+.ab_con p {
+ background: #f6f6f6;
+ margin: 5px 0;
+ padding-left: 10px;
+ border-radius: 5px;
+ text-shadow: rgba(255, 255, 255, 0.3) 0px 1px 0px;
+}
+
+.ab_box .avatar {
+ width: 100px;
+ height: 100px;
+ overflow: hidden;
+ border-radius: 50px;
+ margin: 10px auto 0;
+}
+
+.ab_box .avatar img {
+ width: 100px;
+ height: 100px
+}
+
+.ab_box .news_infos {
+ padding: 30px 0
+}
+
+.meandblog {
+ padding: 20px;
+ border-radius: 10px;
+ overflow: hidden;
+ margin: 0 0 20px 0;
+}
+
+.meandblog li {
+ background: #f1f1f1;
+ line-height: 30px;
+ margin: 5px 0;
+ padding: 0 0 0 10px;
+ border-radius: 10px;
+ border-top: 2px solid #e2e2e2;
+ text-shadow: #eae7e7 0 0 1px;
+}
+
+.meandblog li a:hover {
+ color: #000
+}
\ No newline at end of file
diff --git a/info/static/css/m.css b/info/static/css/m.css
new file mode 100755
index 0000000..a789d4b
--- /dev/null
+++ b/info/static/css/m.css
@@ -0,0 +1,426 @@
+@charset "gb2312";
+
+/* ����960px����1199px */
+@media screen and (min-width: 960px) and (max-width: 1199px) {
+ header, .tophead, article {
+ width: 100%
+ }
+
+ nav ul li {
+ padding: 10px 10px;
+ }
+
+ .picshow li i {
+ overflow: hidden;
+ display: block;
+ height: 400px;
+ }
+
+ .picshow .font {
+ display: none
+ }
+
+ .text img {
+ width: 100%
+ }
+
+ .rightbox {
+ margin-right: 0
+ }
+
+ .picbox {
+ width: 72%;
+ }
+
+ .picbox ul {
+ width: 32%;
+ margin-right: 0
+ }
+
+ .picbox ul:nth-child(2) {
+ margin: 0 5px
+ }
+}
+
+/* ����768px����959px */
+@media screen and (min-width: 768px) and (max-width: 959px) {
+ header, .tophead, article {
+ width: 100%
+ }
+
+ nav ul li {
+ padding: 10px 5px;
+ }
+
+ .blogs {
+ width: 65%
+ }
+
+ .sidebar {
+ width: 33%
+ }
+
+ .picshow li i {
+ overflow: hidden;
+ display: block;
+ height: 300px;
+ }
+
+ .picshow .font {
+ display: none
+ }
+
+ .text img {
+ width: 100%
+ }
+
+ .news_infos img {
+ width: 100%
+ }
+
+ h3.blogtitle {
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ }
+
+ .picbox {
+ width: 67%;
+ }
+
+ .picbox ul {
+ width: 32%;
+ margin-right: 0
+ }
+
+ .picbox ul:nth-child(2) {
+ margin: 0 5px
+ }
+
+ .paihang li i {
+ width: 98%
+ }
+
+ .infos {
+ width: 65%;
+ }
+
+ .ad {
+ display: none
+ }
+}
+
+/* ����480px����767px */
+@media only screen and (min-width: 480px) and (max-width: 767px) {
+ header, .tophead, article {
+ width: 100%
+ }
+
+ header {
+ height: 66px;
+ margin-bottom: 10px;
+ }
+
+ nav {
+ display: none;
+ }
+
+ #mnav {
+ display: block;
+ position: fixed;
+ z-index: 999999;
+ }
+
+ .navicon, .navicon:before, .navicon:after {
+ background: #000
+ }
+
+ #mnav h2 #mnav h2.open .navicon {
+ background: rgba(1, 1, 1, 0)
+ }
+
+ /* ʹ�ñ���ɫ�����м���� */
+ .picshow li i {
+ overflow: hidden;
+ display: block;
+ height: 200px;
+ }
+
+ .picshow .font, .litle span {
+ display: none
+ }
+
+ .text img {
+ width: 100%
+ }
+
+ .blogs {
+ width: 62%
+ }
+
+ .sidebar {
+ width: 36%
+ }
+
+ .rightbox {
+ width: 40%;
+ }
+
+ .leftbox {
+ width: 60%
+ }
+
+ .news_infos img {
+ width: 100%
+ }
+
+ .blogpic {
+ width: 100%;
+ height: 150px;
+ display: block
+ }
+
+ h3.blogtitle {
+ clear: both;
+ padding-top: 10px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ }
+
+ .readmore {
+ display: block;
+ overflow: hidden;
+ width: 100%;
+ text-align: center;
+ background: #f2f2f2;
+ padding: 10px 0;
+ margin-top: 10px;
+ clear: both
+ }
+
+ .paihang li i {
+ width: 98%
+ }
+
+ .picbox {
+ width: 64%;
+ }
+
+ .picbox ul {
+ width: 32%;
+ margin-right: 0
+ }
+
+ .picbox ul:nth-child(2) {
+ margin: 0 5px
+ }
+
+ h1.t_nav span {
+ display: none
+ }
+
+ .infos {
+ width: 62%;
+ }
+
+ .ad {
+ display: none
+ }
+}
+
+@media only screen and (min-width: 360px) and (max-width: 479px) {
+ header, .tophead, article, .leftbox, .sidebar, .blogs {
+ width: 100%
+ }
+
+ header {
+ height: 66px;
+ margin-bottom: 10px;
+ }
+
+ nav, .litle span {
+ display: none;
+ }
+
+ #mnav {
+ display: block;
+ position: fixed;
+ z-index: 999999;
+ }
+
+ .navicon, .navicon:before, .navicon:after {
+ background: #000
+ }
+
+ #mnav h2 #mnav h2.open .navicon {
+ background: rgba(1, 1, 1, 0)
+ }
+
+ /* ʹ�ñ���ɫ�����м���� */
+ .picshow li i {
+ overflow: hidden;
+ display: block;
+ height: 100px;
+ }
+
+ .picshow .font {
+ display: none
+ }
+
+ .text img {
+ width: 100%
+ }
+
+ .news_infos img {
+ width: 100%
+ }
+
+ .rightbox {
+ width: 100%;
+ }
+
+ .blogpic {
+ width: 100%;
+ height: 150px;
+ display: block
+ }
+
+ h3.blogtitle {
+ clear: both;
+ padding-top: 10px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ }
+
+ .readmore {
+ display: block;
+ overflow: hidden;
+ width: 100%;
+ text-align: center;
+ background: #f2f2f2;
+ padding: 10px 0;
+ margin-top: 10px;
+ clear: both
+ }
+
+ .picbox {
+ width: 100%
+ }
+
+ .picbox ul {
+ width: 100%;
+ margin: 0
+ }
+
+ h1.t_nav span {
+ display: none
+ }
+
+ .infos {
+ width: 100%;
+ }
+
+ .ad {
+ display: none
+ }
+}
+
+@media only screen and (max-width: 359px) {
+ header, .tophead, article, .leftbox, .sidebar, .blogs {
+ width: 100%
+ }
+
+ header {
+ height: 66px;
+ margin-bottom: 10px;
+ }
+
+ nav, .litle span {
+ display: none;
+ }
+
+ #mnav {
+ display: block;
+ position: fixed;
+ z-index: 999999;
+ }
+
+ .navicon, .navicon:before, .navicon:after {
+ background: #000
+ }
+
+ #mnav h2 #mnav h2.open .navicon {
+ background: rgba(1, 1, 1, 0)
+ }
+
+ /* ʹ�ñ���ɫ�����м���� */
+ .picshow li i {
+ overflow: hidden;
+ display: block;
+ height: 100px;
+ }
+
+ .picshow .font {
+ display: none
+ }
+
+ .text img {
+ width: 100%
+ }
+
+ .rightbox {
+ width: 100%;
+ }
+
+ .news_infos img {
+ width: 100%
+ }
+
+ .blogpic {
+ width: 100%;
+ height: 150px;
+ display: block
+ }
+
+ h3.blogtitle {
+ clear: both;
+ padding-top: 10px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ }
+
+ .readmore {
+ display: block;
+ overflow: hidden;
+ width: 100%;
+ text-align: center;
+ background: #f2f2f2;
+ padding: 10px 0;
+ margin-top: 10px;
+ clear: both
+ }
+
+ .picbox {
+ width: 100%
+ }
+
+ .picbox ul {
+ width: 100%;
+ margin: 0
+ }
+
+ h1.t_nav span {
+ display: none
+ }
+
+ .infos {
+ width: 100%;
+ }
+
+ .ad {
+ display: none
+ }
+}
diff --git a/info/static/css/main.css b/info/static/css/main.css
new file mode 100755
index 0000000..d800818
--- /dev/null
+++ b/info/static/css/main.css
@@ -0,0 +1,1321 @@
+body{
+ background:#f1f2f6;
+ font-family:'Microsoft YaHei';
+}
+.header_con{
+ height:59px;
+ background:#fff;
+ border-bottom:1px solid #ccc;
+}
+.header{
+ width:1200px;
+ height:59px;
+ margin:0px auto;
+}
+
+
+.menu{
+ width:600px;
+ height:59px;
+ margin-left:100px;
+}
+
+.menu li{
+ height:59px;
+ float:left;
+}
+
+.menu .active{
+ border-bottom:2px solid #009afc;
+}
+
+.menu .active a{
+ color:#39f;
+}
+
+.menu li a{
+ display:block;
+ line-height:59px;
+ padding:0px 25px;
+ font-size:14px;
+ color:#666;
+}
+
+.menu li a:hover{
+ color:#39f;
+}
+
+.conter_con{
+ width:1200px;
+ overflow:hidden;
+ margin:20px auto 0;
+}
+
+.list_con{
+ width:820px;
+}
+
+.list_con li{
+ background:#fff;
+ height:168px;
+ border:1px solid #ececee;
+ overflow:hidden;
+ margin-bottom:12px;
+}
+
+.list_con .news_pic{
+ width:168px;
+ height:168px;
+}
+
+.list_con .news_pic img{
+ width:168px;
+ height:168px;
+}
+
+.list_con .news_title{
+ width:616px;
+ height:18px;
+ margin:16px 0 0 16px;
+ font-size:18px;
+ line-height:18px;
+ color:#000;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+
+
+.list_con .news_title:hover{
+ color:#39f;
+}
+
+.list_con .news_detail{
+ width:616px;
+ height:88px;
+ margin:10px 0 0 16px;
+ font-size:14px;
+ line-height:23px;
+ color:#666;
+}
+
+.author_info{
+ width:616px;
+ height:20px;
+ margin-left:16px;
+}
+
+.author img{
+ float:left;
+}
+
+.author a{
+ float:left;
+ font-size:12px;
+ color:#333;
+ line-height:20px;
+ margin-left:5px;
+}
+.author a:hover{
+ color:#39f;
+}
+
+.source{
+ float:left;
+ line-height:20px;
+ font-size:12px;
+ color:#999;
+}
+
+.time{
+ float:left;
+ margin-left:15px;
+ line-height:20px;
+ font-size:12px;
+ text-indent:20px;
+ color:#999;
+ background:url(../images/clock.png) left center no-repeat;
+}
+
+.rank_con{
+ width:358px;
+ border:1px solid #ececee;
+}
+.card_list_con{
+ width:760px;
+ overflow:hidden;
+ margin-left:10px;
+}
+
+.card_list{
+ width:300px;
+ height: 160px;
+ margin:20px;
+ float:left;
+}
+
+.author_card{
+ background:#fff;
+ margin-bottom:10px;
+ overflow: hidden;
+ padding:20px;
+}
+
+.author_pic{
+ float:left;
+ width:60px;
+ height:60px;
+}
+.author_pic img{
+ width:60px;
+ height:60px;
+ border-radius:30px;
+}
+.author_name{
+ float: left;
+ color:#333;
+ font-size:22px;
+ line-height:60px;
+ margin-left:16px;
+}
+.author_name:hover{
+ color:#1482f0;
+}
+
+.author_resume{
+ width:100%;
+ float: left;
+ font-size:13px;
+ color:#666;
+ margin-top:10px;
+}
+
+.writings,.follows{
+ float: left;
+ margin:20px 30px 0 0;
+}
+
+.writings span,.follows span{
+ display: block;
+ font-size:12px;
+ color:#999;
+}
+
+.writings b,.follows b{
+ display: block;
+ font-weight:normal;
+ font-size:18px;
+ color:#333;
+}
+
+.rank_title{
+ height:53px;
+ background:#fff;
+ border-bottom:1px solid #ececee;
+}
+
+.rank_title h3{
+ line-height:53px;
+ font-size:14px;
+ color:#000;
+ text-indent:52px;
+ background:url(../images/hit_icon.png) 20px center no-repeat;
+}
+
+.rank_list{
+ background:#fff;
+}
+
+.rank_list li{
+ width:316px;
+ margin:0px auto;
+ border-bottom:1px solid #ececee;
+ padding:18px 0px;
+ overflow:hidden;
+}
+
+.rank_list li span{
+ float:left;
+ width:19px;
+ height:19px;
+ line-height:19px;
+ text-align:center;
+ border-radius:2px;
+ margin-right:11px;
+ color:#1482f0;
+}
+
+.rank_list li a{
+ float:left;
+ width:286px;
+ font-size:14px;
+ color:#333;
+}
+
+.rank_list li a:hover{
+ color:#39f;
+}
+
+.rank_list li .first{
+ background: #f33;
+ color:#fff;
+}
+
+.rank_list li .second{
+ background:#ff722b;
+ color:#fff;
+}
+
+.rank_list li .third{
+ background:#fa3;
+ color:#fff;
+}
+
+.footer{
+ margin-top:20px;
+ background:#262F38;
+ overflow:hidden;
+}
+.footer_links{
+ text-align:center;
+ margin-top:20px;
+}
+
+.footer_links a,.footer_links span{
+ color:#fff;
+ font-size:12px;
+
+}
+
+.footer_links span{
+ margin:0 5px;
+}
+
+.copyright{
+ text-align:center;
+ font-size:12px;
+ color:#fff;
+ line-height:26px;
+ margin-top:9px;
+ margin-bottom:20px;
+}
+
+
+.login_form_con,.register_form_con{
+ display:none;
+}
+
+
+.login_form,.register_form{
+ width:350px;
+ height:400px;
+ position:fixed;
+ background:#fff;
+ border-radius:5px;
+ left:50%;
+ top:50%;
+ margin-left:-175px;
+ margin-top:-200px;
+ z-index:9999;
+}
+
+.register_form{
+ height:500px;
+ margin-top:-250px;
+}
+
+.mask{
+ position:fixed;
+ width:100%;
+ height:100%;
+ background:#000;
+ opacity:0.3;
+ filter:alpha(opacity=30);
+ left:0px;
+ top:0px;
+ z-index:9998;
+}
+
+.login_title,.register_title{
+ height:72px;
+ border-bottom:1px solid #dcdcdc;
+ position:relative;
+}
+.login_title h3,.register_title h3{
+ line-height:72px;
+ text-align:center;
+ font-size:18px;
+ color:#1482f0;
+}
+
+.login_title a,.register_title a{
+ width:16px;
+ height:16px;
+ background:url(../images/shutoff.png) left top no-repeat;
+ font-weight:normal;
+ color:#999;
+ position:absolute;
+ right:20px;
+ top:30px;
+}
+
+.login_title a:hover,.register_title a:hover{
+ background:url(../images/shutoff.png) right top no-repeat;
+}
+
+.form_group{
+ width:310px;
+ height:50px;
+ border-bottom:1px solid #ebebeb;
+ margin:23px auto 0;
+ position:relative;
+}
+
+.form_group2{
+ width:310px;
+ margin:20px auto 0;
+ font-size:12px;
+ color:#999;
+ position:relative;
+}
+
+.register_form .form_group{
+ margin:15px auto 0;
+}
+
+.register_form .input_sub{
+ margin:30px auto 0;
+}
+
+.form_group .error_tip,.form_group2 .error_tip{
+ position:absolute;
+ font-size:12px;
+ color:#f00;
+ left: auto;
+ right:0px;
+ top: auto;
+ bottom:-20px;
+ display:none;
+}
+
+.form_group2 input,.form_group2 p{
+ float:left;
+}
+
+.form_group2 input{
+ margin:2px 10px 0 0;
+}
+
+.form_group .get_code{
+ position:absolute;
+ right:0px;
+ top:20px;
+ color:#70b7f9;
+ font-size:12px;
+}
+
+.form_group .get_pic_code{
+ position:absolute;
+ width:80px;
+ height:30px;
+ right:0px;
+ top:10px;
+}
+
+.form_group .get_code:hover{
+ color:#1482f0;
+}
+
+.register_form .code_pwd{
+ width:200px;
+}
+
+.hotline{
+ border-bottom:1px solid #2185ed;
+}
+
+.form_group input{
+ width:310px;
+ height:44px;
+ border:0px;
+ outline:none;
+ position:absolute;
+ left:0;
+ bottom:0;
+}
+
+.form_group .input_tip{
+ position:absolute;
+ left:0;
+ top:22px;
+ width:110px;
+ line-height:14px;
+ font-size:14px;
+ color:#999;
+}
+
+.input_sub{
+ display:block;
+ width:310px;
+ height:40px;
+ background:#1482f0;
+ border:0px;
+ color:#fff;
+ font-size:14px;
+ margin:50px auto 0;
+ border-radius:4px;
+ cursor:pointer;
+}
+
+.input_sub:hover{
+ background:#4d9df1;
+}
+
+
+
+.down_link{
+ text-align:center;
+ font-size:12px;
+ color:#999;
+ margin-top:30px;
+}
+
+.down_link a{
+ color:#70b7f9;
+}
+
+.down_link a:hover{
+ color:#1482f0;
+}
+
+.register_form .down_link{
+ margin-top:20px;
+}
+
+
+.detail_con{
+ width:778px;
+ padding:20px;
+ overflow:hidden;
+ background:#fff;
+ border:1px solid #ececee;
+}
+
+.detail_con h3{
+ font-size:30px;
+ line-height:45px;
+}
+
+.detail_about{
+ margin:10px 0;
+ border-bottom:1px solid #ebebeb;
+ padding:10px 0;
+}
+
+.time_souce{
+ color:#999;
+ font-size: 12px;
+ text-indent:20px;
+ background:url(../images/clock.png) left center no-repeat;
+}
+
+.comment{
+ color:#999;
+ font-size: 12px;
+ text-indent:20px;
+ background:url(../images/comment_icon.png) left center no-repeat;
+}
+
+.summary{
+ letter-spacing: .5px;
+ text-align: justify;
+ background:#f0f2f5;
+ font-size:16px;
+ line-height:28px;
+ padding:15px 25px;
+ margin-top:30px;
+ position:relative;
+}
+
+.detail_con .summary:before{
+ position:absolute;
+ left:5px;
+ top:5px;
+ content:"『";
+}
+
+.detail_con .summary:after{
+ position:absolute;
+ right:5px;
+ bottom:5px;
+ content:"』";
+}
+
+.detail_con h4{
+ font-size: 18px;
+ font-weight: 700;
+ color: #1478f0;
+ border-left: 5px solid #1478f0;
+ padding-left: 10px;
+ margin:30px 0
+}
+
+.detail_con p{
+ font-size: 16px;
+ line-height: 28px;
+ margin-bottom: 30px;
+ text-align: justify
+}
+
+
+.collection{
+ display:inline-block;;
+ width:98px;
+ line-height:34px;
+ text-indent:45px;
+ border:1px solid #3791ef;
+ color:#3791ef;
+ border-radius:4px;
+ font-size:14px;
+ margin:0px 5px;
+ background:url(../images/collect_icons.png) 21px 7px no-repeat;
+ overflow:hidden;
+}
+
+.block-center {
+ display: block;
+ margin: 0 auto;
+}
+
+
+.collection:hover{
+ background:url(../images/collect_icons.png) 21px -33px no-repeat;
+}
+
+
+.focus{
+ display:inline-block;;
+ width:98px;
+ line-height:34px;
+ text-indent:45px;
+ border:1px solid #f80;
+ color:#f80;
+ border-radius:4px;
+ font-size:14px;
+ /*margin:0px 5px;*/
+ background:url(../images/focus_icons.png) 21px 7px no-repeat;
+ overflow: hidden;
+}
+
+
+.focus:hover{
+ background:url(../images/focus_icons.png) 21px -33px no-repeat;
+}
+
+
+.collected{
+ /*display:inline-block;*/
+ width:100px;
+ height:36px;
+ color:#666;
+ border-radius:4px;
+ font-size:14px;
+ /*margin:0px 5px;*/
+ background:url(../images/collect_icons.png) 15px -73px no-repeat #e6e6e6;
+ position:relative;
+ overflow:hidden;
+}
+
+.collected:hover{
+ background-position:10px -73px;
+}
+
+.collected .out{
+ position:absolute;
+ left:40px;
+ top:8px;
+}
+
+.collected:hover .out{
+ left:40px;
+ top:35px;
+}
+
+.collected .over{
+ position:absolute;
+ left:40px;
+ top:35px;
+}
+
+.collected:hover .over{
+ left:33px;
+ top:8px;
+}
+
+
+
+.focused{
+ display:inline-block;;
+ width:100px;
+ height:36px;
+ color:#666;
+ border-radius:4px;
+ font-size:14px;
+ /*margin:0px 5px;*/
+ background:url(../images/focus_icons.png) 15px -73px no-repeat #e6e6e6;
+ position:relative;
+ overflow:hidden;
+}
+
+.focused:hover{
+ background-position:10px -73px;
+}
+
+.focused .out{
+ position:absolute;
+ left:40px;
+ top:8px;
+}
+
+.focused:hover .out{
+ left:40px;
+ top:35px;
+}
+
+.focused .over{
+ position:absolute;
+ left:40px;
+ top:35px;
+}
+
+.focused:hover .over{
+ left:33px;
+ top:8px;
+}
+
+
+
+
+.comment_form_logout{
+ border:1px solid #e3e8ee;
+ width:756px;
+ border-radius:4px;
+ padding:15px 10px;
+ outline:none;
+ font-size:16px;
+ color:#e3e8ee;
+ margin-top:50px;
+}
+
+
+.comment_form{
+ margin-top:50px;
+ overflow:hidden;
+}
+
+.comment_form .person_pic{
+ float:left;
+ width:40px;
+ height:40px;
+}
+
+.comment_form img{
+ width:40px;
+ height:40px;
+ border-radius:20px;
+}
+
+.comment_form .comment_input{
+ float:left;
+ width:690px;
+ height:60px;
+ margin-left:20px;
+ border-radius:4px;
+ padding:10px;
+ outline:none;
+ border:1px solid #2185ed;
+}
+
+.comment_form .comment_sub{
+ float:right;
+ width:58px;
+ height:28px;
+ border:1px solid #2185ed;
+ background:#fff;
+ border-radius:4px;
+ margin:10px 7px 0 0;
+ cursor:pointer;
+}
+
+.comment_form .comment_sub:hover{
+ background:#2185ed;
+ color:#fff;
+}
+
+.comment_count{
+ font-size: 16px;
+ color: #333;
+ border-bottom: 1px solid #ebebeb;
+ padding: 12px 0
+}
+
+
+.comment_list{
+ border-bottom:1px solid #ebebeb;
+ overflow:hidden;
+ margin-top:15px;
+ padding-bottom:15px;
+}
+
+
+.comment_list .person_pic{
+ width:40px;
+ height:40px;
+ float:left;
+}
+
+.comment_list .person_pic img{
+ width:40px;
+ height:40px;
+ border-radius:20px;
+}
+
+.user_name{
+ width:690px;
+ font-size: 14px;
+ font-weight: 700;
+ line-height: 20px;
+ color: #333;
+ margin-left:20px;
+}
+
+.comment_text{
+ width:718px;
+ font-size: 14px;
+ line-height: 20px;
+ color: #333;
+ margin:5px 0 0 20px;
+}
+
+.comment_time{
+ font-size:12px;
+ color:#999;
+ margin:10px 0 0 60px;
+}
+
+.comment_up{
+ font-size:12px;
+ color:#999;
+ text-indent:20px;
+ margin:10px 0 0 20px;
+ background:url(../images/zan_icon.png) left top no-repeat;
+}
+
+.has_comment_up{
+ font-size:12px;
+ color:#999;
+ text-indent:20px;
+ margin:10px 0 0 20px;
+ background:url(../images/zan_icon.png) left bottom no-repeat;
+}
+
+
+
+.comment_reply{
+ font-size:12px;
+ color:#999;
+ text-indent:20px;
+ margin:10px 0 0 20px;
+ background:url(../images/reply_icon.png) left center no-repeat;
+}
+
+
+.reply_text_con{
+ width:698px;
+ padding:10px;
+ background:#fafafa;
+ margin:10px 0 0 60px;
+}
+
+.reply_text_con .user_name2{
+ font-size:12px;
+ font-weight:bold;
+ color:#000;
+ margin-bottom:5px;
+}
+
+.reply_text_con .reply_text{
+ color:#666;
+ font-size:12px;
+}
+
+.reply_form{
+ width:718px;
+ overflow:hidden;
+ margin:10px 0 0 60px;
+ display:none;
+}
+
+.reply_input{
+ float:left;
+ width:692px;
+ height:30px;
+ border-radius:4px;
+ padding:10px;
+ outline:none;
+ border:1px solid #2185ed;
+}
+
+.reply_sub,.reply_cancel{
+ width:40px;
+ height:23px;
+ background:#76b6f4;
+ border:0px;
+ border-radius:2px;
+ color:#fff;
+ margin:10px 5px 0 10px;
+ cursor:pointer;
+}
+
+.reply_cancel{
+ background:#fff;
+ color: #909090;
+}
+
+
+.user_con{
+ width:778px;
+ min-height:660px;
+ padding:20px;
+ overflow:hidden;
+ background:#f9f9f9;
+ border:1px solid #ececee;
+}
+
+.main_frame{
+ width:778px;
+ min-height:660px;
+}
+
+.inframe_body{
+ background:#f9f9f9;
+}
+
+.user_menu_con{
+ width:308px;
+ height:600px;
+ background:#fff;
+ border:1px solid #ececee;
+ margin:100px 0 0 50px;
+ position:relative;
+}
+
+.user_center_pic{
+ width:198px;
+ height:198px;
+ position:absolute;
+ left:55px;
+ top:-100px;
+}
+
+.user_center_pic img{
+ width:198px;
+ height:198px;
+ border-radius:99px;
+}
+
+.user_center_name{
+ text-align:center;
+ margin-top:120px;
+ font-size:18px;
+}
+
+.option_list{
+ width:268px;
+ margin:20px auto 0;
+}
+
+.option_list li{
+ text-align:center;
+ border-bottom:1px solid #ededed;
+}
+
+.option_list li a{
+ line-height:50px;
+ font-size:14px;
+ color:#333;
+}
+
+.option_list .active a{
+ color:#39f;
+}
+
+.option_list li a:hover{
+ color:#39f;
+}
+
+.user_con h3{
+ font-size: 18px;
+ padding: 10px 20px;
+ color: #9698a5;
+ border-bottom:1px solid #ededed;
+}
+
+.base_info,.pic_info,.type_info,.pass_info,.my_collect,.release_form,.news_list{
+ width:700px;
+ margin:0px auto;
+}
+
+
+.common_title,.base_info h3,.pic_info h3,.type_info h3,.pass_info h3,.my_collect h3,.release_form h3,.news_list h3{
+ font-size: 18px;
+ padding: 10px 20px;
+ color: #9698a5;
+ border-bottom:1px solid #ededed;
+}
+
+
+.pass_info,.release_form{
+ position: relative;
+}
+
+.error_tip{
+ position:absolute;
+ left:178px;
+ top:228px;
+ color:#f00;
+ font-size:13px;
+ display:none;
+}
+
+.error_tip2{
+ position:absolute;
+ left:127px;
+ bottom:33px;
+ color:#f00;
+ font-size:13px;
+ display:none;
+}
+
+.form-group{
+ width:600px;
+ margin:20px auto;
+ overflow:hidden;
+ position:relative;
+}
+
+.form-group label{
+ width:120px;
+ line-height:40px;
+ font-size:14px;
+ font-weight:bold;
+ color:#000;
+ text-align:right;
+ float:left;
+ margin-right:5px;
+}
+
+.form-group .input_txt,.form-group .input_txt2{
+ width:400px;
+ height:30px;
+ float:left;
+ margin-top:5px;
+ border:1px solid #ddd;
+ border-radius:4px;
+ outline:none;
+ text-indent:10px;
+}
+
+.form-group b{
+ line-height:40px;
+ font-size:14px;
+ font-weight:normal;
+ color:#000;
+}
+
+.form-group .input_sub{
+ width:402px;
+ height:30px;
+ margin:10px 0 0 128px;
+}
+
+.now_user_pic{
+ width:100px;
+ height:100px;
+ border-radius:50px;
+}
+
+.label01{
+ margin-top:35px;
+}
+
+.input_file{
+ float:left;
+ margin-top:8px;
+}
+
+.article_list{
+ width:700px;
+ margin:30px auto 0;
+}
+
+.article_list li{
+ height:50px;
+ border-bottom:1px solid #ededed;
+ position:relative;
+}
+
+.article_list li a{
+ line-height:50px;
+ width:450px;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
+ font-size:14px;
+ color:#666;
+ float:left;
+ position:relative;
+ text-indent:20px;
+}
+
+.article_list li a:hover{
+ color:#39f;
+}
+
+.article_list li a:before{
+ content:"· ";
+ color:#1482f0;
+ font-size:40px;
+ position:absolute;
+ left:-17px;
+ top:-2px;
+}
+.article_list li span{
+ line-height:50px;
+ font-size:14px;
+ color:#999;
+ text-indent:20px;
+ float:right;
+ background:url(../images/clock.png) left center no-repeat;
+}
+
+.article_list li em{
+ line-height:50px;
+ font-size:14px;
+ color:#999;
+ float:left;
+ margin-left:20px;
+
+}
+
+.article_list li b{
+ position:absolute;
+ width:602px;
+ height:72px;
+ background:url(../images/tip_bg.png) no-repeat;
+ left:20px;
+ top:36px;
+ font-weight:normal;
+ font-size:12px;
+ color:#666;
+ z-index:100;
+ padding:13px 10px 0;
+ display:none;
+}
+
+.article_list li:hover b{
+ display:block;
+}
+
+.article_list li .pass{
+ color:green;
+}
+
+.article_list li .review{
+ color:#dca80a;
+}
+
+.article_list li .nopass{
+ color:#f00;
+}
+
+.loader_more{
+ display:block;
+ margin:30px auto 0;
+ width:118px;
+ line-height:38px;
+ text-align:center;
+ border:1px solid #ddd;
+ border-radius:4px;
+ color:#666;
+ font-size:14px;
+}
+
+.loader_more:hover{
+ color:#39f;
+}
+
+.error_con{
+ width:800px;
+ height:500px;
+ margin:100px auto 0;
+}
+
+.error_con img{
+ float:left;
+ margin-right:20px;
+}
+
+.error_con h3{
+ width:360px;
+ margin-top:50px;
+ font-size:30px;
+ color:#333;
+ float:left;
+}
+
+.error_con h4{
+ width:360px;
+ font-size:18px;
+ margin-top:10px;
+ color:#666;
+ float:left;
+}
+
+.error_con p{
+ width:360px;
+ font-size:14px;
+ margin-top:10px;
+ color:#999;
+ float:left;
+}
+
+.error_con a{
+ float:left;
+ width:120px;
+ height:36px;
+ line-height:36px;
+ text-align:center;
+ border-radius:18px;
+ background:#1482f0;
+ color:#fff;
+ margin-top:20px;
+}
+
+.error_con a:hover{
+ background:#39f;
+}
+
+.release_form .form-group{
+ width:700px;
+ overflow:hidden;
+ margin:15px auto;
+}
+
+.form-group .input_txt2{
+ width:570px;
+}
+
+.form-group .sel_opt{
+ width:150px;
+ height:30px;
+ float:left;
+ margin-top:5px;
+ border:1px solid #ddd;
+ border-radius:4px;
+ outline:none;
+ text-indent:10px;
+}
+
+.form-group .input_multxt{
+ width:550px;
+ height:60px;
+ padding:10px;
+ float:left;
+ margin-top:5px;
+ border:1px solid #ddd;
+ border-radius:4px;
+ outline:none;
+ text-indent:10px;
+}
+
+.form-group .input_multxt2{
+ width:570px;
+ padding:10px 0px;
+ height:300px;
+ float:left;
+ margin-top:5px;
+ border:1px solid #ddd;
+ outline:none;
+ text-indent:10px;
+}
+
+.form-group .input_sub2{
+ width:100px;
+ margin:10px 0 0 127px;
+}
+
+.other_con{
+ width:1100px;
+ height:200px;
+ margin-left:100px;
+ background:#fff;
+ position:relative;
+}
+
+.other_center_pic{
+ width:198px;
+ height:198px;
+ position:absolute;
+ left:-100px;
+ top:0px;
+}
+
+
+.other_detail{
+ width:268px;
+ margin:30px auto 0;
+}
+
+.other_detail li{
+ text-align:left;
+ font-size:14px;
+ line-height:40px;
+ border-bottom:1px dotted #ededed;
+ text-indent:10px;
+}
+
+.focus_other{
+ overflow:hidden;
+ margin-top:40px;
+ text-align:center;
+}
+
+.focus_other a{
+ text-align:left;
+}
+
+.ui-pagination-container{
+ text-align:center;
+ margin-top:20px;
+}
+
+.ui-pagination-container .ui-pagination-page-item:hover{
+ color:#39f;
+ border-color:#39f;
+}
+
+.ui-pagination-container .ui-pagination-page-item{
+ background:none;
+ font-size:12px;
+}
+
+.ui-pagination-container .ui-pagination-page-item.active{
+ background:#39f;
+ border-color:#39f;
+}
+
+.ui-pagination-container .ui-pagination-page-item:hover{
+ color:#333;
+}
\ No newline at end of file
diff --git a/info/status/images/5794.png b/info/static/images/5794.png
similarity index 100%
rename from info/status/images/5794.png
rename to info/static/images/5794.png
diff --git a/info/static/images/Pay.jpg b/info/static/images/Pay.jpg
new file mode 100644
index 0000000..f3eb935
Binary files /dev/null and b/info/static/images/Pay.jpg differ
diff --git a/info/static/images/QQ.jpg b/info/static/images/QQ.jpg
new file mode 100644
index 0000000..936c0cc
Binary files /dev/null and b/info/static/images/QQ.jpg differ
diff --git a/info/static/images/Wechat.jpg b/info/static/images/Wechat.jpg
new file mode 100644
index 0000000..e7088d1
Binary files /dev/null and b/info/static/images/Wechat.jpg differ
diff --git a/info/status/images/about.jpg b/info/static/images/about.jpg
similarity index 100%
rename from info/status/images/about.jpg
rename to info/static/images/about.jpg
diff --git a/info/status/images/ad.jpg b/info/static/images/ad.jpg
similarity index 100%
rename from info/status/images/ad.jpg
rename to info/static/images/ad.jpg
diff --git a/info/status/images/author2.png b/info/static/images/author2.png
similarity index 100%
rename from info/status/images/author2.png
rename to info/static/images/author2.png
diff --git a/info/status/images/avatar.jpg b/info/static/images/avatar.jpg
similarity index 100%
rename from info/status/images/avatar.jpg
rename to info/static/images/avatar.jpg
diff --git a/info/status/images/b01.jpg b/info/static/images/b01.jpg
similarity index 100%
rename from info/status/images/b01.jpg
rename to info/static/images/b01.jpg
diff --git a/info/status/images/b02.jpg b/info/static/images/b02.jpg
similarity index 100%
rename from info/status/images/b02.jpg
rename to info/static/images/b02.jpg
diff --git a/info/status/images/b03.jpg b/info/static/images/b03.jpg
similarity index 100%
rename from info/status/images/b03.jpg
rename to info/static/images/b03.jpg
diff --git a/info/status/images/b04.jpg b/info/static/images/b04.jpg
similarity index 100%
rename from info/status/images/b04.jpg
rename to info/static/images/b04.jpg
diff --git a/info/status/images/b05.jpg b/info/static/images/b05.jpg
similarity index 100%
rename from info/status/images/b05.jpg
rename to info/static/images/b05.jpg
diff --git a/info/status/images/b06.jpg b/info/static/images/b06.jpg
similarity index 100%
rename from info/status/images/b06.jpg
rename to info/static/images/b06.jpg
diff --git a/info/status/images/b07.jpg b/info/static/images/b07.jpg
similarity index 100%
rename from info/status/images/b07.jpg
rename to info/static/images/b07.jpg
diff --git a/info/status/images/banner.png b/info/static/images/banner.png
similarity index 100%
rename from info/status/images/banner.png
rename to info/static/images/banner.png
diff --git a/info/status/images/banner01.jpg b/info/static/images/banner01.jpg
similarity index 100%
rename from info/status/images/banner01.jpg
rename to info/static/images/banner01.jpg
diff --git a/info/status/images/banner02.jpg b/info/static/images/banner02.jpg
similarity index 100%
rename from info/status/images/banner02.jpg
rename to info/static/images/banner02.jpg
diff --git a/info/status/images/banner03.jpg b/info/static/images/banner03.jpg
similarity index 100%
rename from info/status/images/banner03.jpg
rename to info/static/images/banner03.jpg
diff --git a/info/status/images/bg.jpg b/info/static/images/bg.jpg
similarity index 100%
rename from info/status/images/bg.jpg
rename to info/static/images/bg.jpg
diff --git a/info/status/images/bg.png b/info/static/images/bg.png
similarity index 100%
rename from info/status/images/bg.png
rename to info/static/images/bg.png
diff --git a/info/status/images/bi01.jpg b/info/static/images/bi01.jpg
similarity index 100%
rename from info/status/images/bi01.jpg
rename to info/static/images/bi01.jpg
diff --git a/info/status/images/bi02.jpg b/info/static/images/bi02.jpg
similarity index 100%
rename from info/status/images/bi02.jpg
rename to info/static/images/bi02.jpg
diff --git a/info/status/images/bi03.jpg b/info/static/images/bi03.jpg
similarity index 100%
rename from info/status/images/bi03.jpg
rename to info/static/images/bi03.jpg
diff --git a/info/status/images/bi04.jpg b/info/static/images/bi04.jpg
similarity index 100%
rename from info/status/images/bi04.jpg
rename to info/static/images/bi04.jpg
diff --git a/info/status/images/bi05.jpg b/info/static/images/bi05.jpg
similarity index 100%
rename from info/status/images/bi05.jpg
rename to info/static/images/bi05.jpg
diff --git a/info/status/images/bi06.jpg b/info/static/images/bi06.jpg
similarity index 100%
rename from info/status/images/bi06.jpg
rename to info/static/images/bi06.jpg
diff --git a/info/status/images/blank.jpg b/info/static/images/blank.jpg
similarity index 100%
rename from info/status/images/blank.jpg
rename to info/static/images/blank.jpg
diff --git a/info/static/images/clock.png b/info/static/images/clock.png
new file mode 100755
index 0000000..d5a69e6
Binary files /dev/null and b/info/static/images/clock.png differ
diff --git a/info/status/images/close.png b/info/static/images/close.png
similarity index 100%
rename from info/status/images/close.png
rename to info/static/images/close.png
diff --git a/info/static/images/collect_icons.png b/info/static/images/collect_icons.png
new file mode 100755
index 0000000..82151bd
Binary files /dev/null and b/info/static/images/collect_icons.png differ
diff --git a/info/static/images/comment_icon.png b/info/static/images/comment_icon.png
new file mode 100755
index 0000000..1be017e
Binary files /dev/null and b/info/static/images/comment_icon.png differ
diff --git a/info/status/images/date.png b/info/static/images/date.png
similarity index 100%
rename from info/status/images/date.png
rename to info/static/images/date.png
diff --git a/info/status/images/datepng.png b/info/static/images/datepng.png
similarity index 100%
rename from info/status/images/datepng.png
rename to info/static/images/datepng.png
diff --git a/info/static/images/focus_icons.png b/info/static/images/focus_icons.png
new file mode 100755
index 0000000..bec1784
Binary files /dev/null and b/info/static/images/focus_icons.png differ
diff --git a/info/static/images/hit_icon.png b/info/static/images/hit_icon.png
new file mode 100755
index 0000000..9945573
Binary files /dev/null and b/info/static/images/hit_icon.png differ
diff --git a/info/status/images/jdbg.png b/info/static/images/jdbg.png
similarity index 100%
rename from info/status/images/jdbg.png
rename to info/static/images/jdbg.png
diff --git a/info/status/images/lanmbq.png b/info/static/images/lanmbq.png
similarity index 100%
rename from info/status/images/lanmbq.png
rename to info/static/images/lanmbq.png
diff --git a/info/status/images/logo.jpg b/info/static/images/logo.jpg
similarity index 100%
rename from info/status/images/logo.jpg
rename to info/static/images/logo.jpg
diff --git a/info/status/images/logo.png b/info/static/images/logo.png
similarity index 100%
rename from info/status/images/logo.png
rename to info/static/images/logo.png
diff --git a/info/status/images/mb01.jpg b/info/static/images/mb01.jpg
similarity index 100%
rename from info/status/images/mb01.jpg
rename to info/static/images/mb01.jpg
diff --git a/info/status/images/mb02.jpg b/info/static/images/mb02.jpg
similarity index 100%
rename from info/status/images/mb02.jpg
rename to info/static/images/mb02.jpg
diff --git a/info/status/images/mb03.jpg b/info/static/images/mb03.jpg
similarity index 100%
rename from info/status/images/mb03.jpg
rename to info/static/images/mb03.jpg
diff --git a/info/status/images/mb04.jpg b/info/static/images/mb04.jpg
similarity index 100%
rename from info/status/images/mb04.jpg
rename to info/static/images/mb04.jpg
diff --git a/info/status/images/mb05.jpg b/info/static/images/mb05.jpg
similarity index 100%
rename from info/status/images/mb05.jpg
rename to info/static/images/mb05.jpg
diff --git a/info/status/images/mb06.jpg b/info/static/images/mb06.jpg
similarity index 100%
rename from info/status/images/mb06.jpg
rename to info/static/images/mb06.jpg
diff --git a/info/status/images/mb07.jpg b/info/static/images/mb07.jpg
similarity index 100%
rename from info/status/images/mb07.jpg
rename to info/static/images/mb07.jpg
diff --git a/info/status/images/mb08.jpg b/info/static/images/mb08.jpg
similarity index 100%
rename from info/status/images/mb08.jpg
rename to info/static/images/mb08.jpg
diff --git a/info/status/images/navbg.png b/info/static/images/navbg.png
similarity index 100%
rename from info/status/images/navbg.png
rename to info/static/images/navbg.png
diff --git a/info/status/images/navline.jpg b/info/static/images/navline.jpg
similarity index 100%
rename from info/status/images/navline.jpg
rename to info/static/images/navline.jpg
diff --git a/info/status/images/newsbg01.png b/info/static/images/newsbg01.png
similarity index 100%
rename from info/status/images/newsbg01.png
rename to info/static/images/newsbg01.png
diff --git a/info/status/images/newsbg02.png b/info/static/images/newsbg02.png
similarity index 100%
rename from info/status/images/newsbg02.png
rename to info/static/images/newsbg02.png
diff --git a/info/status/images/newsbg03 (1).png b/info/static/images/newsbg03 (1).png
similarity index 100%
rename from info/status/images/newsbg03 (1).png
rename to info/static/images/newsbg03 (1).png
diff --git a/info/status/images/newsbg03.png b/info/static/images/newsbg03.png
similarity index 100%
rename from info/status/images/newsbg03.png
rename to info/static/images/newsbg03.png
diff --git a/info/status/images/newsbg04.png b/info/static/images/newsbg04.png
similarity index 100%
rename from info/status/images/newsbg04.png
rename to info/static/images/newsbg04.png
diff --git a/info/static/images/not_found.png b/info/static/images/not_found.png
new file mode 100755
index 0000000..2c74add
Binary files /dev/null and b/info/static/images/not_found.png differ
diff --git a/info/static/images/person.png b/info/static/images/person.png
new file mode 100755
index 0000000..9cf22dc
Binary files /dev/null and b/info/static/images/person.png differ
diff --git a/info/static/images/person01.png b/info/static/images/person01.png
new file mode 100755
index 0000000..82fc691
Binary files /dev/null and b/info/static/images/person01.png differ
diff --git a/info/static/images/person02.png b/info/static/images/person02.png
new file mode 100755
index 0000000..f42b292
Binary files /dev/null and b/info/static/images/person02.png differ
diff --git a/info/static/images/person03.png b/info/static/images/person03.png
new file mode 100755
index 0000000..59dd89a
Binary files /dev/null and b/info/static/images/person03.png differ
diff --git a/info/static/images/pic_code.png b/info/static/images/pic_code.png
new file mode 100755
index 0000000..27531fc
Binary files /dev/null and b/info/static/images/pic_code.png differ
diff --git a/info/status/images/posttime.gif b/info/static/images/posttime.gif
similarity index 100%
rename from info/status/images/posttime.gif
rename to info/static/images/posttime.gif
diff --git a/info/static/images/reply_icon.png b/info/static/images/reply_icon.png
new file mode 100755
index 0000000..c841ba8
Binary files /dev/null and b/info/static/images/reply_icon.png differ
diff --git a/info/static/images/shutoff.png b/info/static/images/shutoff.png
new file mode 100755
index 0000000..3fac9a5
Binary files /dev/null and b/info/static/images/shutoff.png differ
diff --git a/info/status/images/t01.jpg b/info/static/images/t01.jpg
similarity index 100%
rename from info/status/images/t01.jpg
rename to info/static/images/t01.jpg
diff --git a/info/status/images/t02.jpg b/info/static/images/t02.jpg
similarity index 100%
rename from info/status/images/t02.jpg
rename to info/static/images/t02.jpg
diff --git a/info/status/images/t03.jpg b/info/static/images/t03.jpg
similarity index 100%
rename from info/status/images/t03.jpg
rename to info/static/images/t03.jpg
diff --git a/info/status/images/text01.jpg b/info/static/images/text01.jpg
similarity index 100%
rename from info/status/images/text01.jpg
rename to info/static/images/text01.jpg
diff --git a/info/status/images/text02.jpg b/info/static/images/text02.jpg
similarity index 100%
rename from info/status/images/text02.jpg
rename to info/static/images/text02.jpg
diff --git a/info/static/images/tip_bg.png b/info/static/images/tip_bg.png
new file mode 100755
index 0000000..5a9f001
Binary files /dev/null and b/info/static/images/tip_bg.png differ
diff --git a/info/status/images/titlebg.png b/info/static/images/titlebg.png
similarity index 100%
rename from info/status/images/titlebg.png
rename to info/static/images/titlebg.png
diff --git a/info/static/images/user_pic.png b/info/static/images/user_pic.png
new file mode 100755
index 0000000..39ce09f
Binary files /dev/null and b/info/static/images/user_pic.png differ
diff --git a/info/status/images/v1.jpg b/info/static/images/v1.jpg
similarity index 100%
rename from info/status/images/v1.jpg
rename to info/static/images/v1.jpg
diff --git a/info/status/images/v2.jpg b/info/static/images/v2.jpg
similarity index 100%
rename from info/status/images/v2.jpg
rename to info/static/images/v2.jpg
diff --git a/info/static/images/worm.jpg b/info/static/images/worm.jpg
new file mode 100755
index 0000000..c781044
Binary files /dev/null and b/info/static/images/worm.jpg differ
diff --git a/info/status/images/wx.jpg b/info/static/images/wx.jpg
similarity index 100%
rename from info/status/images/wx.jpg
rename to info/static/images/wx.jpg
diff --git a/info/static/images/zan_icon.png b/info/static/images/zan_icon.png
new file mode 100755
index 0000000..cd4dc82
Binary files /dev/null and b/info/static/images/zan_icon.png differ
diff --git a/info/status/images/zd01.jpg b/info/static/images/zd01.jpg
similarity index 100%
rename from info/status/images/zd01.jpg
rename to info/static/images/zd01.jpg
diff --git a/info/status/images/zd02.jpg b/info/static/images/zd02.jpg
similarity index 100%
rename from info/status/images/zd02.jpg
rename to info/static/images/zd02.jpg
diff --git a/info/status/images/zd03.jpg b/info/static/images/zd03.jpg
similarity index 100%
rename from info/status/images/zd03.jpg
rename to info/static/images/zd03.jpg
diff --git a/info/status/js/jquery-2.1.1.min.js b/info/static/js/jquery-2.1.1.min.js
similarity index 100%
rename from info/status/js/jquery-2.1.1.min.js
rename to info/static/js/jquery-2.1.1.min.js
diff --git a/info/static/js/jquery.form.min.js b/info/static/js/jquery.form.min.js
new file mode 100755
index 0000000..79704b2
--- /dev/null
+++ b/info/static/js/jquery.form.min.js
@@ -0,0 +1,11 @@
+/*!
+ * jQuery Form Plugin
+ * version: 3.51.0-2014.06.20
+ * Requires jQuery v1.5 or later
+ * Copyright (c) 2014 M. Alsup
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Project repository: https://github.com/malsup/form
+ * Dual licensed under the MIT and GPL licenses.
+ * https://github.com/malsup/form#copyright-and-license
+ */
+!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e("undefined"!=typeof jQuery?jQuery:window.Zepto)}(function(e){"use strict";function t(t){var r=t.data;t.isDefaultPrevented()||(t.preventDefault(),e(t.target).ajaxSubmit(r))}function r(t){var r=t.target,a=e(r);if(!a.is("[type=submit],[type=image]")){var n=a.closest("[type=submit]");if(0===n.length)return;r=n[0]}var i=this;if(i.clk=r,"image"==r.type)if(void 0!==t.offsetX)i.clk_x=t.offsetX,i.clk_y=t.offsetY;else if("function"==typeof e.fn.offset){var o=a.offset();i.clk_x=t.pageX-o.left,i.clk_y=t.pageY-o.top}else i.clk_x=t.pageX-r.offsetLeft,i.clk_y=t.pageY-r.offsetTop;setTimeout(function(){i.clk=i.clk_x=i.clk_y=null},100)}function a(){if(e.fn.ajaxSubmit.debug){var t="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(t):window.opera&&window.opera.postError&&window.opera.postError(t)}}var n={};n.fileapi=void 0!==e("").get(0).files,n.formdata=void 0!==window.FormData;var i=!!e.fn.prop;e.fn.attr2=function(){if(!i)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t){function r(r){var a,n,i=e.param(r,t.traditional).split("&"),o=i.length,s=[];for(a=0;o>a;a++)i[a]=i[a].replace(/\+/g," "),n=i[a].split("="),s.push([decodeURIComponent(n[0]),decodeURIComponent(n[1])]);return s}function o(a){for(var n=new FormData,i=0;i').val(m.extraData[d].value).appendTo(w)[0]:e('').val(m.extraData[d]).appendTo(w)[0]);m.iframeTarget||v.appendTo("body"),g.attachEvent?g.attachEvent("onload",s):g.addEventListener("load",s,!1),setTimeout(t,15);try{w.submit()}catch(h){var x=document.createElement("form").submit;x.apply(w)}}finally{w.setAttribute("action",i),w.setAttribute("enctype",c),r?w.setAttribute("target",r):f.removeAttr("target"),e(l).remove()}}function s(t){if(!x.aborted&&!F){if(M=n(g),M||(a("cannot access response document"),t=k),t===D&&x)return x.abort("timeout"),void S.reject(x,"timeout");if(t==k&&x)return x.abort("server abort"),void S.reject(x,"error","server abort");if(M&&M.location.href!=m.iframeSrc||T){g.detachEvent?g.detachEvent("onload",s):g.removeEventListener("load",s,!1);var r,i="success";try{if(T)throw"timeout";var o="xml"==m.dataType||M.XMLDocument||e.isXMLDoc(M);if(a("isXml="+o),!o&&window.opera&&(null===M.body||!M.body.innerHTML)&&--O)return a("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var u=M.body?M.body:M.documentElement;x.responseText=u?u.innerHTML:null,x.responseXML=M.XMLDocument?M.XMLDocument:M,o&&(m.dataType="xml"),x.getResponseHeader=function(e){var t={"content-type":m.dataType};return t[e.toLowerCase()]},u&&(x.status=Number(u.getAttribute("status"))||x.status,x.statusText=u.getAttribute("statusText")||x.statusText);var c=(m.dataType||"").toLowerCase(),l=/(json|script|text)/.test(c);if(l||m.textarea){var f=M.getElementsByTagName("textarea")[0];if(f)x.responseText=f.value,x.status=Number(f.getAttribute("status"))||x.status,x.statusText=f.getAttribute("statusText")||x.statusText;else if(l){var p=M.getElementsByTagName("pre")[0],h=M.getElementsByTagName("body")[0];p?x.responseText=p.textContent?p.textContent:p.innerText:h&&(x.responseText=h.textContent?h.textContent:h.innerText)}}else"xml"==c&&!x.responseXML&&x.responseText&&(x.responseXML=X(x.responseText));try{E=_(x,c,m)}catch(y){i="parsererror",x.error=r=y||i}}catch(y){a("error caught: ",y),i="error",x.error=r=y||i}x.aborted&&(a("upload aborted"),i=null),x.status&&(i=x.status>=200&&x.status<300||304===x.status?"success":"error"),"success"===i?(m.success&&m.success.call(m.context,E,"success",x),S.resolve(x.responseText,"success",x),d&&e.event.trigger("ajaxSuccess",[x,m])):i&&(void 0===r&&(r=x.statusText),m.error&&m.error.call(m.context,x,i,r),S.reject(x,"error",r),d&&e.event.trigger("ajaxError",[x,m,r])),d&&e.event.trigger("ajaxComplete",[x,m]),d&&!--e.active&&e.event.trigger("ajaxStop"),m.complete&&m.complete.call(m.context,x,i),F=!0,m.timeout&&clearTimeout(j),setTimeout(function(){m.iframeTarget?v.attr("src",m.iframeSrc):v.remove(),x.responseXML=null},100)}}}var c,l,m,d,p,v,g,x,y,b,T,j,w=f[0],S=e.Deferred();if(S.abort=function(e){x.abort(e)},r)for(l=0;l'),v.css({position:"absolute",top:"-1000px",left:"-1000px"})),g=v[0],x={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var r="timeout"===t?"timeout":"aborted";a("aborting upload... "+r),this.aborted=1;try{g.contentWindow.document.execCommand&&g.contentWindow.document.execCommand("Stop")}catch(n){}v.attr("src",m.iframeSrc),x.error=r,m.error&&m.error.call(m.context,x,r,t),d&&e.event.trigger("ajaxError",[x,m,r]),m.complete&&m.complete.call(m.context,x,r)}},d=m.global,d&&0===e.active++&&e.event.trigger("ajaxStart"),d&&e.event.trigger("ajaxSend",[x,m]),m.beforeSend&&m.beforeSend.call(m.context,x,m)===!1)return m.global&&e.active--,S.reject(),S;if(x.aborted)return S.reject(),S;y=w.clk,y&&(b=y.name,b&&!y.disabled&&(m.extraData=m.extraData||{},m.extraData[b]=y.value,"image"==y.type&&(m.extraData[b+".x"]=w.clk_x,m.extraData[b+".y"]=w.clk_y)));var D=1,k=2,A=e("meta[name=csrf-token]").attr("content"),L=e("meta[name=csrf-param]").attr("content");L&&A&&(m.extraData=m.extraData||{},m.extraData[L]=A),m.forceSync?o():setTimeout(o,10);var E,M,F,O=50,X=e.parseXML||function(e,t){return window.ActiveXObject?(t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!=t.documentElement.nodeName?t:null},C=e.parseJSON||function(e){return window.eval("("+e+")")},_=function(t,r,a){var n=t.getResponseHeader("content-type")||"",i="xml"===r||!r&&n.indexOf("xml")>=0,o=i?t.responseXML:t.responseText;return i&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),a&&a.dataFilter&&(o=a.dataFilter(o,r)),"string"==typeof o&&("json"===r||!r&&n.indexOf("json")>=0?o=C(o):("script"===r||!r&&n.indexOf("javascript")>=0)&&e.globalEval(o)),o};return S}if(!this.length)return a("ajaxSubmit: skipping submit process - no element selected"),this;var u,c,l,f=this;"function"==typeof t?t={success:t}:void 0===t&&(t={}),u=t.type||this.attr2("method"),c=t.url||this.attr2("action"),l="string"==typeof c?e.trim(c):"",l=l||window.location.href||"",l&&(l=(l.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:l,success:e.ajaxSettings.success,type:u||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var m={};if(this.trigger("form-pre-serialize",[this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&t.beforeSerialize(this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var d=t.traditional;void 0===d&&(d=e.ajaxSettings.traditional);var p,h=[],v=this.formToArray(t.semantic,h);if(t.data&&(t.extraData=t.data,p=e.param(t.data,d)),t.beforeSubmit&&t.beforeSubmit(v,this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[v,this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var g=e.param(v,d);p&&(g=g?g+"&"+p:p),"GET"==t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+g,t.data=null):t.data=g;var x=[];if(t.resetForm&&x.push(function(){f.resetForm()}),t.clearForm&&x.push(function(){f.clearForm(t.includeHidden)}),!t.dataType&&t.target){var y=t.success||function(){};x.push(function(r){var a=t.replaceTarget?"replaceWith":"html";e(t.target)[a](r).each(y,arguments)})}else t.success&&x.push(t.success);if(t.success=function(e,r,a){for(var n=t.context||this,i=0,o=x.length;o>i;i++)x[i].apply(n,[e,r,a||f,f])},t.error){var b=t.error;t.error=function(e,r,a){var n=t.context||this;b.apply(n,[e,r,a,f])}}if(t.complete){var T=t.complete;t.complete=function(e,r){var a=t.context||this;T.apply(a,[e,r,f])}}var j=e("input[type=file]:enabled",this).filter(function(){return""!==e(this).val()}),w=j.length>0,S="multipart/form-data",D=f.attr("enctype")==S||f.attr("encoding")==S,k=n.fileapi&&n.formdata;a("fileAPI :"+k);var A,L=(w||D)&&!k;t.iframe!==!1&&(t.iframe||L)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){A=s(v)}):A=s(v):A=(w||D)&&k?o(v):e.ajax(t),f.removeData("jqxhr").data("jqxhr",A);for(var E=0;Ec;c++)if(d=u[c],f=d.name,f&&!d.disabled)if(t&&o.clk&&"image"==d.type)o.clk==d&&(a.push({name:f,value:e(d).val(),type:d.type}),a.push({name:f+".x",value:o.clk_x},{name:f+".y",value:o.clk_y}));else if(m=e.fieldValue(d,!0),m&&m.constructor==Array)for(r&&r.push(d),l=0,h=m.length;h>l;l++)a.push({name:f,value:m[l]});else if(n.fileapi&&"file"==d.type){r&&r.push(d);var v=d.files;if(v.length)for(l=0;li;i++)r.push({name:a,value:n[i]});else null!==n&&"undefined"!=typeof n&&r.push({name:this.name,value:n})}}),e.param(r)},e.fn.fieldValue=function(t){for(var r=[],a=0,n=this.length;n>a;a++){var i=this[a],o=e.fieldValue(i,t);null===o||"undefined"==typeof o||o.constructor==Array&&!o.length||(o.constructor==Array?e.merge(r,o):r.push(o))}return r},e.fieldValue=function(t,r){var a=t.name,n=t.type,i=t.tagName.toLowerCase();if(void 0===r&&(r=!0),r&&(!a||t.disabled||"reset"==n||"button"==n||("checkbox"==n||"radio"==n)&&!t.checked||("submit"==n||"image"==n)&&t.form&&t.form.clk!=t||"select"==i&&-1==t.selectedIndex))return null;if("select"==i){var o=t.selectedIndex;if(0>o)return null;for(var s=[],u=t.options,c="select-one"==n,l=c?o+1:u.length,f=c?o:0;l>f;f++){var m=u[f];if(m.selected){var d=m.value;if(d||(d=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value),c)return d;s.push(d)}}return s}return e(t).val()},e.fn.clearForm=function(t){return this.each(function(){e("input,select,textarea",this).clearFields(t)})},e.fn.clearFields=e.fn.clearInputs=function(t){var r=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var a=this.type,n=this.tagName.toLowerCase();r.test(a)||"textarea"==n?this.value="":"checkbox"==a||"radio"==a?this.checked=!1:"select"==n?this.selectedIndex=-1:"file"==a?/MSIE/.test(navigator.userAgent)?e(this).replaceWith(e(this).clone(!0)):e(this).val(""):t&&(t===!0&&/hidden/.test(a)||"string"==typeof t&&e(this).is(t))&&(this.value="")})},e.fn.resetForm=function(){return this.each(function(){("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset()})},e.fn.enable=function(e){return void 0===e&&(e=!0),this.each(function(){this.disabled=!e})},e.fn.selected=function(t){return void 0===t&&(t=!0),this.each(function(){var r=this.type;if("checkbox"==r||"radio"==r)this.checked=t;else if("option"==this.tagName.toLowerCase()){var a=e(this).parent("select");t&&a[0]&&"select-one"==a[0].type&&a.find("option").selected(!1),this.selected=t}})},e.fn.ajaxSubmit.debug=!1});
\ No newline at end of file
diff --git a/info/static/js/jquery.pagination.min.js b/info/static/js/jquery.pagination.min.js
new file mode 100755
index 0000000..5d4c81b
--- /dev/null
+++ b/info/static/js/jquery.pagination.min.js
@@ -0,0 +1 @@
+!function(t,a,e,i){var n=function(a,e){this.ele=a,this.defaults={currentPage:1,totalPage:10,isShow:!0,count:5,homePageText:"首页",endPageText:"尾页",prevPageText:"上一页",nextPageText:"下一页",callback:function(){}},this.opts=t.extend({},this.defaults,e),this.current=this.opts.currentPage,this.total=this.opts.totalPage,this.init()};n.prototype={init:function(){this.render(),this.eventBind()},render:function(){var t=this.opts,a=this.current,e=this.total,i=this.getPagesTpl(),n=this.ele.empty();this.isRender=!0,this.homePage='",this.prevPage='",this.nextPage='",this.endPage='",this.checkPage(),this.isRender&&n.html("")},checkPage:function(){var t=this.opts,a=this.total,e=this.current;t.isShow||(this.homePage=this.endPage=""),1===e&&(this.homePage=this.prevPage=""),e===a&&(this.endPage=this.nextPage=""),1===a&&(this.homePage=this.prevPage=this.endPage=this.nextPage=""),a<=1&&(this.isRender=!1)},getPagesTpl:function(){var t=this.opts,a=this.total,e=this.current,i="",n=t.count;if(a<=n)for(g=1;g<=a;g++)i+=g===e?'":'";else{var s=n/2;if(e<=s)for(g=1;g<=n;g++)i+=g===e?'":'";else{var r=Math.floor(s),h=e+r,o=e-r,c=n%2==0;h>a&&(c?(o-=h-a-1,h=a+1):(o-=h-a,h=a)),c||h++;for(var g=o;g