开发实践_阶段二

编写一个日程互助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 %}

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值