• python之day21(chouti)


    1、文件上传
        a. Html Form表单提交
        b. Ajax提交
            原生XMLHttpRequest
                http://www.cnblogs.com/wupeiqi/articles/5703697.html
                
                XmlHttpReqeust() 类
                xhr = XmlHttpReqeust()
                xhr.send("k1=v1;k2=v2")
                
                
            jQuery Ajax
                $.ajax({}) 内部调用XmlHttpReqeust来发送的Ajax
                
                $.ajax({
                    data: {'k1': 'v1', 'k2': 'v2'}
                })
            
     

     1 from django.shortcuts import render,HttpResponse
     2 import os,json
     3 # Create your views here.
     4 
     5 
     6 # def upload(request):
     7 #     if request.method == 'POST':
     8 #         user = request.POST.get('user')
     9 #         img = request.FILES.get('img')
    10 #         f = open(os.path.join('static',img.name),'wb')
    11 #         for chunk in img.chunks():
    12 #             f.write(chunk)
    13 #         f.close()
    14 #     return render(request, 'upload.html')
    15 
    16 def ajax(request):
    17     import time
    18     crrent_time = time.time()
    19     return render(request,'ajax.html',{'crrent_time':crrent_time})
    20 
    21 def xhr_ajax(request):
    22     print(request.GET)
    23     print(request.POST)
    24     return HttpResponse('ok')
    25 
    26 
    27 def upload(request):
    28     if request.method == 'POST':
    29         ret = {'status':False, 'data':None, 'error': None}
    30 
    31         try:
    32             user = request.POST.get('user')
    33             img = request.FILES.get('img')
    34             file_path = os.path.join('static',img.name)
    35             f = open(file_path,'wb')
    36             for chunk in img.chunks():
    37                 f.write(chunk)
    38             f.close()
    39             ret['status'] = True
    40             ret['data'] = file_path
    41         except Exception as e:
    42             ret['error'] = str(e)
    43         return HttpResponse(json.dumps(ret))
    44     return render(request, 'upload.html')
    Views
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6     <style>
     7         .img{
     8             height: 300px;
     9             width: 300px;
    10         }
    11     </style>
    12 </head>
    13 <body>
    14     <iframe id="my_iframe" name="my_iframe" style="display: none" src="" ></iframe>
    15 
    16     <form id="fo" method="POST" action="/upload/" enctype="multipart/form-data">
    17         <input type="text" id="user" name="user">
    18 {#        <input type="file" id="img" name="img">#}
    19         <input type="file" id="img" name="img" onchange="uploadFile3()">
    20         <input type="submit">
    21 
    22     </form>
    23     <div id="container" >
    24 
    25     </div>
    26 {#    <a style="cursor: pointer" onclick="uploadFile1();">XMLHttpRequest</a>#}
    27 {#    <a onclick="uploadFile2();">jqueryajax上传</a>#}
    28     <script src="/static/jquery-2.1.4.min.js"></script>
    29     <script>
    30         function uploadFile1() {
    31             var form = new FormData();
    32             form.append('user',document.getElementById('user').value);
    33 
    34             var fileObj = document.getElementById("img").files[0];
    35             form.append('img',fileObj)
    36             var xhr = new XMLHttpRequest();
    37             xhr.onreadystatechange = function () {
    38                 if(xhr.readyState == 4){
    39                     var data = xhr.responseText;
    40                     console.log(data);
    41                 }
    42             };
    43             xhr.open("post", "/upload/", true);
    44             xhr.send(form);
    45         }
    46 
    47 
    48         function uploadFile2() {
    49             var fileObj = $("#img")[0].files[0];
    50             var form = new FormData();
    51             form.append('img',fileObj);
    52             form.append('user','alex');
    53 
    54             $.ajax({
    55                 type: 'POST',
    56                 url: '/upload/',
    57                 data: form,
    58                 processData: false,
    59                 contentType: false,
    60                 success: function (arg) {
    61                     console.log(arg);
    62 
    63                 }
    64 
    65 
    66             })
    67 
    68         }
    69 
    70         
    71         function uploadFile3() {
    72             $('#container').find('img').remove();
    73             document.getElementById('my_iframe').onload = callback;
    74             document.getElementById('fo').target = 'my_iframe';
    75             document.getElementById('fo').submit();
    76         }
    77         
    78         function callback() {
    79             var text = $('#my_iframe').contents().find('body').text();
    80             var json_data = JSON.parse(text);
    81             console.log(json_data);
    82             if(json_data.status){
    83                 var tag = document.createElement('img');
    84                 tag.src = '/' + json_data.data;
    85                 tag.className = 'img';
    86                 $('#container').append(tag);
    87             }else{
    88                 alert(json_data.error);
    89             }
    90             
    91         }
    92 
    93     </script>
    94 
    95 
    96 </body>
    97 </html>
    upload
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title></title>
     6 </head>
     7 <body>
     8     {{ crrent_time }}
     9     <input type="button" value="XMLHttpRequest按钮" onclick="XhrAjax();"/>
    10     <input type="button" value="XMLHttpRequest,FormData按钮" onclick="XhrAjaxForm();"/>
    11     <script>
    12         function XhrAjax(){
    13             var xhr = new XMLHttpRequest();
    14             xhr.onreadystatechange = function(){
    15                // 只有服务器端返回数据时,处理请求
    16                 if(xhr.readyState == 4){
    17                     // 服务器端响应的内容已经接受完毕
    18                     console.log(xhr.responseText);
    19                 }
    20             };
    21             // GET请求
    22             //xhr.open('GET', '/xhr_ajax?p=123');
    23             //xhr.send();
    24             // POST请求
    25             xhr.open('POST', '/xhr_ajax/');
    26             // 设置请求头
    27             xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
    28             xhr.send("k1=v1;k2=v2");
    29         }
    30         function XhrAjaxForm(){
    31             var xhr = new XMLHttpRequest();
    32             xhr.onreadystatechange = function(){
    33                // 只有服务器端返回数据时,处理请求
    34                 if(xhr.readyState == 4){
    35                     // 服务器端响应的内容已经接受完毕
    36                     console.log(xhr.responseText);
    37                 }
    38             };
    39             // GET请求
    40             //xhr.open('GET', '/xhr_ajax?p=123');
    41             //xhr.send();
    42             // POST请求
    43             xhr.open('POST', '/xhr_ajax/');
    44             // 设置请求头
    45             // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
    46             var form = new FormData();
    47             form.append('user', 'alex');
    48             form.append('pwd', '123');
    49             xhr.send(form);
    50         }
    51     </script>
    52 </body>
    53 </html>
    ajex

       

    2、验证码 + session

      1 import random
      2 from PIL import Image, ImageDraw, ImageFont, ImageFilter
      3 
      4 _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
      5 _upper_cases = _letter_cases.upper()  # 大写字母
      6 _numbers = ''.join(map(str, range(3, 10)))  # 数字
      7 init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
      8 
      9 def create_validate_code(size=(120, 30),
     10                          chars=init_chars,
     11                          img_type="GIF",
     12                          mode="RGB",
     13                          bg_color=(255, 255, 255),
     14                          fg_color=(0, 0, 255),
     15                          font_size=18,
     16                          font_type="Monaco.ttf",
     17                          length=4,
     18                          draw_lines=True,
     19                          n_line=(1, 2),
     20                          draw_points=True,
     21                          point_chance = 2):
     22     '''
     23     @todo: 生成验证码图片
     24     @param size: 图片的大小,格式(宽,高),默认为(120, 30)
     25     @param chars: 允许的字符集合,格式字符串
     26     @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
     27     @param mode: 图片模式,默认为RGB
     28     @param bg_color: 背景颜色,默认为白色
     29     @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
     30     @param font_size: 验证码字体大小
     31     @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
     32     @param length: 验证码字符个数
     33     @param draw_lines: 是否划干扰线
     34     @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
     35     @param draw_points: 是否画干扰点
     36     @param point_chance: 干扰点出现的概率,大小范围[0, 100]
     37     @return: [0]: PIL Image实例
     38     @return: [1]: 验证码图片中的字符串
     39     '''
     40 
     41     width, height = size # 宽, 高
     42     img = Image.new(mode, size, bg_color) # 创建图形
     43     draw = ImageDraw.Draw(img) # 创建画笔
     44 
     45     def get_chars():
     46         '''生成给定长度的字符串,返回列表格式'''
     47         return random.sample(chars, length)
     48 
     49     def create_lines():
     50         '''绘制干扰线'''
     51         line_num = random.randint(*n_line) # 干扰线条数
     52 
     53         for i in range(line_num):
     54             # 起始点
     55             begin = (random.randint(0, size[0]), random.randint(0, size[1]))
     56             #结束点
     57             end = (random.randint(0, size[0]), random.randint(0, size[1]))
     58             draw.line([begin, end], fill=(0, 0, 0))
     59 
     60     def create_points():
     61         '''绘制干扰点'''
     62         chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
     63 
     64         for w in range(width):
     65             for h in range(height):
     66                 tmp = random.randint(0, 100)
     67                 if tmp > 100 - chance:
     68                     draw.point((w, h), fill=(0, 0, 0))
     69 
     70     def create_strs():
     71         '''绘制验证码字符'''
     72         c_chars = get_chars()
     73         strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开
     74 
     75         font = ImageFont.truetype(font_type, font_size)
     76         font_width, font_height = font.getsize(strs)
     77 
     78         draw.text(((width - font_width) / 3, (height - font_height) / 3),
     79                     strs, font=font, fill=fg_color)
     80 
     81         return ''.join(c_chars)
     82 
     83     if draw_lines:
     84         create_lines()
     85     if draw_points:
     86         create_points()
     87     strs = create_strs()
     88 
     89     # 图形扭曲参数
     90     params = [1 - float(random.randint(1, 2)) / 100,
     91               0,
     92               0,
     93               0,
     94               1 - float(random.randint(1, 10)) / 100,
     95               float(random.randint(1, 2)) / 500,
     96               0.001,
     97               float(random.randint(1, 2)) / 500
     98               ]
     99     img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲
    100 
    101     img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)
    102 
    103     return img, strs
    check_code
     1 def check_code(request):
     2     import io
     3     from backend import check_code as CheckCode
     4 
     5     stream = io.BytesIO()
     6     # img图片对象,code在图像中写的内容
     7     img, code = CheckCode.create_validate_code()
     8     img.save(stream, "png")
     9 
    10     request.session["CheckCode"] = code
    11     return HttpResponse(stream.getvalue())
    12 
    13     # 代码:生成一张图片,在图片中写文件
    14     # request.session['CheckCode'] =  图片上的内容
    15 
    16     # 自动生成图片,并且将图片中的文字保存在session中
    17     # 将图片内容返回给用户
    Views
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form action="/login/" method="POST">
            <input type="text" name="username" />
            <input type="text" name="pwd" />
            <input type="text" name="check_code" />
            <img src="/check_code/" onclick="ChangeCode(this);">
            <input type="submit" />
        </form>
        <script>
            function ChangeCode(ths){
                ths.src = ths.src + '?';
            }
        </script>
    </body>
    </html>
    login



    抽屉:
        需求分析
        数据库设计
            - 用户表
            - 短信、邮件临时表
            - 新闻类型表:
                1  42区
                2  段子
                3  兔皮纳
                4  挨踢
                5  你问我答
            - 新闻表:
                    标题,摘要,url,赞数1
                    
                        http://dajia.qq.com/original/oldtimes/csc20160925.html
                    图片路径(url),摘要
                        /detail/1
                        
                    标题:asdf
                    摘要:asdfasd
                    URL:http://dajia.qq.com/original/oldtimes/csc20160925.html
                    类型:1
                    
                    标题:
                    摘要:asdfasd
                    URL:http://dajia.qq.com/original/oldtimes/csc20160925.html
                    类型:2
                    
            - 点赞表
                新闻ID    用户ID
                  1         1    
            
            - 评论表
                新闻ID    用户ID    评论内容   评论事件    顶   踩

     1 from django.db import models
     2 
     3 # Create your models here.
     4 
     5 class SendMsg(models.Model):
     6 
     7     nid = models.AutoField(primary_key=True)
     8     code = models.CharField(max_length=6)
     9     email = models.CharField(max_length=32, db_index=True)
    10     times = models.IntegerField(default=0)
    11     ctime = models.DateTimeField()
    12 
    13 
    14 class UserInfo(models.Model):
    15     nid = models.AutoField(primary_key=True)
    16     username = models.CharField(max_length=32, unique=True)
    17     password = models.CharField(max_length=32)
    18     email = models.CharField(max_length=32, unique=True)
    19     ctime = models.DateTimeField()
    20 
    21 class NewsType(models.Model):
    22     nid = models.AutoField(primary_key=True)
    23 
    24     caption = models.CharField(max_length=32)
    25 
    26 class News(models.Model):
    27     nid = models.AutoField(primary_key=True)
    28     user_info = models.ForeignKey('UserInfo')
    29     news_type = models.ForeignKey('NewsType')
    30     title = models.CharField(max_length=32, db_index=True)
    31     url = models.CharField(max_length=128)
    32     content = models.CharField(max_length=50)
    33     favor_count = models.IntegerField(default=0)
    34     comment_count = models.IntegerField(default=0)
    35     ctime = models.DateTimeField()
    36 
    37 
    38 class Favor(models.Model):
    39     nid = models.AutoField(primary_key=True)
    40     user_info = models.ForeignKey('UserInfo')
    41     news = models.ForeignKey('News')
    42     ctime = models.DateTimeField()
    43 
    44     class Meta:
    45         unique_together = (("user_info", "news"),)
    46 
    47 class Comment(models.Model):
    48     nid = models.AutoField(primary_key=True)
    49 
    50     user_info = models.ForeignKey('UserInfo')
    51     news = models.ForeignKey('News')
    52 
    53     up = models.IntegerField(default=0)
    54     down = models.IntegerField(default=0)
    55     ctime = models.DateTimeField()
    56 
    57 
    58     device = models.CharField(max_length=16)
    59     content = models.CharField(max_length=150)
    60 
    61     reply_id = models.ForeignKey('Comment', related_name='b', null=True, blank=True)
    models

                
            
            
        功能开发:
            注册
            登录
            发布新闻
            点赞
            评论    

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import io
    import json
    import datetime
    
    from django.shortcuts import HttpResponse,redirect
    
    from web.forms.account import SendMsgForm,RegisterForm,LoginForm
    from web import models
    
    from backend import commons
    from backend.utils import check_code as CheckCode
    from backend.utils.response import BaseResponse
    
    
    def check_code(request):
        stream = io.BytesIO()
        img, code = CheckCode.create_validate_code()
        img.save(stream, "png")
        request.session["CheckCode"] = code
        return HttpResponse(stream.getvalue())
    
    
    def send_msg(request):
        rep = BaseResponse()
        # rep.__dict__
        #  {'status': True, 'error': ''}
        # ret =
        # ret['status']
        form = SendMsgForm(request.POST)
        if form.is_valid():
            # 如果认证成功后,获取用户输入的数据
            _value_dict = form.clean()
            email = _value_dict['email']
    
            has_exists_email = models.UserInfo.objects.filter(email=email).count()
            if has_exists_email:
                rep.summary = "此邮箱已经被注册"
                return HttpResponse(json.dumps(rep.__dict__))
    
    
            current_date = datetime.datetime.now() # 获取当前事件
            code = commons.random_code()  # 随机验证码
    
            count = models.SendMsg.objects.filter(email=email).count()
            if not count:
                models.SendMsg.objects.create(code=code, email=email, ctime=current_date)
                rep.status = True
            else:
                limit_day = current_date - datetime.timedelta(hours=1)
    
                times = models.SendMsg.objects.filter(email=email, ctime__gt=limit_day, times__gt=9).count()
                if times:
                    rep.summary = "'已超最大次数(1小时后重试)'"
                else:
                    unfreeze = models.SendMsg.objects.filter(email=email, ctime__lt=limit_day).count()
                    if unfreeze:
                        models.SendMsg.objects.filter(email=email).update(times=0)
    
                    from django.db.models import F
                    models.SendMsg.objects.filter(email=email).update(code=code,
                                                                      ctime=current_date,
                                                                      times=F('times')+1)
                    rep.status = True
        else:
    
            error_dict = json.loads(form.errors.as_json())
            rep.summary = error_dict['email'][0]['message']
    
        print(rep.__dict__)
        return HttpResponse(json.dumps(rep.__dict__))
    
    
    def register(request):
        rep = BaseResponse()
        form = RegisterForm(request.POST)
        if form.is_valid():
            current_date = datetime.datetime.now()
            limit_day = current_date - datetime.timedelta(minutes=1)
            _value_dict = form.clean()
    
            is_valid_code = models.SendMsg.objects.filter(email=_value_dict['email'],
                                                          code=_value_dict['email_code'],
                                                          ctime__gt=limit_day).count()
            if not is_valid_code:
                rep.message['email_code'] = [{'message':'邮箱验证码不正确或过期'}]
                return HttpResponse(json.dumps(rep.__dict__))
    
            has_exists_email = models.UserInfo.objects.filter(email=_value_dict['email']).count()
    
            if has_exists_email:
                rep.message['email'] = [{'message':'邮箱已经存在'}]
                return HttpResponse(json.dumps(rep.__dict__))
    
            has_exists_username = models.UserInfo.objects.filter(username=_value_dict['username']).count()
            if has_exists_username:
                rep.message['email'] = [{'message':'用户名已经存在'}]
                return HttpResponse(json.dumps(rep.__dict__))
    
            _value_dict['ctime'] = current_date
            _value_dict.pop('email_code')
            obj = models.UserInfo.objects.create(**_value_dict)
    
            user_info_dict = {'nid': obj.nid, 'email': obj.email, 'username': obj.username}
    
            models.SendMsg.objects.filter(email=_value_dict['email']).delete()
    
            request.session['is_login'] = True
            request.session['user_info'] = user_info_dict
            print(request.session['user_info'])
            rep.status = True
    
        else:
            error_msg = form.errors.as_json()
            rep.message = json.loads(error_msg)
        return HttpResponse(json.dumps(rep.__dict__))
    
    
    def login(request):
        print('login')
        rep = BaseResponse()
        form = LoginForm(request.POST)
        if form.is_valid():
            _value_dict = form.clean()
            if _value_dict['code'].lower() != request.session["CheckCode"].lower():
                rep.message = {'code':[{'message':'验证码错误'}]}
                return HttpResponse(json.dumps(rep.__dict__))
    
            from django.db.models import Q
            con = Q()
    
            q1 = Q()
            q1.connector = 'AND'
            q1.children.append(('email', _value_dict['user']))
            q1.children.append(('password', _value_dict['pwd']))
    
            q2 = Q()
            q2.connector = 'AND'
            q2.children.append(('username', _value_dict['user']))
            q2.children.append(('password', _value_dict['pwd']))
    
            con.add(q1, 'OR')
            con.add(q2, 'OR')
    
            obj = models.UserInfo.objects.filter(con).first()
            if not obj:
                rep.message = {'user': [{'message':'用户名邮箱或密码错误'}]}
                return HttpResponse(json.dumps(rep.__dict__))
    
            request.session['is_login'] = True
            request.session['user_info'] = {'nid': obj.nid, 'email': obj.email, 'username': obj.username}
            rep.status = True
        else:
            error_msg = form.errors.as_json()
            print(error_msg)
            rep.message = json.loads(error_msg)
    
        return HttpResponse(json.dumps(rep.__dict__))
    
    
    def logout(request):
    
        request.session.clear()
        return redirect('/index/')
    account
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import os
    import copy
    import datetime
    import json
    
    from django.shortcuts import render, HttpResponse
    from django.db.models import F
    
    from web import models
    from web.forms.home import IndexForm
    
    from backend.utils.pager import Pagination
    from backend.utils.response import BaseResponse,StatusCodeEnum
    from backend import commons
    
    
    class CJsonEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj, datetime.datetime):
                return obj.strftime('%Y-%m-%d %H:%M:%S')
            else:
                return json.JSONEncoder.default(self, obj)
    
    
    # json.dumps({'d': datetime.now()}, cls=DatetimeEncoder)
    
    
    def index(request):
        # print(request.session['is_login'])
        # print(request.session['user_info'])
    
        if request.method == 'GET':
            page = request.GET.get('page', 1)
            all_count = models.News.objects.all().count()
    
            obj = Pagination(page, all_count)
    
            # result = models.News.objects.all().values_list('nid',
            #                                               'title',
            #                                               'url',
            #                                               'content',
            #                                               'ctime',
            #                                               'user_info__username',
            #                                               'news_type__caption',
            #                                               'favor_count',
            #                                               'comment_count',
            #                                               'favor__nid')[obj.start: obj.end]
            sql = """
            SELECT
                "web_news"."nid",
                "web_news"."title",
                "web_news"."url",
                "web_news"."content",
                "web_news"."ctime",
                "web_userinfo"."username",
                "web_newstype"."caption",
                "web_news"."favor_count",
                "web_news"."comment_count",
                "web_favor"."nid"
            FROM
                "web_news"
            LEFT OUTER JOIN "web_userinfo" ON (
                "web_news"."user_info_id" = "web_userinfo"."nid"
            )
            LEFT OUTER JOIN "web_newstype" ON (
                "web_news"."news_type_id" = "web_newstype"."nid"
            )
            LEFT OUTER JOIN "web_favor" ON (
                "web_news"."nid" = "web_favor"."news_id"
                and
                "web_news".user_info_id = %s
            )
    
            LIMIT 10 OFFSET %s
            """
    
            from django.db import connection
            cursor = connection.cursor()
            if request.session.get('user_info'):
                cursor = connection.cursor()
                current_login_user_nid = request.session['user_info']['nid']
                cursor.execute(sql, [current_login_user_nid, obj.start])
            else:
                cursor.execute(sql, [None, obj.start])
            result = cursor.fetchall()
            print(result)
            str_page = obj.string_pager('/index/')
    
            return render(request, 'index.html', {'str_page': str_page, 'news_list': result})
        else:
            rep = BaseResponse()
    
            form = IndexForm(request.POST)
            if form.is_valid():
                # title,content,href,news_type,user_info_id
                _value_dict = form.clean()
                input_dict = copy.deepcopy(_value_dict)
                input_dict['ctime'] = datetime.datetime.now()
                input_dict['user_info_id'] = request.session['user_info']['nid']
                models.News.objects.create(**input_dict)
                rep.status = True
            else:
    
                error_msg = form.errors.as_json()
                rep.message = json.loads(error_msg)
    
            return HttpResponse(json.dumps(rep.__dict__),)
    
    
    def favor(request):
        rep = BaseResponse()
    
        news_id = request.POST.get('news_id', None)
        if not news_id:
            rep.summary = "新闻ID不能为空."
        else:
            user_info_id = request.session['user_info']['nid']
    
            has_favor = models.Favor.objects.filter(user_info_id=user_info_id, news_id=news_id).count()
            if has_favor:
                models.Favor.objects.filter(user_info_id=user_info_id, news_id=news_id).delete()
                models.News.objects.filter(nid=news_id).update(favor_count=F('favor_count')-1)
    
                rep.code = StatusCodeEnum.FavorMinus
            else:
                models.Favor.objects.create(user_info_id=user_info_id, news_id=news_id, ctime=datetime.datetime.now())
                models.News.objects.filter(nid=news_id).update(favor_count=F('favor_count')+1)
    
                rep.code = StatusCodeEnum.FavorPlus
    
            rep.status = True
    
        return HttpResponse(json.dumps(rep.__dict__))
    
    
    def upload_image(request):
    
        rep = BaseResponse()
        try:
            obj = request.FILES.get('img')
            file_path = os.path.join('statics', 'upload', commons.generate_md5(obj.name))
    
            f = open(file_path, 'wb')
            for chunk in obj.chunks():
                f.write(chunk)
            f.close()
    
            rep.status = True
            rep.data = file_path
        except Exception as ex:
            rep.summary = str(ex)
        return HttpResponse(json.dumps(rep.__dict__))
    
    def comment(request):
        rep = BaseResponse()
        if request.method == "POST":
            user_info_id = request.session.get('user_info')['nid']
            news_id = request.POST.get('news_id', None)
            device = request.POST.get('device', None)
            content = request.POST.get('content', None)
            reply_id = request.POST.get('reply_id', None)
            ctime = datetime.datetime.now()
            # models.Comment.objects.create(user_info_id=user_info)
            username = request.session.get('user_info')['username']
            rep.status = True
            # print(user_info, news_id, ctime, device, content, reply_id )
            models.Comment.objects.create(user_info_id=user_info_id, news_id=news_id, ctime=ctime, device=device, content=content, reply_id=reply_id)
            models.News.objects.filter(nid=news_id).update(comment_count=F('comment_count') + 1)
            c = models.Comment.objects.filter(ctime=ctime).values('nid','user_info__username','news_id','content','reply_id','ctime')
            # print(c[0])
            rep.data = c[0]
            # print(json.dumps(rep.data))
        return HttpResponse(json.dumps(rep.__dict__, cls=CJsonEncoder))
    
    
    def comment_tit(request):
        data_list = []
        if request.method == "GET":
            nid = request.GET.get('nid', None)
            # print(nid)
            count = models.Comment.objects.filter(news=nid).values('nid','user_info__username','news_id','content','reply_id', 'ctime')
            for item in count:
                print(item["ctime"])
                a = '<ul><li class="items" style="padding:8px 0 0 16px;"><span class="folder" id="comment_folder_'
                b = str(item["nid"])
                c = '"><div class="comment-L comment-L-top"><a href="#" class="icons zhan-ico"></a><a href="/user/moyujian/submitted/1"><img src="/statics/images/1.jpg"></a></div><div class="comment-R comment-R-top" style="background-color: rgb(246, 246, 246);"><div class="pp"><a class="name" href="/user/moyujian/submitted/1">'
                d = item["user_info__username"]
                e = '</a><span class="p3">'
                f = item["content"]
                g= '</span><span class="into-time into-time-top">'
                h = str(item["ctime"])
                i = '</span></div><div class="comment-line-top"><div class="comment-state"><a class="ding" href="javascript:void(0);"><b>顶</b><span class="ding-num">[0]</span></a><a class="cai" href="javascript:void(0);"><b>踩</b><span class="cai-num">[0]</span></a><span class="line-huifu">|</span> <a class="see-a jubao" href="javascript:void(0);">举报</a> <span class="line-huifu">|</span> <a class="see-a huifu-a" href="javascript:void(0);" onclick="'
                j = "reply(" + str(item['news_id']) + "," +str(item["nid"])+",'"+item["user_info__username"]+"')"
                k = '">回复</a></div></div></div></span></li></ul>'
                tag = a+b+c+d+e+f+g+h+i+j+k
                data_list.append(tag)
            data = "
    ".join(data_list)
            # data = '<ul><li class="items" style="padding:8px 0 0 16px;"><span class="folder" id="comment_folder_11"><div class="comment-L comment-L-top"><a href="#" class="icons zhan-ico"></a><a href="/user/moyujian/submitted/1"><img src="/statics/images/1.jpg"></a></div><div class="comment-R comment-R-top" style="background-color: rgb(246, 246, 246);"><div class="pp"><a class="name" href="/user/moyujian/submitted/1">alex</a><span class="p3">tetst123123</span><span class="into-time into-time-top">undefined</span></div><div class="comment-line-top"><div class="comment-state"><a class="ding" href="javascript:void(0);"><b>顶</b><span class="ding-num">[0]</span></a><a class="cai" href="javascript:void(0);"><b>踩</b><span class="cai-num">[0]</span></a><span class="line-huifu">|</span> <a class="see-a jubao" href="javascript:void(0);">举报</a> <span class="line-huifu">|</span> <a class="see-a huifu-a" href="javascript:void(0);" onclick="reply(3,11,"undefined")">回复</a></div></div></div></span></li></ul>"'
        return HttpResponse(data)
    home
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>抽屉新热榜</title>
        <link rel="stylesheet" href="/statics/css/commons.css" />
        {% block css %} {% endblock %}
    </head>
    <body>
        <div class="pg-header">
            <div class="w">
                <a class="logo" href="/"></a>
                <div class="act-menu">
                    <a href="/all/hot/recent/1" class="tb active">全部</a>
                    <a href="/all/hot/recent/1" class="tb">42区</a>
                    <a href="/all/hot/recent/1" class="tb">段子</a>
                    <a href="/all/hot/recent/1" class="tb">图片</a>
                    <a href="/all/hot/recent/1" class="tb">挨踢1024</a>
                    <a href="/all/hot/recent/1" class="tb">你问我答</a>
                </div>
                <div class="key-sera">
    
                    <form action="/search/show" method="post" name="searchFrm2" id="searchFrm2">
                        <input type="text" class="search-txt-s" name="words" id="txtSearch2" autocomplete="off">
    
                        <a href="javascript:;" class="i" name="searchBtn_2" id="searchBtn_3"><span class="ico"></span></a>
                        <input type="hidden" value="1" id="page" name="page">
                    </form>
    
                </div>
    
                {% if request.session.is_login %}
                    <div id="action_nav" is-login="true" class="action-nav">
                        <a href="/show/flow/1" style="float:left;position:relative;" id="btnDtaiShw">动态
                            <b class="notice-num-title" id="Dtai-num-title" style="right: 3px; display: none;">
                                <em id="Dtai-em"></em>
                            </b>
                        </a>
                        <a href="javascript:;" id="btnNotShw" class="notice-box">通知
                            <b class="notice-num-title" id="notice-num-title" style="display: none;">
                                <em id="notice-em"></em>
                                <i>+</i>
                            </b>
                        </a>
                        <a href="/user/link/saved/1" id="loginUserNc" class="userPro-Box">
                            <img src="" id="userProImg">
                            <span class="u-nick" id="userProNick">{{ request.session.user_info.username}}</span>
                            <em id="userProArr"></em>
                        </a>
                    </div>
                    <div class="user-opr-box" id="userOprBox" style="left: 869px; display: none;">
                        <a href="/user/link/saved/1" style="border-top:0;">我的新热榜</a>
                        <a href="/profile">设置</a>
                        <a class="logout" href="/logout/">退出</a>
                        <a href="http://www.chouti.com/cdu_45792645155" target="_blank" class="ie6-a">我的收藏</a>
                    </div>
                {% else %}
                    <div id="action_nav" is-login="false" class="action-nav">
                        <a href="javascript:void(0);" class="login-btn-a" id="reg_link_a">注册</a>
                        <a href="javascript:void(0);" class="login-btn-a" id="login_link_a">登录</a>
                    </div>
                {% endif %}
    
    
            </div>
    
        </div>
    
        <div class="pg-body">
    
            {% block body %} {% endblock %}
    
        </div>
    
        <div class="pg-footer" style="background-color: #eee;">
            <div class="w" style="background-color: #ffffff;">
                <div class="foot-nav">
                    <div style="display:none" id="y-destjid"></div>
                    <div style="display:none" id="y-destnick"></div>
                    <a href="/help/about" target="_blank">关于我们</a><span>|</span><a href="/help/contact" target="_blank">联系我们</a><span>|</span><a href="/help/service" target="_blank">服务条款</a><span>|</span><a href="/help/privacy" target="_blank">隐私政策</a><span>|</span><a href="/help/tool" target="_blank">抽屉新热榜工具</a><span>|</span><!--<a href="http://img.chouti.com/toolsffcj.html" target="_blank">浏览器插件</a><span>|</span>--><a href="/download/model" target="_blank">下载客户端</a><span>|</span><a href="/feedback" target="_blank">意见与反馈</a><span>|</span><a href="/help/goodlink" target="_blank">友情链接</a><span>|</span><a href="http://www.shouye.com/Index.do?method=show&amp;pageId=44251&amp;jid=xinrebang@gozap.com" target="_blank">公告</a><!--<span>|</span><a href="/points/gifts" target="_blank">积分商城</a>-->
                    <a href="#" target="_blank" style="margin-left:0;vertical-align:-2px;" title="Rss订阅,Feed地址:http://dig.chouti.com/feed.xml"><img src="" width="36" height="14"></a>
                </div>
                <div class="foot-nav2">
                    <a target="_blank" href="http://www.gozap.com/"><img class="foot_e" src=""></a>
                    <span class="foot_d">旗下站点</span>
                    <span class="foot_a">© 2016 chouti.com</span>
                    <a target="_blank" href="http://www.miibeian.gov.cn/" class="foot_b">京ICP备09053974号-3 京公网安备 110102004562</a>
                    <div style="margin-top:6px;">版权所有:北京格致璞科技有限公司</div>
                </div>
            </div>
        </div>
    
        <script src="/statics/js/jquery-1.12.4.js"></script>
        {% block javascript %} {% endblock %}
        <script>
            $(function(){
                $('#loginUserNc,#userOprBox').mouseover(function(){
                    $('#userOprBox').css('display', 'block');
                    $('#loginUserNc').addClass('active');
                }).mouseout(function () {
                    $('#userOprBox').css('display', 'none');
                    $('#loginUserNc').removeClass('active');
                })
            })
        </script>
    </body>
    </html>
    _layout
    {% extends "_layout.html" %}
    
    {% block css %}
        <link rel="stylesheet" href="/statics/plugins/tab-menu-box/tab.css" />
    {% endblock %}
    
    {% block body %}
        <div style="background-color: #eee;">
            <div class="w body-content">
                <div class="clearfix">
    
                    <div class="content-l" >
                        <div class="nav-top-area">
                            <div class="child-nav">
                                <a href="/r/pic/hot/1" hidefocus="false" class="icons active hotbtn" id="hotts-nav-btn">最热</a>
                                <a href="/r/pic/new/1" hidefocus="false" class="newbtn" id="newest-nav-btn">最新</a>
                            </div>
    
                            {% if userinfo.is_login %}
                                <a href="javascript:void(0);" class="publish-btn" id="publishBtn">
                                    <span class="ico n1"></span><span class="n2">发布</span>
                                </a>
                            {% else %}
                                <a href="javascript:void(0);" class="publish-btn" id="publishBtn">
                                    <span class="ico n1"></span><span class="n2">发布</span>
                                </a>
                            {% endif %}
                        </div>
    
                        <div class="content-list" id="content_list">
                            {% for item in news_list %}
    
                                <div class="item">
    
                                    <div class="news-pic">
                                        <img src="" alt="抽屉新热榜" style="display: inline;">
                                    </div>
    
                                    <div class="null-item"></div>
    
                                    <div class="news-content">
                                        <div class="part1">
                                            <a href="{{item.2}}" class="show-content" target="_blank">{{item.1}}</a>
                                            <span class="content-source">-wallstreetcn.com</span>
                                            <a href="/r/news/hot/1" class="n2">
                                                <span class="content-kind">{{item.6}}</span>
                                            </a>
                                        </div>
                                        <div class="area-summary">
                                            <span class="summary">{{item.3}}</span>
                                        </div>
                                        <div class="part2">
                                            <a href="javascript:void(0);" class="digg-a" title="推荐" onclick="DoFavor(this,{{item.0}});">
                                                {% if item.9 %}
                                                    <span class="hand-icon icon-digg active"></span>
                                                {% else %}
                                                    <span class="hand-icon icon-digg"></span>
                                                {% endif %}
                                                <b id="favor_count_{{item.0}}">{{item.7}}</b>
                                            </a>
                                            <a href="javascript:void(0);" class="discus-a" onclick="ToggleCommentArea({{item.0}});">
                                                <span class="hand-icon icon-discus"></span>
                                                <b id="comment_count_{{item.0}}">{{item.8}}</b>
                                            </a>
                                            <a href="javascript:void(0);" class="collect-a" >
                                                <span class="hand-icon icon-collect"></span><b>私藏</b>
                                            </a>
                                            <a href="#" class="user-a">
                                                <span><img src=""></span>
                                                <b>{{item.5}}</b>
                                            </a>
                                            <span class="time-into">
                                                <a class="time-a" href="#" target="_blank">
                                                    <b>{{item.4|date:"Y-m-d H:i:s"}}</b>
                                                </a>
                                                <i>入热榜</i>
                                            </span>
    
                                        </div>
                                        <!-- 评论区域 -->
                                        <div id="comment_area_{{item.0}}" class="comment-box-area hide" >
                                            <div class="pinglun arrow" id="comt-arrow-8118680"></div>
                                            <a class="pinglun close-comt" title="关闭" href="javascript:void(0);" onclick="HideCommentArea({{item.0}});"></a>
    
                                            <div class="corner comment-box clearfix" >
    
                                                <div class="loading-ico loading-ico-top"  style="margin-left:230px;">加载中,请稍候...</div>
    
                                                <div class="comment-box-top hide" >
                                                    <div class="tip-1">最热评论(<span>{{item.8}}</span>)</div>
                                                    <div class="tip-2">
                                                        <a href="#" target="_blank">
                                                            <em class="pinglun em1"></em>
                                                            <span>去评论页面</span>
                                                        </a>
                                                    </div>
                                                </div>
    
                                                <ul id="comment_list_{{item.0}}" class="filetree comment-list-top-2 treeview hide">
    
                                                </ul>
    
                                                <div class="huifu-top-box hide">
                                                    <div class="box-l txt-input-area-div-top corner no-corner-bottom">
                                                        <div class="lab-comment-top">回复  <span id="reply_id_{{item.0}}"></span>:</div>
                                                        <!-- 针对谣言文本输入框无效 -->
                                                            <textarea id="comment_content_{{item.0}}" maxlength="150" name="txt-huifu-top" class="txt-huifu txt-huifu-top"></textarea>
                                                    </div>
                                                    <div class="box-r">
                                                        <a href="javascript:void(0);" class="pub-icons add-pub-btn add-pub-btn-unvalid" onclick="DoComment({{item.0}})">评论</a>
                                                        <a href="javascript:void(0);" class="loading-ico loading-ico-top pub-loading-top hide">发布中...</a>
                                                    </div>
                                                </div>
                                                <div class="tip-3 ">
                                                    <a href="javascript:void(0);" class="hiddenCom-Btn" onclick="HideCommentArea({{item.0}});">
                                                        <em class="pinglun em2"></em>
                                                        <span>收起</span>
                                                    </a>
                                                </div>
    
                                            </div>
    
                                        </div>
    
    
                                    </div>
    
                                </div>
    
                            {% endfor %}
                        </div>
    
                        <div class="pagination">
                            {{ str_page }}
                        </div>
                    </div>
    
    
                    <div class="content-r">
    
                    </div>
                </div>
            </div>
        </div>
    
        <div class="shadow hide"></div>
    
        <div id="publishDialog" class="dialog hide">
            <div class="dialog-title-bar">
                <div class="dialog-title">
                    <span>分享新发现</span>
                </div>
                <div class="dialog-close" onclick="CloseDialog('#publishDialog');">X</div>
            </div>
            <div class="dialog-content">
                <div class="tab-menu-box">
                    <div class="menu">
                        <ul id="tab-menu-title">
                            <li content-to="1" class="current">链接</li>
                            <li content-to="2" >文字</li>
                            <li content-to="3" >图片</li>
                        </ul>
                    </div>
    
                    <div id="tab-menu-body" class="content">
                        <div content="1" class="publish-content clearfix">
                            <div class="tab-alt">添加链接</div>
                            <div class="f1 clearfix">
                                <div class="left"><input type="text"  name="url" /></div>
                                <div class="right"><a href="javascript:void(0);">获取标题</a></div>
                            </div>
                            <div class="tab-alt">标题</div>
                            <div class="f2">
    
                                <input type="text" name="title" />
                            </div>
                            <div class="tab-alt">添加摘要(选填)</div>
                            <div class="f2">
                                <textarea name="content"></textarea>
                            </div>
                            <div class="f3">
                                <span>发布到:</span>
                                <div class="news-type" style="display: inline-block">
                                    <a value="1" class="active">42区</a>
                                    <a value="2" >段子</a>
                                    <a value="3" >图片</a>
                                    <a value="4" >挨踢1024</a>
                                    <a value="5" >你问我答</a>
                                </div>
                            </div>
                            <div class="f4">
                                <a class="submit right" id="submit_link">提交</a>
                                <span class="error-msg right"></span>
                            </div>
                        </div>
                        <div content="2" class="publish-content clearfix hide">
                            <div class="f2">
                                <textarea name="title"></textarea>
                            </div>
                            <div class="f3">
    
                                <span>发布到:</span>
                                <div class="news-type" style="display: inline-block">
                                    <a value="2" class="active">段子</a>
                                    <a value="5">你问我答</a>
                                </div>
                            </div>
                            <div class="f4">
                                <a class="submit right" id="submit_text">提交</a>
                                <span class="error-msg right"></span>
                            </div>
                        </div>
                        <div content="3" class="publish-content clearfix hide">
                            <div class="tab-alt">添加图片</div>
                            <div class="f5">
                                <form style="display: inline-block" id="upload_img_form" name="form" action="/upload_image/" method="POST"  enctype="multipart/form-data" >
                                    <a id="fakeFile" class="fake-file">
                                        <span>上传图片</span>
                                        <input type="file" name="img" onchange="UploadImage(this);"/>
                                        <input type="text" name="url" class="hide" />
                                    </a>
                                    <iframe id='upload_img_iframe' name='upload_img_iframe' src=""  class="hide"></iframe>
                                </form>
                                <a href="javascript:void(0);" class="re-upload hide" id="reUploadImage" onclick="ReUploadImage(this);">重新上传</a>
                            </div>
                            <div class="f2" style="margin-top: 8px">
                                <textarea name="title" placeholder="请输入描述"></textarea>
                            </div>
                            <div class="f3">
                                <span>发布到:</span>
                                <div class="news-type" style="display: inline-block">
                                    <a value="3" class="active">图片</a>
                                    <a value="5">你问我答</a>
                                </div>
                            </div>
                            <div class="f4">
                                <a class="submit right" id="submit_img">提交</a>
                                <span class="error-msg right"></span>
                            </div>
                        </div>
                    </div>
                </div>
    
            </div>
        </div>
    
        <div id="accountDialog" class="account-dialog hide clearfix">
            <div id="model_login" class="login left">
                <div class="header">登陆</div>
                <div class="content">
                    <div style="padding: 0 70px">
                        <div class="tips">
                            <span>用户名登陆</span>
                            <span style="padding: 0 5px;">|</span>
                            <span>邮箱登陆</span>
                        </div>
                        <div id="login_error_summary" class="error-msg">
    
                        </div>
                        <div class="inp">
                            <input name="user" type="text" placeholder="请输入用户名或邮箱" />
                        </div>
                        <div class="inp">
                            <input name="pwd" type="password" placeholder="请输入密码" />
                        </div>
                        <div class="inp clearfix">
                            <input name="code" class="check-code" type="text" placeholder="请输入验证码" />
                            <span>
                                <img class="check-img" src="/check_code/" alt="验证码" onclick="ChangeCode(this);">
                            </span>
    
                        </div>
                        <div class="extra">
                            <input type="checkbox" name="autoLogin" checked="checked" /> <span>一个月内自动登录</span>
                            <a class="right" href="javascript:void(0);">忘记密码?</a>
                        </div>
                        <div class="inp">
                            <div class="submit" onclick="SubmitLogin(this);">
                                <span>登陆</span>
                                <span class="hide">
                                    <img src="/statics/images/loader.gif" style="height: 16px; 16px">
                                    <span>正在登陆</span>
                                </span>
                            </div>
                        </div>
                    </div>
                    <script>
                        function ChangeCode(ths) {
                            ths.src += '?';
                        }
                    </script>
                </div>
            </div>
            <div id="model_register" class="register left">
                <div class="header">
                    <span>注册</span>
                    <div class="dialog-close" onclick="CloseDialog('#accountDialog');">X</div>
                </div>
                <div class="content">
                    <div style="padding: 0 70px">
                        <div class="tips">
                            <span>输入注册信息</span>
                        </div>
                        <div id="register_error_summary" class="error-msg">
    
                        </div>
                        <div class="inp">
                            <input name="username" type="text" placeholder="请输入用户名" />
    
                        </div>
                        <div class="inp">
                            <input name="email" id="email" type="text" placeholder="请输入邮箱" />
                        </div>
                        <div class="inp">
                            <input name="email_code" class="email-code" type="text" placeholder="请输入邮箱验证码" />
                            <a id="fetch_code" class="fetch-code" href="javascript:void(0);">获取验证码</a>
                        </div>
                        <div class="inp">
                            <input name="password" type="password" placeholder="请输入密码" />
                        </div>
                        <div class="inp">
                            <div class="submit" onclick="SubmitRegister(this);">
                                <span>注册</span>
                                <span class="hide">
                                    <img src="/statics/images/loader.gif" style="height: 16px; 16px">
                                    <span>正在注册</span>
                                </span>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    
    {% endblock %}
    
    {% block javascript %}
        <script type="text/javascript" src="/statics/plugins/tab-menu-box/tab.js"></script>
        <script type="text/javascript">
            $(function () {
                BindTabMenu('#tab-menu-title', '#tab-menu-body');
    
                BindLoginRegisterDialog();
    
                BindPublishDialog();
    
                BindSendMsg();
    
                BindNewType();
    
                BindPublishSubmit();
            });
    
            function BindPublishSubmit(){
                $('#submit_link,#submit_text,#submit_img').click(function(){
                    // 获取输入内容并提交
                    var container = $(this).parent().parent();
                    var post_dict = {};
                    container.find('input[type="text"],textarea').each(function(){
                        post_dict[$(this).attr('name')] =$(this).val();
                    });
                    post_dict['news_type_id'] = container.find('.news-type .active').attr('value');
    
                    $.ajax({
                        url: '/index/',
                        type: 'POST',
                        data: post_dict,
                        dataType: 'json',
                        success: function (arg) {
                            if(arg.status){
                                window.location.href = '/index';
                            }else{
                                console.log(arg);
                            }
                        }
                        
                    })
    
    
                });
            }
    
            function BindNewType(){
                $('.news-type').children().click(function(){
                    $(this).addClass('active').siblings().removeClass('active');
                });
            }
    
            function BindSendMsg(){
                $("#fetch_code").click(function(){
                    $('#register_error_summary').empty();
                    var email = $('#email').val();
                    if(email.trim().length == 0){
                        $('#register_error_summary').text('请输入注册邮箱');
                        return;
                    }
                    if($(this).hasClass('sending')){
                        return;
                    }
                    var ths = $(this);
                    var time = 60;
    
                    $.ajax({
                        url: "/send_msg/",
                        type: 'POST',
                        data: {email: email},
                        dataType: 'json',
                        success: function(arg){
                            if(!arg.status){
                                $('#register_error_summary').text(arg.summary);
                            }else{
                                ths.addClass('sending');
                                var interval = setInterval(function(){
                                ths.text("已发送(" + time + ")");
                                time -= 1;
                                if(time <= 0){
                                    clearInterval(interval);
                                    ths.removeClass('sending');
                                    ths.text("获取验证码");
                                }
                            }, 1000);
                            }
                        }
                    });
    
                });
            }
    
            function BindLoginRegisterDialog(){
    
                $('#reg_link_a,#login_link_a').click(function(){
                    $('#accountDialog').removeClass('hide');
                    $('.shadow').removeClass('hide');
                });
            }
    
            function BindPublishDialog(){
    
                $('#publishBtn').click(function(){
                    if($('#action_nav').attr('is-login') == 'true'){
                        $('#publishDialog').removeClass('hide');
                    }else{
                        $('#accountDialog').removeClass('hide');
                    }
    
                    $('.shadow').removeClass('hide');
                });
    
            }
    
            function CloseDialog(dialog){
                $(dialog).addClass('hide');
                $('.shadow').addClass('hide');
            }
    
            window.onkeydown = function(event){
                if(event && event.keyCode == 27){
                    $('.dialog,.account-dialog,.shadow').addClass('hide');
                }
            };
    
            /*
            上传图片
            */
            function UploadImage(ths){
                document.getElementById('upload_img_iframe').onload = UploadImageComplete;
                document.getElementById('upload_img_form').target = 'upload_img_iframe';
                document.getElementById('upload_img_form').submit();
            }
    
            /*
            上传图片之后回掉函数
            */
            function UploadImageComplete(){
                var origin = $("#upload_img_iframe").contents().find("body").text();
                var obj = JSON.parse(origin);
                if(obj.status){
                    var img = document.createElement('img');
                    img.src = '/' + obj.data;
                    img.style.width = "200px";
                    img.style.height = "180px";
                    $("#upload_img_form").append(img);
                    $('#fakeFile').addClass('hide');
                    $('#reUploadImage').removeClass('hide');
                    $('#fakeFile').find('input[type="text"]').val(obj.data);
                }else{
                    alert(obj.summary);
                }
            }
    
            /*
            重新上传图片
            */
            function ReUploadImage(ths){
                $(ths).addClass('hide');
                $("#upload_img_form").find('img').remove();
                $('#fakeFile').removeClass('hide');
            }
    
            /*
            点击登陆按钮
            */
            function SubmitLogin(ths){
                $(ths).children(':eq(0)').addClass('hide');
                $(ths).addClass('not-allow').children(':eq(1)').removeClass('hide');
                // 发送Ajax请求
                //完成之后
                $('#model_login .inp .error').remove();
    
                var post_dict = {};
                $('#model_login input').each(function(){
                    post_dict[$(this).attr("name")] = $(this).val();
                });
    
                $.ajax({
                    url: '/login/',
                    type: 'POST',
                    data: post_dict,
                    dataType: 'json',
                    success: function(arg){
                        if(arg.status){
                            window.location.href = '/index';
                        }else{
                            $.each(arg.message, function(k,v){
    
                                //<span class="error">s</span>
                                var tag = document.createElement('span');
                                tag.className = 'error';
                                tag.innerText = v[0]['message'];
                                $('#model_login input[name="'+ k +'"]').after(tag);
                            })
                        }
                    }
                });
    
                $(ths).removeClass('not-allow').children(':eq(1)').addClass('hide');
                $(ths).children(':eq(0)').removeClass('hide');
            }
    
            /*
            点击注册按钮
            */
            function SubmitRegister(ths){
                $('#register_error_summary').empty();
                $('#model_register .inp .error').remove();
    
                $(ths).children(':eq(0)').addClass('hide');
                $(ths).addClass('not-allow').children(':eq(1)').removeClass('hide');
    
                var post_dict = {};
                $('#model_register input').each(function(){
                    post_dict[$(this).attr("name")] = $(this).val();
                });
    
                $.ajax({
                    url: '/register/',
                    type: 'POST',
                    data: post_dict,
                    dataType: 'json',
                    success: function(arg){
                        if(arg.status){
                            window.location.href = '/index';
                        }else{
                            $.each(arg.message, function(k,v){
                                //<span class="error">s</span>
                                var tag = document.createElement('span');
                                tag.className = 'error';
                                tag.innerText = v[0]['message'];
                                $('#model_register input[name="'+ k +'"]').after(tag);
                            })
                        }
                    }
                });
    
                $(ths).removeClass('not-allow').children(':eq(1)').addClass('hide');
                $(ths).children(':eq(0)').removeClass('hide');
            }
    
            /*
            显示或隐藏评论区
             */
            function ToggleCommentArea(nid){
                var $comment_area = $("#comment_area_" + nid);
                if($comment_area.hasClass('hide')){
                    $comment_area.removeClass('hide');
                    var $comment_list = $("#comment_list_" + nid);
                    $.ajax({
                        url: '/comment_tit/',
                        type: 'GET',
                        data: {nid: nid},
                        success: function(arg){
                            $comment_list.empty();
                            $comment_list.append(arg);
                            var $loading = $comment_area.find('.comment-box').children().first();
                            $loading.addClass('hide');
                            $loading.siblings().removeClass('hide');
                        }
                    })
                }else{
                    $comment_area.addClass('hide');
                }
            }
    
            /*
            隐藏评论区
             */
            function HideCommentArea(nid){
                $("#comment_area_" + nid).addClass('hide');
            }
    
            /*
            发布评论
             */
            function DoComment(nid){
                var content = $("#comment_content_"+nid).val();
                var reply_id = $("#reply_id_"+nid).attr('target');
                var device = navigator.appVersion;
    
                if($('#action_nav').attr('is-login') == 'true'){
                    $.ajax({
                        url: '/comment/',
                        type: 'POST',
                        data: {content: content, reply_id:reply_id, news_id: nid, device: device},
                        dataType: 'json',
                        success: function(arg){
                            // 获取评论信息,将内容添加到指定位置
                            console.log(arg);
                            if(arg.status){
                                $('#comment_content_' + arg.data.news_id).val('');
                                var a = '<ul><li class="items" style="padding:8px 0 0 16px;"><span class="folder" id="comment_folder_';
                                var b = arg.data.nid;
                                var c = '"><div class="comment-L comment-L-top"><a href="#" class="icons zhan-ico"></a><a href="/user/moyujian/submitted/1"><img src="/statics/images/1.jpg"></a></div><div class="comment-R comment-R-top" style="background-color: rgb(246, 246, 246);"><div class="pp"><a class="name" href="/user/moyujian/submitted/1">';
                                var d = arg.data.user_info__username;
                                var e = '</a><span class="p3">';
                                var f = arg.data.content;
                                var g= '</span><span class="into-time into-time-top">';
                                var h = arg.data.ctime;
                                var i = '</span></div><div class="comment-line-top"><div class="comment-state"><a class="ding" href="javascript:void(0);"><b>顶</b><span class="ding-num">[0]</span></a><a class="cai" href="javascript:void(0);"><b>踩</b><span class="cai-num">[0]</span></a><span class="line-huifu">|</span> <a class="see-a jubao" href="javascript:void(0);">举报</a> <span class="line-huifu">|</span> <a class="see-a huifu-a" href="javascript:void(0);" onclick="';
                                var j = "reply(" + arg.data.news_id + "," +arg.data.nid+",'"+arg.data.username+"')";
                                var k = '">回复</a></div></div></div></span></li></ul>';
                                var tag = a+b+c+d+e+f+g+h+i+j+k;
                                console.log(arg,tag);
                                var $commentCount = $('#comment_count_'+nid);
                                var cc = parseInt($commentCount.text());
                                $commentCount.text(cc + 1);
                                if(arg.data.reply_id){
                                    $comment_folder = $('#comment_folder_' + arg.data.reply_id);
                                    $comment_folder.after(tag);
                                }else{
                                    $('#comment_list_'+arg.data.news_id).append(tag);
                                }
    
    
                            }else{
                                alert('error');
                            }
                        }
                    })
                }else{
                    $('#accountDialog').removeClass('hide');
                    $('.shadow').removeClass('hide');
                }
            }
    
            /*
            点赞
             */
            function DoFavor(ths, nid) {
    
                if($('#action_nav').attr('is-login') == 'true'){
                    $.ajax({
                        url: '/favor/',
                        type: 'POST',
                        data: {news_id: nid},
                        dataType: 'json',
                        success: function(arg){
                            if(arg.status){
                                var $favorCount = $('#favor_count_'+nid);
                                var c = parseInt($favorCount.text());
                                if(arg.code == 2301){
                                    $favorCount.text(c + 1);
                                    $(ths).find('span').addClass('active');
                                    AddFavorAnimation(ths);
                                }else if(arg.code == 2302){
                                    $favorCount.text(c - 1);
                                    $(ths).find('span').removeClass('active');
                                    MinusFavorAnimation(ths);
                                }else{
    
                                }
    
                            }else{
    
                            }
                        }
                    })
                }else{
                    $('#accountDialog').removeClass('hide');
                    $('.shadow').removeClass('hide');
                }
            }
    
            /*
            点赞+1效果
             */
            function AddFavorAnimation(ths){
                var offsetTop = -10;
                var offsetLeft = 20;
                var fontSize = 24;
                var opacity = 1;
                var tag = document.createElement('i');
                tag.innerText = "+1";
                tag.style.position = 'absolute';
                tag.style.top = offsetTop + 'px';
                tag.style.left = offsetLeft + 'px';
                tag.style.fontSize = fontSize + "px";
                tag.style.color = "#5cb85c";
                $(ths).append(tag);
    
                var addInterval = setInterval(function(){
                        fontSize += 5;
                        offsetTop -= 15;
                        offsetLeft += 5;
                        opacity -= 0.1;
                        tag.style.top = offsetTop+ 'px';
                        tag.style.left = offsetLeft+ 'px';
                        tag.style.fontSize = fontSize + 'px';
                        tag.style.opacity = opacity;
                    if(opacity <= 0.5){
                        tag.remove();
                        clearInterval(addInterval);
                    }
                },40)
            }
    
            /*
            点赞-1效果
             */
            function MinusFavorAnimation(ths){
                var offsetTop = -10;
                var offsetLeft = 20;
                var fontSize = 24;
                var opacity = 1;
                var tag = document.createElement('i');
                tag.innerText = "-1";
                tag.style.position = 'absolute';
                tag.style.top = offsetTop + 'px';
                tag.style.left = offsetLeft + 'px';
                tag.style.fontSize = fontSize + "px";
                tag.style.color = "#787878";
                $(ths).append(tag);
    
                var addInterval = setInterval(function(){
                        fontSize += 5;
                        offsetTop -= 15;
                        offsetLeft += 5 ;
                        opacity -= 0.1;
                        tag.style.top = offsetTop+ 'px';
                        tag.style.left = offsetLeft+ 'px';
                        tag.style.fontSize = fontSize + 'px';
                        tag.style.opacity = opacity;
                    if(opacity <= 0.5){
                        tag.remove();
                        clearInterval(addInterval);
                    }
                },40)
            }
    
            /**
             * 回复评论
             * @param news_id
             * @param comment_id
             * @param username
             */
            function reply(news_id, comment_id, username){
                var $reply = $('#reply_id_' + news_id);
                $reply.attr('target', comment_id);
                $reply.text(username);
                $reply.parent().css('display','block');
            }
        </script>
    {% endblock %}
    index

       
            
    作业:
        1、评论
            - 单级评论
            - 多级评论
            
            ---- 必须交
            
            
        2、预习Tornado
            Torando + SQLAchemy
            pip3 install tornado
            http://www.tornadoweb.cn
            
            
            
    官网实例:
        瀑布流
        组合搜索    
       

  • 相关阅读:
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_EventHandler
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_ApplicationContextAware
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_setter
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_constructor
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_springQs
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_myspring
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Hibernate_Interceptor
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Hibernate_EventFrame
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Hibernate_SecondCache
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Hibernate_QueryCache
  • 原文地址:https://www.cnblogs.com/aaron-shen/p/5948445.html
Copyright © 2020-2023  润新知