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')
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>
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>
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
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 # 将图片内容返回给用户
<!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>
抽屉:
需求分析
数据库设计
- 用户表
- 短信、邮件临时表
- 新闻类型表:
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)
功能开发:
注册
登录
发布新闻
点赞
评论
#!/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/')
#!/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 = "\n".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)
<!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&pageId=44251&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>
{% 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;width: 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;width: 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 %}
作业:
1、评论
- 单级评论
- 多级评论
---- 必须交
2、预习Tornado
Torando + SQLAchemy
pip3 install tornado
http://www.tornadoweb.cn
官网实例:
瀑布流
组合搜索