编写一个日程互助APP。
需求:
1.登录、注册
2.发布日程信息:检测是否登录,是则发布 ”名称 + 时间“ ;否则提示登录
3.物品查询:检测是否登录,是则可获得联系信息;否则提示登录
# 4.查看物品:检测是否登录,是则可查看物品及评论;否则仅可查看物品。时间倒序。
技术要求:
1. 创建user表,日程表
2.注册后跳转至登录
3.登录后跳转至清单页面,含有信息输入框及发布按钮
# 4.不考虑嵌套评论
5.middleware用于判断登录状态
页面要求:
Obj1:abc
# requery1:dfg
# requery2:jkl
Obj2:poi
# requery1:dfg
# requery2:jkl
结果:
注册:
登录:
信息页:
记录个人日程后再重定向信息页,可见增加了自己新提交的记录:
查询结果页,获得“日期_登记者昵称”:
点击感兴趣的日程,获得联系信息:
代码:
1. 创建超级用户。创建数据库。注册、链接app。
2. setting
DEBUG = False
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [xxx
'schBase_app.apps.SchbaseAppConfig',
]
MIDDLEWARE = [xxx
"my_middleware.my_middleware.LoginMiddleware",
]
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "sch", # mysql中create的数据库
'HOST': 'localhost', # 127.0.1.1, 本项目sql装在本机
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'upwd'
}
}
SESSION_COOKIE_AGE = 3600 * 24
PAGE_SIZE = 10
3. Proj / my_middleware.pck /my_middleware.py
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
from schBase_app.models import Doctor
class LoginMiddleware(MiddlewareMixin):
def process_request(self, request):
tar_path = [
'/sch/indoor/',
'/sch/search/',
'/sch/contact/',
'/sch/delrec/',
'/sch/delses/',
]
print("m1")
if request.path in tar_path:
print("m2")
try:
# token = request.GET.get('token')
token = request.session['token']
print("m" + token)
user = Doctor.objects.get(token=token)
print(user.nickname + user.tORv)
# if user.exists():
if not user:
print("m3")
return HttpResponse("Token expired.")
except:
return redirect(reverse("sch:login"))
4. app / models.py 迁移,添加测试数据。
from django.db import models
class Doctor(models.Model):
nickname = models.CharField(max_length=32, unique=True, verbose_name="code")
pwd = models.CharField(max_length=32, verbose_name="password")
tORv = models.CharField(max_length=32, verbose_name="telORvxid")
token = models.CharField(max_length=32, verbose_name="token", null=True)
class Meta:
verbose_name = "Doctor"
verbose_name_plural = verbose_name + 's'
def __str__(self):
return self.nickname
@classmethod
def create_one(cls, **kwargs):
return cls.objects.create(
nickname=kwargs['nickname'],
pwd=kwargs['pwd'],
tORv=kwargs['tORv'],
#token=kwargs['token']
)
@classmethod
def get_one(cls, **kwargs):
fil = {}
if kwargs.get("nickname"):
fil['nickname'] = kwargs.get("nickname")
if kwargs.get("token"):
fil['token'] = kwargs.get("token")
return cls.objects.get(**fil)
class Schedule(models.Model):
department = models.CharField(max_length=64, verbose_name="name of depar.")
ym = models.IntegerField(verbose_name="YearMonth", null=True)
doctors = models.ManyToManyField(Doctor, through="Docandsch", null=True)
class Meta:
verbose_name = "Schedule"
verbose_name_plural = verbose_name + 's'
def __str__(self):
return f"{self.department}_{self.ym}"
@classmethod
def create_one(cls, **kwargs):
return cls.objects.create(
department=kwargs.get('department'),
ym=kwargs.get('ym')
)
@classmethod
def get_one(cls, **kwargs):
fil = {}
if kwargs.get("department"):
fil['department'] = kwargs.get("department")
if kwargs.get("ym"):
fil['ym'] = kwargs.get("ym")
return cls.objects.get(**fil)
class Docandsch(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE)
status = models.BooleanField(null=True, verbose_name="1 for available & 0 for required")
class Meta:
verbose_name = "relation of doctor and schedule"
verbose_name_plural = verbose_name + ''
def __str__(self):
return f"{self.schedule.department}_{self.schedule.ym}_{self.doctor.nickname}"
@classmethod
def create_one(cls, **kwargs):
return cls.objects.create(
doctor=kwargs.get('doctor'),
schedule=kwargs.get('schedule'),
status=kwargs.get('status')
)
@classmethod
def get_one(cls, **kwargs):
fil = {}
if kwargs.get("doctor"):
fil['doctor'] = kwargs.get("doctor")
if kwargs.get("schedule"):
fil['schedule'] = kwargs.get("schedule")
if kwargs.get("status"):
fil['status'] = kwargs.get('status')
return cls.objects.get(**fil)
admin
from django.contrib import admin
from schBase_app.models import *
models = [
Doctor,
Schedule,
Docandsch
]
admin.site.register(models)
5. urls
from django.urls import path
from schBase_app.views import *
app_name = 'sch'
urlpatterns = [
path("register/", register, name="register"),
path("login/", login, name="login"),
path("indoor/", indoor, name="indoor"),
path("search/", search, name="search"),
path("contact/", contact, name="contact"),
path("delrec/", del_my_rec, name="delrec"),
path("delses/", del_my_sess, name="delses"),
]
6. views
from django.core.paginator import Paginator, InvalidPage
from django.db import IntegrityError
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.db.models import Q
from django.views.decorators.cache import cache_page
from ProjSchedule.settings import PAGE_SIZE
from .my_fun import enci_pwd
from .form import *
from .models import *
def register(request):
if request.method == 'GET':
form = DoctorForm()
return render(request, 'register.html', locals())
if request.method == 'POST':
form = DoctorForm(request.POST)
if form.is_valid():
nickname = form.cleaned_data['nickname']
pwd = enci_pwd(form.cleaned_data['pwd'])
tORv = form.cleaned_data['tORv']
data = {
'nickname': nickname,
'pwd': pwd,
'tORv': tORv
}
try:
Doctor.create_one(**data)
return redirect(reverse("sch:login"))
except IntegrityError:
return JsonResponse({'msg': 'sorry, occupied nickname.'})
def login(request):
if request.method == 'GET':
return render(request, "login.html")
if request.method == 'POST':
nickname = request.POST.get('nickname')
pwd = enci_pwd(request.POST.get('pwd'))
filters = {
'nickname': nickname,
'pwd': pwd
}
user = Doctor.objects.get(**filters)
print(user.nickname)
if user:
token = enci_pwd(nickname) # .encode('utf-8')
print(token)
user.token = token
print("imu")
user.save()
request.session['token'] = token
print("sav")
# request.GET.token = token
# print(request.GET.get('token'))
# return JsonResponse({"token": token})
return redirect(reverse("sch:indoor"))
else:
return JsonResponse({"status": 2023})
# @cache_page(30)
def indoor(request):
# module 1 : show recorded data
print('in')
if request.method == 'GET':
print('g')
page_num = request.GET.get('page_num', default=1)
relas = Docandsch.objects.order_by('status')
if not relas:
return JsonResponse({"status": 2023})
paginator = Paginator(relas, PAGE_SIZE)
try:
data = paginator.page(page_num)
except InvalidPage:
data = paginator.page(1)
return render(request, "indoor.html", locals())
if request.method == 'POST':
department_rec = request.POST.get('department_rec')
ym_rec = request.POST.get('ym_rec')
status_rec = request.POST.get('status_rec')
info = {
"department": department_rec,
"ym": ym_rec
}
s = Schedule.create_one(**info)
print("sss")
d = Doctor.get_one(**{'token': request.session['token']})
print('ddd')
Docandsch.create_one(**{'doctor': d, 'schedule': s, 'status': status_rec})
return redirect(reverse('sch:indoor'))
def search(request):
if request.method == 'GET':
sea_doc_rela = None
return render(request, 'search.html', locals())
if request.method == 'POST':
department_sea = request.POST.get('department_sea')
ym_sea = request.POST.get('ym_sea')
status_sea = request.POST.get('status_sea')
if department_sea != "None":
q1 = Q(department=department_sea)
q2 = Q(ym=ym_sea)
sch = Schedule.objects.filter(q1 & q2).first()
if not sch:
return JsonResponse({'msg': "no such department recorded."}, status=404)
q3 = Q(status=status_sea)
print(q3)
q4 = Q(schedule=sch)
print(q4)
sea_doc_rela = Docandsch.objects.filter(q3).order_by("schedule_id")
print(sea_doc_rela)
if not sea_doc_rela:
return JsonResponse({'msg': "no such schedule exists."}, status=404)
return render(request, 'search.html', locals())
#return redirect(reverse('sch:search', kwargs={"sea_doc_rela": sea_doc_rela}))
def contact(request):
tORv = request.GET.get('tORv', None)
return HttpResponse("Contact the one: "+tORv)
def del_my_rec(request):
me = Doctor.get_one(**{'token': request.session['token']})
me.delete()
return redirect(reverse('sch:indoor'))
def del_my_sess(request):
request.session.flush()
return HttpResponse("Your login session has been deleted. Login again when necessary.")
7. temp
<title>register</title>
</head>
<body>
<form action="{% url 'sch:register' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
{% csrf_token %}
<input type="submit" value="Register">
</form>
<title>login</title>
</head>
<body>
<!--nickname pwd-->
<form method="post" action="{% url 'sch:login' %}">
{% csrf_token %}
Nickname: <label>
<input type="text" name="nickname">
</label><br>
Password:<label>
<input type="password" name="pwd">
</label>
<input type="submit" value="Login">
</form>
<hr>
<meta charset="UTF-8">
<title>indoor</title>
<hr>
<h3 style="color:royalblue">Information recorded:</h3>
<table>
<thead>
<tr>
<th>Department</th>
<th>YearMonth</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{% for i in data %}
<tr>
<td>{{ i.schedule.department }}</td>
<td>{{ i.schedule.ym }}</td>
<td>
{% if i.status == 1 %}
1 available
{% else %}
0 required
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="{% url 'sch:indoor' %}" style="color:orangered">First</a>
{% if data.has_previous %}
<a href="{% url 'sch:indoor' %}?page_num={{ data.previous_page_number }}" style="color:orangered">Previous</a>
{% else %}
<a href="javascript:alert('Here is page 1.')" style="color:orangered">Previos</a>
{% endif %}
{{ data.number }}/{{ paginator.num_pages }}
{% if data.has_next %}
<a href="{% url 'sch:indoor' %}?page_num={{ data.next_page_number }}" style="color:orangered">Next</a>
{% else %}
<a href="javascript:alert('Here is page -1.')" style="color:orangered">Next</a>
{% endif %}
<a href="{% url 'sch:indoor' %}?page_num={{ paginator.num_pages }}" style="color:orangered">Last</a>
<hr>
<h3 style="color:royalblue">Search:</h3>
<form method="post" action="{% url 'sch:search' %}?sea_doc_rela = None">
{% csrf_token %}
Department: <label>
<input type="text" name="department_sea" value="None">
</label><br>
YearMonth:<label>
<input type="number" name="ym_sea">
</label><br>
Status:<label>
<input type="number" name="status_sea">( 0 for 'someone wants it' & 1 for 'someone has it')
</label><br>
<input type="submit" value="Search">
</form>
<hr>
<h3 style="color:royalblue">Record your requirement:</h3>
<form method="post" action="{% url 'sch:indoor' %}">
{% csrf_token %}
Department: <label>
<input type="text" name="department_rec" value="None">
</label><br>
YearMonth:<label>
<input type="number" name="ym_rec">
</label><br>
Status:<label>
<input type="number" name="status_rec">( 0 for 'you want it' & 1 for 'you have it')
</label><br>
<input type="submit" value="Record me.">
</form>
<hr>
<a href="{% url 'sch:delrec' %}" style="color:steelblue">Delete your records (and your registered tel. or vxid).</a><br>
<a href="{% url 'sch:delses' %}" style="color:steelblue">Delete your login this time.</a>
<title>searchResult</title>
</head>
<body>
{% for r in sea_doc_rela %}
<a href="{% url 'sch:contact' %}?tORv={{ r.doctor.tORv }}">{{ r.schedule.ym }}_{{ r.doctor.nickname }}</a>
<br>
{% endfor %}