from django.apps import AppConfig
class AppConfig(AppConfig):
name = 'app'
===============================
"""bbspro URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.conf.urls import url
from app import views
urlpatterns = [
url(r"^$",views.index),
url(r"^goods-(?P<gd_id>\d+)$",views.goodsdetail,name="goodsf"), # 未登录情况下商品详情
url(r"^(?P<school_id>\d+)/goods-(?P<gd_id>\d+)$",views.goodsdetail,name="goodst"), # 登录情况下商品详情
url(r"^(?P<school_id>\d+)/goods-(?P<gd_id>\d+)/(?P<parent_comment_id>\d+)$",views.goodsdetail,name="replycomment"), # 登录情况下的二级回复
url(r"^login/$",views.login,name="login"),
url(r"^register/$",views.register,name="register"),
url(r"^register/invite-(?P<invite_code>.+?)$",views.register,name="invite"), # 邀请链接
url(r"^personal/$",views.personal,name="personal"),
url(r"^campus-(?P<school_id>\d+)/fb",views.goodscreate,name="creategoods"), # 发布商品
url(r"^allcampus\?p=(?P<pg_id>\d+)$",views.campus,name="allcampus"), # 未登录情况下校园列表
url(r"^campus-(?P<school_id>\d+)\?p=(?P<pg_id>\d+)$",views.campus,name="campus"), # 登录情况下校园列表
url(r"^helpinfo/$",views.helpinfo,name="helpinfo"),
url(r"^logout/$",views.logout,name="logout"),
url(r"^boss/$",views.boss,name="boss"),
url(r"^overview/$",views.overview,name="overview"), # 概览页面
url(r"^myfb-(?P<pg_id>\d+)$",views.myfb,name="myfb"), # 我的发布
url(r"^mycollect-(?P<pg_id>\d+)$",views.mycollect,name="mycollect"), # 我的收藏
url(r"^accountdetail-(?P<pg_id>\d+)$",views.accountdetail,name="accountdetail"), # 账户明细
url(r"^getinvites-(?P<pg_id>\d+)$",views.getinvites,name="getinvites"), # 邀请列表
url(r"^getsigns-(?P<pg_id>\d+)$",views.getsigns,name="getsigns"), #签到列表
url(r"^myinfo/$",views.myinfo,name="myinfo"), #个人信息
url(r"^feedback/$",views.feedback,name="feedback"), # 反馈
url(r"^getVerifyCode/",views.getVerifyCode,name="getVerifyCode"), # 验证码
url(r"^update/(?P<gd_id>\d+)$",views.updategoods,name="updategoods"), # 更新商品
url(r"^report/(?P<gd_id>\d+)$",views.report,name="report"), # 举报
url(r"^collectgoods/",views.collectgoods,name="collectgoods"), # 收藏
url(r"^delgoods/",views.delgoods,name="delgoods"), # 删除
url(r"^updategd/$",views.updategd,name="updategd"), # 更新
url(r"^signin/$",views.signin,name="signin") #签到
]
====================================
import datetime
import io
import random
import re
from PIL import ImageDraw
from PIL import ImageFont, Image
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, \
InvalidPage
from django.db.models.query_utils import Q
from django.db.utils import IntegrityError
from django.http import HttpResponse
from django.shortcuts import render_to_response, redirect, render, \
get_object_or_404
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from app import models
from app.forms.forms import CommentForm
from app.models import Player, Boss, School, City, Province, Goods, Goodspic, \
Comments, Invites, Collects, Accountdetail, Signin, FeedBack, Report
from apscheduler.scheduler import Scheduler
#获取随机颜色
def get_random_color():
R=random.randrange(255)
G=random.randrange(255)
B=random.randrange(255)
return(R,G,B)
#验证码视图
def getVerifyCode(request):
bg_color=(245,245,245) # 定义画布背景
img_size=(90,34) # 定义画布大小
image=Image.new("RGB",img_size,bg_color) # 定义画布
draw=ImageDraw.Draw(image,"RGB") # 定义画笔
# 创建字体(字体的路径,服务器路径)
font_path = 'D:/eclipse/works/bbspro/src/static/fonts/AdobeArabic-2.ttf'
# 实例化字体,设置大小是30
font = ImageFont.truetype(font_path, 30)
# 准备画布上的字符集
source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789"
# 保存每次随机出来的字符
code_str = ""
for i in range(4):
# 获取数字随机颜色
text_color = get_random_color()
# 获取随机数字 len
tmp_num = random.randrange(len(source))
# 获取随机字符 画布上的字符集
random_str = source[tmp_num]
# 将每次随机的字符保存(遍历) 随机四次
code_str += random_str
# 将字符画到画布上
draw.text((5 + 20*i, -2), random_str, text_color, font)
#噪点干扰线
width=90
height=34
for i in range(10):
x1=random.randint(0,width)
x2=random.randint(0,width)
y1=random.randint(0,height)
y2=random.randint(0,height)
draw.line((x1,x2,y1,y2),fill=get_random_color())
for i in range(10):
draw.point([random.randint(0,width),random.randint(0,height)], fill=get_random_color())
x=random.randint(0,width)
y=random.randint(0,height)
draw.arc((x,y,x+4,y+4),0,90,fill=get_random_color())
# 记录给哪个请求发了什么验证码
request.session['code'] = code_str
# 获得一个缓存区
buf = io.BytesIO()
# 将图片保存到缓存区
image.save(buf, 'png')
# 将缓存区的内容返回给前端 .getvalue 是把缓存区的所有数据读取
return HttpResponse(buf.getvalue(), 'image/png')
#登录页面
def login(request):
uname=request.session.get("username","")
scode=request.session.get("code","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
return redirect("/personal/")
elif ubossname:
return redirect("/boss/")
else:
err_msg=code_msg=""
if request.method=="POST":
username=request.POST.get("username")
password=request.POST.get("password")
safecode=request.POST.get("safecode")
if str(safecode).lower()!=str(scode).lower():
code_msg="验证码错误"
else:
playinfo=Player.objects.filter(player_username=username,
player_password=password)
bossinfo=Boss.objects.filter(bossname=username,
bosspsw=password)
if playinfo:
pinfo=Player.objects.get(player_username=username)
sinfo=School.objects.get(id=pinfo.player_school_id)
models.Player.objects.filter(player_username=username).update(last_time=timezone.now())
request.session["username"]=username
request.session["schoolid"]=sinfo.school_id
return redirect("/personal/")
elif bossinfo:
request.session["username"]=username
return redirect("/boss/")
else:
err_msg="账号或密码错误,请重新登录"
return render(request,"login.html",{"err_msg":err_msg,
"code_msg":code_msg
})
#注册页面
def register(request,invite_code=None):
codenum=0
uname=request.session.get("username","")
scode=request.session.get("code","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if invite_code:
codenum=1 # 邀请注册
codeexist=get_object_or_404(Player,player_username=invite_code)
if codeexist:
if uplayname:
return redirect("/personal/")
elif ubossname:
return redirect("/boss/")
else:
errname_msg=errpsw_msg=errcopypsw_msg=errphone_msg=erremail_msg=errschool_msg=errcode_msg=""
if request.method=="POST":
username=request.POST.get("username")
password=request.POST.get("password")
copypsw=request.POST.get("copypassword")
phone=request.POST.get("phone")
email=request.POST.get("email")
schoolname=request.POST.get("school")
safecode=request.POST.get("safecode")
try:
schoolinfo=School.objects.get(school_name=schoolname)
except:
errschool_msg="该校不存在,请联系管理员添加"
existname=Player.objects.filter(player_username=username)
exitphone=Player.objects.filter(player_tel=phone)
exitemail=Player.objects.filter(player_mail=email)
# 校验
if not username:
errname_msg="账号不能为空"
elif not password:
errpsw_msg="密码不能为空"
elif not copypsw:
errcopypsw_msg="确认密码不能为空"
elif not phone:
errphone_msg="手机号不能为空"
elif not email:
erremail_msg="邮箱不能为空"
elif not re.match(r"^[a-zA-Z][a-zA-Z0-9]{5,19}$",username):
errname_msg="请输入6-20个字符的账号"
elif not re.match(r"^[a-zA-Z0-9]{6,20}$",password):
errpsw_msg="请输入6-20个字符的密码"
elif password != copypsw:
errcopypsw_msg="两次输入的密码不一致"
elif not re.match(r"^1[0-9]{10}$",phone):
errphone_msg="请输入1开的11位纯数字的手机号码"
elif not re.match(r"^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$",email):
erremail_msg="请输入正确的邮箱"
elif existname:
errname_msg="该账号已注册"
elif exitphone:
errphone_msg="该手机已注册"
elif exitemail:
erremail_msg="该邮箱已注册"
elif str(safecode).lower()!=str(scode).lower():
errcode_msg="验证码错误"
else:
# 注册信息
Player.objects.get_or_create(player_username=username,
player_password=password,
player_tel=phone,
player_mail=email,
player_school_id=schoolinfo.id
)
# 邀请信息
inviter=Player.objects.get(player_username=invite_code)
beinviter=Player.objects.get(player_username=username)
Invites.objects.create(invite_name_id=inviter.id,
beinvite_name_id=beinviter.id
)
#更新邀请数
inviter.invitenum+=1
inviter.save(update_fields=["invitenum"])
return redirect("/login/")
else:
codenum=2 # 非邀请注册
if uplayname:
return redirect("/personal/")
elif ubossname:
return redirect("/boss/")
else:
errname_msg=errpsw_msg=errcopypsw_msg=errphone_msg=erremail_msg=errschool_msg=errcode_msg=""
if request.method=="POST":
username=request.POST.get("username")
password=request.POST.get("password")
copypsw=request.POST.get("copypassword")
phone=request.POST.get("phone")
email=request.POST.get("email")
schoolname=request.POST.get("school")
safecode=request.POST.get("safecode")
try:
schoolinfo=School.objects.get(school_name=schoolname)
except:
errschool_msg="该校不存在,请联系管理员添加"
existname=Player.objects.filter(player_username=username)
exitphone=Player.objects.filter(player_tel=phone)
exitemail=Player.objects.filter(player_mail=email)
# 校验
if not username:
errname_msg="账号不能为空"
elif not password:
errpsw_msg="密码不能为空"
elif not copypsw:
errcopypsw_msg="确认密码不能为空"
elif not phone:
errphone_msg="手机号不能为空"
elif not email:
erremail_msg="邮箱不能为空"
elif not re.match(r"^[a-zA-Z][a-zA-Z0-9]{5,19}$",username):
errname_msg="请输入6-20个字符的账号"
elif not re.match(r"^[a-zA-Z0-9]{6,20}$",password):
errpsw_msg="请输入6-20个字符的密码"
elif password != copypsw:
errcopypsw_msg="两次输入的密码不一致"
elif not re.match(r"^1[0-9]{10}$",phone):
errphone_msg="请输入1开的11位纯数字的手机号码"
elif not re.match(r"^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$",email):
erremail_msg="请输入正确的邮箱"
elif existname:
errname_msg="该账号已注册"
elif exitphone:
errphone_msg="该手机已注册"
elif exitemail:
erremail_msg="该邮箱已注册"
elif str(safecode).lower()!=str(scode).lower():
errcode_msg="验证码错误"
else:
Player.objects.get_or_create(player_username=username,
player_password=password,
player_tel=phone,
player_mail=email,
player_school_id=schoolinfo.id
)
return redirect("/login/")
return render(request,"register.html",{"errname_msg":errname_msg,
"errpsw_msg":errpsw_msg,
"errcopypsw_msg":errcopypsw_msg,
"errphone_msg":errphone_msg,
"erremail_msg":erremail_msg,
"errschool_msg":errschool_msg,
"codenum":codenum,
"invite_code":invite_code,
"errcode_msg":errcode_msg
})
#首页
def index(request):
uname=request.session.get("username","")
school_id=request.session.get("schoolid","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
return render(request,"index.html",{"uname":uname,
"school_id":school_id,
})
elif ubossname:
return redirect("/boss/")
else:
return render_to_response("index.html")
# 个人中心页面
def personal(request):
uname=request.session.get("username","")
school_id=request.session.get("schoolid","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
return render(request,"personal.html",{"uname":uname,
"school_id":school_id,
"playinfo":playinfo
})
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
# 个人中心 概览
def overview(request):
baseurl=request.get_host()
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
phonehidden=str(playinfo.player_tel)[0:3]+"****"+str(playinfo.player_tel)[-4:-1]
scholinfo=School.objects.get(id=playinfo.player_school_id)
inviteurl="http://"+baseurl+"/register/invite-"+uname
# 获取日期
signinfo=Signin.objects.filter(sign_player_id=playinfo.id).order_by("-signtime")
signstatus=0
sign_msg=""
if signinfo:
recentsigndate=signinfo.first().signtime.strftime("%Y-%m-%d")
todaydate=datetime.datetime.now().strftime("%Y-%m-%d")
if recentsigndate==todaydate:
signstatus=1
sign_msg="您今天签到成功,+10豆点!"
else:
signstatus=-1
sign_msg="您今天还没签到哦!"
else:
signstatus=-1
sign_msg="您今天还没签到哦!"
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
return render(request,"overview.html",{"playinfo":playinfo,
"phonehidden":phonehidden,
"scholinfo":scholinfo,
"inviteurl":inviteurl,
"signstatus":signstatus,
"sign_msg":sign_msg
})
#签到 ajax
def signin(request):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
if request.method=="POST":
todaydate=datetime.datetime.now().strftime("%Y-%m-%d")
signtime=datetime.datetime.now()
signnum=request.POST.get("signnum")
try:
Signin.objects.get_or_create(signtime=signtime,
signstatus=signnum,
sign_jf=10,
sign_player_id=playinfo.id,
sign_date=todaydate)
return HttpResponse('{"result":"success"}',content_type="application.json")
except:
return HttpResponse('{"result":"fail"}',content_type="application.json")
# 个人中心 我的发布
def myfb(request,pg_id=None):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
goods_list=Goods.objects.all().filter(Q(goods_author_id=playinfo.id)&Q(goods_del=1)).order_by("-goods_updatetime")
# 分页
paginator=Paginator(goods_list,10)
pg_id=int(pg_id)
try:
gdslist=paginator.page(pg_id)
except PageNotAnInteger:
gdslist=paginator.page(1)
except InvalidPage:
gdslist=paginator.page(1)
except EmptyPage:
gdslist=paginator.page(paginator.num_pages)
if paginator.num_pages>5:
if pg_id-3<1:
pgrange=range(1,6)
elif pg_id+3>paginator.num_pages:
pgrange=range(paginator.num_pages-4,paginator.num_pages+1)
else:
pgrange=range(pg_id-2,pg_id+3)
else:
pgrange=paginator.page_range
return render(request,"myfb.html",{"pg_id":pg_id,
"goods_list":goods_list,
"gdslist":gdslist,
"paginator":paginator,
"pgrange":pgrange
})
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
# 个人中心 我的收藏
def mycollect(request,pg_id=None):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
collects_list=Collects.objects.all().filter(collects_player_id=playinfo.id).order_by("-collects_time")
# 分页
paginator=Paginator(collects_list,10)
pg_id=int(pg_id)
try:
collectlist=paginator.page(pg_id)
except PageNotAnInteger:
collectlist=paginator.page(1)
except InvalidPage:
collectlist=paginator.page(1)
except EmptyPage:
collectlist=paginator.page(paginator.num_pages)
if paginator.num_pages>5:
if pg_id-3<1:
pgrange=range(1,6)
elif pg_id+3>paginator.num_pages:
pgrange=range(paginator.num_pages-4,paginator.num_pages+1)
else:
pgrange=range(pg_id-2,pg_id+3)
else:
pgrange=paginator.page_range
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
return render(request,"mycollect.html",{"pg_id":pg_id,
"collects_list":collects_list,
"collectlist":collectlist,
"paginator":paginator,
"pgrange":pgrange
})
# 个人中心 账户明细
def accountdetail(request,pg_id):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
account_list=Accountdetail.objects.all().filter(adplayer_id=playinfo.id).order_by("-detailtime")
#分页
paginator=Paginator(account_list,10)
pg_id=int(pg_id)
try:
accountlist=paginator.page(pg_id)
except PageNotAnInteger:
accountlist=paginator.page(1)
except InvalidPage:
accountlist=paginator.page(1)
except EmptyPage:
accountlist=paginator.page(paginator.num_pages)
if paginator.num_pages>5:
if pg_id-3<1:
pgrange=range(1,6)
elif pg_id+3>paginator.num_pages:
pgrange=range(paginator.num_pages-4,paginator.num_pages+1)
else:
pgrange=range(pg_id-2,pg_id+3)
else:
pgrange=paginator.page_range
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
return render(request,"accountdetail.html",{"pg_id":pg_id,
"paginator":paginator,
"account_list":account_list,
"accountlist":accountlist,
"pgrange":pgrange
})
# 个人中心 我的邀请列表
def getinvites(request,pg_id=None):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
invite_list=Invites.objects.all().filter(invite_name_id=playinfo.id).order_by("-invite_time")
# 分页
paginator=Paginator(invite_list,10)
pg_id=int(pg_id)
try:
invitelist=paginator.page(pg_id)
except PageNotAnInteger:
invitelist=paginator.page(1)
except InvalidPage:
invitelist=paginator.page(1)
except EmptyPage:
invitelist=paginator.page(paginator.num_pages)
if paginator.num_pages>5:
if pg_id-3<1:
pgrange=range(1,6)
elif pg_id+3>paginator.num_pages:
pgrange=range(paginator.num_pages-4,paginator.num_pages+1)
else:
pgrange=range(pg_id-2,pg_id+3)
else:
pgrange=paginator.page_range
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
return render(request,"invitelist.html",{"pg_id":pg_id,
"invitelist":invitelist,
"pgrange":pgrange,
"paginator":paginator
})
# 个人中心 签到列表
def getsigns(request,pg_id):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
uplayinfo=Player.objects.get(player_username=uname)
sign_list=Signin.objects.all().filter(sign_player_id=uplayinfo.id).order_by("-signtime")
# 分页
paginator=Paginator(sign_list,10)
pg_id=int(pg_id)
try:
signlist=paginator.page(pg_id)
except PageNotAnInteger:
signlist=paginator.page(1)
except InvalidPage:
signlist=paginator.page(1)
except EmptyPage:
signlist=paginator.page(paginator.num_pages)
if paginator.num_pages>5:
if pg_id-3<1:
pgrange=range(1,6)
elif pg_id+3>paginator.num_pages:
pgrange=range(paginator.num_pages-4,paginator.num_pages+1)
else:
pgrange=range(pg_id-2,pg_id+3)
else:
pgrange=paginator.page_range
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
return render(request,"signlist.html",{"pg_id":pg_id,
"paginator":paginator,
"signlist":signlist,
"pgrange":pgrange
})
#个人中心 我的信息
def myinfo(request):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
playinfo=Player.objects.get(player_username=uname)
schoolinfo=School.objects.get(id=playinfo.player_school_id)
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
return render(request,"myinfo.html",{"playinfo":playinfo,
"schoolinfo":schoolinfo
})
# 个人中心 反馈
def feedback(request):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
feedback_msg=""
playinfo=Player.objects.get(player_username=uname)
if request.method=="POST":
feedbackinfo=request.POST.get("feedback")
feedbacktime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
if feedbackinfo=="":
feedback_msg="提交内容不能为空!"
else:
try:
FeedBack.objects.get_or_create(feedbackcontent=feedbackinfo,
feedbackauth_id=playinfo.id,
limittime=feedbacktime
)
feedback_msg="提交成功!"
except IntegrityError:
feedback_msg="请勿重复提交!"
return render(request,"feedback.html",{"feedback_msg":feedback_msg
})
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
# 校园专区
def campus(request,school_id=None,pg_id=1):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
s_info=get_object_or_404(School,school_id=school_id)
city_info=City.objects.get(id=s_info.school_city_id)
province_info=Province.objects.get(id=city_info.city_pro_id)
schoolname=s_info.school_name
schooladress="地址:"+province_info.province_name+city_info.city_name+s_info.school_address
nowtime=datetime.datetime.now()
# 获取所有学生信息
stinfo=Player.objects.filter()
# 统计该校学生信息
stucount=Player.objects.filter(player_school_id=s_info.id)
open_msg="该校注册未满2人,暂未开通!"
# 对该校的商品进行排序
goods_list=Goods.objects.all().filter(Q(goods_school_id=s_info.id)&Q(goods_del=1)).order_by("-goods_updatetime")
gds_msg="还未发布闲置物品哦~"
# 分页
paginator=Paginator(goods_list,10)
pg_id=int(pg_id)
try:
# 获取当前页内容
gdslist=paginator.page(pg_id)
except PageNotAnInteger:
gdslist=paginator.page(1)
except InvalidPage:
gdslist=paginator.page(1)
except EmptyPage:
gdslist=paginator.page(paginator.num_pages)
if paginator.num_pages>5:
if pg_id-3<1:
pgrange=range(1,6)
elif pg_id+3>paginator.num_pages:
pgrange=range(paginator.num_pages-4,paginator.num_pages+1)
else:
pgrange=range(pg_id-2,pg_id+3)
else:
pgrange=paginator.page_range
return render(request,"campus.html",{"uname":uname,
"schoolname":schoolname,
"schooladress":schooladress,
"school_id":school_id,
"stucount":stucount,
"open_msg":open_msg,
"goods_list":goods_list,
"gds_msg":gds_msg,
"paginator":paginator,
"pg_id":pg_id,
"gdslist":gdslist,
"pgrange":pgrange,
"stinfo":stinfo,
"nowtime":nowtime
})
elif ubossname:
return redirect("/boss/")
else:
# 获取所有学生信息
stinfo=Player.objects.filter()
goods_list=Goods.objects.all().filter(goods_del=1).order_by("-goods_updatetime")
gds_msg="还未发布闲置物品哦~"
paginator=Paginator(goods_list,10)
pd_id=int(pg_id)
try:
# 获取当前页面内容
gdslist=paginator.page(pg_id)
except PageNotAnInteger:
gdslist=paginator.page(1)
except InvalidPage:
gdslist=paginator.page(1)
except EmptyPage:
gdslist=paginator.page(paginator.num_pages)
if paginator.num_pages>5:
if pg_id-3<1:
pgrange=range(1,6)
elif pg_id+3>paginator.num_pages:
pgrange=range(paginator.num_pages-4,paginator.num_pages+1)
else:
paginator=range(pg_id-2,pg_id+3)
else:
pgrange=paginator.page_range
return render(request,"campus.html",{"uname":uname,
"goods_list":goods_list,
"gds_msg":gds_msg,
"paginator":paginator,
"pg_id":pg_id,
"gdslist":gdslist,
"pgrange":pgrange,
"pd_id":pd_id,
"stinfo":stinfo
})
#详情页面
@csrf_exempt
def goodsdetail(request,school_id=None,gd_id=None,parent_comment_id=None):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
gds=get_object_or_404(Goods,id=gd_id)
playinfo=Player.objects.get(id=gds.goods_author_id)
schoolinfo=School.objects.get(id=playinfo.player_school_id)
picinfo=Goodspic.objects.filter(pic_goods_id=gd_id)
gds.goods_views+=1
gds.save(update_fields=["goods_views"])
comments=Comments.objects._mptt_filter(goods_id=gd_id)
if uplayname:
pinfo=Player.objects.get(player_username=uname)
s_info=get_object_or_404(School,school_id=school_id)
city_info=City.objects.get(id=s_info.school_city_id)
province_info=Province.objects.get(id=city_info.city_pro_id)
schoolname=s_info.school_name
schooladress="地址:"+province_info.province_name+city_info.city_name+s_info.school_address
existcollect=Collects.objects.filter(Q(collects_player_id=pinfo.id)&Q(collects_goods_id=gd_id))
if request.method=="POST":
comment_form=CommentForm(request.POST)
limittimes=datetime.datetime.now().strftime("%Y-%m-%d %H:%M") # 限制时间到分
if comment_form.is_valid():
new_comment=comment_form.save(commit=False)
new_comment.goods_id=gd_id
new_comment.commentuser_id=pinfo.id
new_comment.commentusername=uname
# 二级评论
if parent_comment_id:
parent_comment=Comments.objects.get(id=parent_comment_id)
new_comment.parent_id=parent_comment.get_root().id
new_comment.reply_to_id=parent_comment.commentuser_id
new_comment.replyname=parent_comment.commentusername
new_comment.commentusername=uname
new_comment.save()
redirecturl="/"+str(school_id)+"/goods-"+str(gd_id)
return redirect(redirecturl)
new_comment.save()
redirecturl="/"+str(school_id)+"/goods-"+str(gd_id)
return redirect(redirecturl)
return render(request,"goodsdetail.html",{"uname":uname,
"school_id":school_id,
"schoolname":schoolname,
"schooladress":schooladress,
"gds":gds,
"gd_id":gd_id,
"uplayname":uplayname,
"playinfo":playinfo,
"schoolinfo":schoolinfo,
"picinfo":picinfo,
"comments":comments,
"parent_comment_id":parent_comment_id,
"existcollect":existcollect
})
elif ubossname:
return redirect("/boss/")
else:
return render(request,"goodsdetail.html",{"uname":uname,
"gds":gds,
"gd_id":gd_id,
"playinfo":playinfo,
"schoolinfo":schoolinfo,
"picinfo":picinfo,
"comments":comments
})
# 收藏功能 ajax
@csrf_exempt
def collectgoods(request):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
if request.method=="POST":
if uplayname:
uinfo=Player.objects.get(player_username=uname)
gd_id=request.POST.get("gd_id")
existcollect=Collects.objects.filter(Q(collects_goods_id=gd_id)&Q(collects_player_id=uinfo.id))
if existcollect:
# 已经存在收藏记录 执行的是取消收藏功能
existcollect.delete()
Goods.objects.get(id=gd_id).changecollects(num=-1)
return HttpResponse('{"col_status":"success","col_msg":"添加收藏"}',content_type='application/json')
else:
coltime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
Goods.objects.get(id=gd_id).changecollects(num=1)
Collects.objects.get_or_create(collects_player_id=uinfo.id,collects_goods_id=gd_id,collects_time=coltime)
return HttpResponse('{"col_status":"success","col_msg":"取消收藏"}',content_type='application/json')
except IntegrityError:
return HttpResponse('{"col_status":"fail","col_msg":"请勿重复收藏"}',content_type='application/json')
else:
return HttpResponse('{"col_status":"fail","col_msg":"用户未登录"}',content_type='application/json')
# 删除功能ajax
def delgoods(request):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
if uplayname:
if request.method=="POST":
gdid=request.POST.get("gd_id")
try:
goodinfo=Goods.objects.get(id=gdid)
goodinfo.goods_del=-1
goodinfo.save()
return HttpResponse('{"result":"success"}',content_type='application.json')
except:
return HttpResponse('{"result":"fail"}',content_type='application.json')
# 更新功能 ajax
def updategd(request):
uname=request.session.get("username","")
uplayname=Player.objects.get(player_username=uname)
if uplayname:
if request.method=="POST":
gdid=request.POST.get("gd_id")
try:
nowti=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
goodsinfo=Goods.objects.get(id=gdid)
goodsinfo.goods_updatetime=nowti
goodsinfo.save()
return HttpResponse('{"result":"success"}',content_type="application.json")
except:
return HttpResponse('{"result":"fail"}',content_type="application.json")
#发布页面
def goodscreate(request,school_id):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
# 获取学校相关信息
s_info=get_object_or_404(School,school_id=school_id)
city_info=City.objects.get(id=s_info.school_city_id)
province_info=Province.objects.get(id=city_info.city_pro_id)
schoolname=s_info.school_name
schooladress="地址:"+province_info.province_name+city_info.city_name+s_info.school_address
playinfo=Player.objects.get(player_username=uname) # 取登录玩家信息
playschool=School.objects.get(id=playinfo.player_school_id) # 取登录玩家所属学校信息
title_msg=img_msg=newprice_msg=oldprice_msg=newpercent_msg=trademodel_msg=detailinput_msg=fail_msg=""
if request.method=="POST":
title=request.POST.get("crtitle")
newprice=request.POST.get("newprice")
oldprice=request.POST.get("oldprice")
newpercent=request.POST.get("newpercent")
trademodel=request.POST.get("trademodel")
detailinput=request.POST.get("detailinput")
image1=request.FILES.get("image1",None)
image2=request.FILES.get("image2",None)
image3=request.FILES.get("image3",None)
image4=request.FILES.get("image4",None)
image5=request.FILES.get("image5",None)
image6=request.FILES.get("image6",None)
if not title:
title_msg="标题不能为空"
elif (not image1) and (not image2) and (not image3) and (not image4) and (not image5) and (not image6):
img_msg="请上传最少一张图片"
elif not newprice:
newprice_msg="现价不能为空"
elif not oldprice:
oldprice_msg="原价不能为空"
elif not newpercent:
newpercent_msg="成新不能为空"
elif not trademodel:
trademodel_msg="交易方式不能为空"
elif not detailinput:
detailinput_msg="详情不能为空"
else:
nowtime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
limitminute=datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
try:
Goods.objects.get_or_create(goods_title=title,
goods_createtime=nowtime,
goods_firstphoto=image1,
goods_price=newprice,
goods_orgprice=oldprice,
goods_newold=newpercent,
goods_trademethod=trademodel,
goods_detail=detailinput,
goods_author_id=playinfo.id,
goods_school_id=s_info.id,
goods_updatetime=nowtime,
limitminute=limitminute
)
lastinfo=Goods.objects.filter(goods_author_id=playinfo.id).last() # 取出该玩家最新创建的一条数据
lastinfo.goods_firstphoto="/media/"+str(lastinfo.goods_firstphoto)
lastinfo.save(update_fields=["goods_firstphoto"])
# 存入图片
imgall=[]
imgall.append(image2)
imgall.append(image3)
imgall.append(image4)
imgall.append(image5)
imgall.append(image6)
for imgone in imgall:
if imgone:
Goodspic.objects.get_or_create(goods_pic=imgone,
pic_goods_id=lastinfo.id
)
gdpicinfo=Goodspic.objects.filter(pic_goods_id=lastinfo.id).last()
gdpicinfo.goods_pic="/media/"+str(gdpicinfo.goods_pic)
gdpicinfo.save(update_fields=["goods_pic"])
redirecturl="/"+str(school_id)+"/goods-"+str(lastinfo.id)
return redirect(redirecturl) # 跳转到对应创建的详情页面
except:
fail_msg="请勿重复提交!"
return render(request,"goodscreate.html",{"uname":uname,
"school_id":school_id,
"schoolname":schoolname,
"schooladress":schooladress,
"uplayname":uplayname,
"playinfo":playinfo,
"playschool":playschool,
"title_msg":title_msg,
"img_msg":img_msg,
"newprice_msg":newprice_msg,
"oldprice_msg":oldprice_msg,
"newpercent_msg":newpercent_msg,
"trademodel_msg":trademodel_msg,
"detailinput_msg":detailinput_msg,
"fail_msg":fail_msg
})
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
# 帮助中心
def helpinfo(request):
uname=request.session.get("username","")
school_id=request.session.get("schoolid","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
return render(request,"helpinfo.html",{"uname":uname,
"school_id":school_id
})
elif ubossname:
return redirect("/boss/")
else:
return render_to_response("helpinfo.html")
#退出
def logout(request):
request.session.flush()
return redirect("/login/")
# 管理员后台
def boss(requset):
uname=requset.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
return redirect("/personal/")
elif ubossname:
return render(requset,"boss.html",{"uname":uname})
else:
redirect("/login/")
# 修改商品
def updategoods(request,gd_id):
uname=request.session.get("username","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
goodsinfo=get_object_or_404(Goods,id=gd_id)
s_info=get_object_or_404(School,id=goodsinfo.goods_school_id)
city_info=City.objects.get(id=s_info.school_city_id)
province_info=Province.objects.get(id=city_info.city_pro_id)
schoolname=s_info.school_name
schooladress="地址:"+province_info.province_name+city_info.city_name+s_info.school_address
u_info=Player.objects.get(player_username=uname)
playerschool=School.objects.get(id=u_info.player_school_id)
allpic=Goodspic.objects.filter(pic_goods_id=gd_id)
piclen=len(allpic)
initcount=piclen+1
srcall=[]
for num in range(piclen):
srcall.append(allpic[num].goods_pic)
title_msg=img_msg=newprice_msg=oldprice_msg=newpercent_msg=trademodel_msg=detailinput_msg=""
if request.method=="POST":
title=request.POST.get("crtitle")
newprice=request.POST.get("newprice")
oldprice=request.POST.get("oldprice")
newpercent=request.POST.get("newpercent")
trademodel=request.POST.get("trademodel")
detailinput=request.POST.get("detailinput")
image1=request.FILES.get("image1",None)
image2=request.FILES.get("image2",None)
image3=request.FILES.get("image3",None)
image4=request.FILES.get("image4",None)
image5=request.FILES.get("image5",None)
image6=request.FILES.get("image6",None)
print(image1)
print(image2)
print(image3)
print(image4)
print(image5)
print(image6)
if not title:
title_msg="标题不能为空"
elif (not image1) and (not image2) and (not image3) and (not image4) and (not image5) and (not image6):
img_msg="请上传最少一张图片"
elif not newprice:
newprice_msg="现价不能为空"
elif not oldprice:
oldprice_msg="原价不能为空"
elif not newpercent:
newpercent_msg="成新不能为空"
elif not trademodel:
trademodel_msg="交易方式不能为空"
elif not detailinput:
detailinput_msg="详情不能为空"
else:
nowtime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
g=Goods.objects.get(id=gd_id)
g.goods_title=title
g.goods_firstphoto=image1
g.goods_price=newprice
g.goods_orgprice=oldprice
g.goods_newold=newpercent
g.goods_trademethod=trademodel
g.goods_detail=detailinput
g.goods_updatetime=nowtime
g.save()
# 图片路径转换
lastinfo=Goods.objects.get(id=gd_id)
lastinfo.goods_firstphoto="/media/"+str(lastinfo.goods_firstphoto)
lastinfo.save(update_fields=["goods_firstphoto"])
# 删除原有的图片
picdel=Goodspic.objects.filter(pic_goods_id=gd_id)
picdel.delete()
# 存入图片
imgall=[]
imgall.append(image2)
imgall.append(image3)
imgall.append(image4)
imgall.append(image5)
imgall.append(image6)
for imgone in imgall:
if imgone:
Goodspic.objects.get_or_create(goods_pic=imgone,
pic_goods_id=gd_id
)
gdpicinfo=Goodspic.objects.filter(pic_goods_id=gd_id).last()
gdpicinfo.goods_pic="/media/"+str(gdpicinfo.goods_pic)
gdpicinfo.save(update_fields=["goods_pic"])
redirecturl="/"+str(s_info.school_id)+"/goods-"+str(gd_id)
return redirect(redirecturl)
return render(request,"goodsupdate.html",{"gd_id":gd_id,
"uname":uname,
"schoolname":schoolname,
"schooladress":schooladress,
"school_id":s_info.school_id,
"goodsinfo":goodsinfo,
"goodsmethod":goodsinfo.goods_trademethod,
"u_info":u_info,
"playerschool":playerschool,
"allpic":allpic,
"piclen":piclen,
"srcall":srcall,
"initcount":initcount,
"title_msg":title_msg,
"img_msg":img_msg,
"newprice_msg":newprice_msg,
"oldprice_msg":oldprice_msg,
"newpercent_msg":newpercent_msg,
"trademodel_msg":trademodel_msg,
"detailinput_msg":detailinput_msg
})
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
# 举报
def report(request,gd_id):
uname=request.session.get("username","")
scode=request.session.get("code","")
uplayname=Player.objects.filter(player_username=uname)
ubossname=Boss.objects.filter(bossname=uname)
if uplayname:
gdinfo=Goods.objects.get(id=gd_id)
schoolinfo=School.objects.get(id=gdinfo.goods_school_id)
playinfo=Player.objects.get(player_username=uname)
report_msg=code_msg=""
if request.method=="POST":
safecode=request.POST.get("safecode")
reportinfo=request.POST.get("report")
reporttime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if str(safecode).lower()!=str(scode).lower():
code_msg="验证码错误!"
elif reportinfo=="":
report_msg="投诉内容不能为空!"
else:
try:
Report.objects.get_or_create(reportcontent=reportinfo,
reportauth_id=playinfo.id,
bereportgoods_id=gd_id,
reporttime=reporttime
)
report_msg="投诉成功!"
redirecturl="/"+str(schoolinfo.school_id)+"/goods-"+str(gd_id)
return redirect(redirecturl)
except IntegrityError:
report_msg="请勿重复投诉!"
return render(request,"report.html",{"gd_id":gd_id,
"gdinfo":gdinfo,
"uname":uname,
"schoolinfo":schoolinfo,
"report_msg":report_msg,
"code_msg":code_msg
})
elif ubossname:
return redirect("/boss/")
else:
return redirect("/login/")
################################################################
# 定时任务
def checksign():
todaytime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
playinfo=Player.objects.all()
for playone in playinfo:
signinfo=Signin.objects.filter(sign_player_id=playone.id).order_by("-signtime").first() #根据玩家id取签到记录倒序第一个
if not signinfo:
Signin.objects.get_or_create(
signtime=todaytime,
signstatus=-1,
sign_jf=0,
sign_player_id=playone.id,
sign_date=todaytime
)
else:
recentsigndate=signinfo.signtime.strftime("%Y-%m-%d")
todaydate=datetime.datetime.now().strftime("%Y-%m-%d")
if recentsigndate==todaydate:
pass
else:
Signin.objects.get_or_create(
signtime=todaytime,
signstatus=-1,
sign_jf=0,
sign_player_id=playone.id,
sign_date=todaydate
)
# 定时器
sched=Scheduler()
sched.add_cron_job(checksign,day_of_week="0-6",hour="23",minute="59",second="59")
sched.start()