• 国庆手撸商品管理系统(三)


    之前的内容

    点我管理系统(一)

    点我管理系统(二)

    一.实现的内容

    • 商品退货

    • 商品库存

    • 商品进货

    • 商品删除

    • 商品还原

    • 时钟

    • 优化模型

    二.后续内容准备优化内容

    • 把数据库查询的内容存在缓存中
    • 增加按日期,按商品名查询
    • 增加快捷商品增加
    • 优化代码
    • 优化界面

    三.目录结构

    drf_test
    |___drf_api
    |    |___admin.py
    |    |___apps.py
    |    |___migrations
    |    |___models.py
    |    |___tests.py
    |    |___userinfo_form.py
    |    |___views
    |    |    |____commodity.py
    |    |    |____user.py
    |    |_____init__.py
    |___drf_test
    |    |___settings.py
    |    |___urls.py
    |    |___wsgi.py
    |    |_____init__.py
    |___img
    |    |___avatar
    |___manage.py
    |___static
    |    |___bootstrap-3.3.7-dist
    |    |___jquery-3.4.1.min.js
    |___templates
    |    |___aa.html
    |    |___add.html
    |    |___del.html
    |    |___index.html
    |    |___login.html
    |    |___register.html
    |    |___return.html
    |    |___sales.html
    |    |___show.html
    |    |___show_del.html
    |    |___template.html
    |_____pycache__
    |    |___manage.cpython-37.pyc
    

    四.代码

    1.配置

    setting.py

    """
    Django settings for drf_test project.
    
    Generated by 'django-admin startproject' using Django 1.11.22.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/1.11/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/1.11/ref/settings/
    """
    
    import os
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'ppa5l3jvxr4k^ow*4o+0_^7@&sa3x+!hb_$artwraa%60iq@g7'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'drf_api',
        'rest_framework',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'drf_test.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'drf_test.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',   # 数据库引擎
            'NAME': 'mib',         # 你要存储数据的库名,事先要创建之
            'USER': 'root',         # 数据库用户名
            'PASSWORD': '16745',     # 密码
            'HOST': 'localhost',    # IP
            'PORT': '3306',         # 数据库使用的端口
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/1.11/topics/i18n/
    
    LANGUAGE_CODE = 'zh-hans'
    
    TIME_ZONE = 'Asia/Shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = False
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.11/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)
    AUTH_USER_MODEL = "drf_api.UserInfo"
    MEDIA_URL  = "/img/"
    MEDIA_ROOT = os.path.join(BASE_DIR, "img")
    
    
    # REST_FRAMEWORK = {
    #     'DEFAULT_AUTHENTICATION_CLASSES': (
    #         'rest_framework.authentication.TokenAuthentication',
    #     )
    # }
    

    2.模型

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    from rest_framework import mixins
    # Create your models here.
    class UserInfo(AbstractUser):
        avatar = models.FileField(upload_to='avatar/', default='avatar/default.png')
        class Meta:
            verbose_name='用户表'
            verbose_name_plural = verbose_name
    
    
    class  Commodity(models.Model):
        name = models.CharField(max_length=60,db_column='商品名',null=True)
        inventory = models.IntegerField(db_column='库存',null=True)
        cost = models.DecimalField (max_digits=60,decimal_places=2,db_column='总成本',null=True)
        selling_price= models.DecimalField (max_digits=60,decimal_places=2,db_column='总销售价格',default=0)
        batch = models.CharField(max_length=60, db_column='批号', null=True)
        quantity_in = models.IntegerField(db_column='进货总数量',null=True)
        sales_volume = models.IntegerField(db_column='销售量总数量',default=0)
        return_volume = models.IntegerField(db_column='退货总数量',default=0)
        is_delete = models.BooleanField(default=False, db_column='是否删除')
        def __str__(self):
            return self.name
    
        class Meta:
            db_table = "库存表"
    
    
    class DaySales(models.Model):
        date = models.CharField(max_length=60,db_column='日期')
        number = models.DecimalField(max_digits=60, decimal_places=2, db_column='营业总额', null=True)
        is_delete = models.BooleanField(default=False, db_column='是否删除')
        date_changed = models.DateTimeField(auto_now=True,db_column='最后修改日期')
        def __str__(self):
            return self.date
        class Meta:
            db_table = "日销售表"
    
    class DayStock(models.Model):
        date = models.CharField(max_length=60,db_column='日期')
        number = models.DecimalField(max_digits=60, decimal_places=2, db_column='进货总额', null=True)
        is_delete = models.BooleanField(default=False, db_column='是否删除')
        date_changed = models.DateTimeField(auto_now=True,db_column='最后修改日期')
        def __str__(self):
            return self.date
        class Meta:
            db_table = "日进货表"
    
    class DayReturn(models.Model):
        date = models.CharField(max_length=60,db_column='日期')
        number  = models.DecimalField(max_digits=60, decimal_places=2, db_column='退货总额', null=True)
        is_delete = models.BooleanField(default=False, db_column='是否删除')
        date_changed = models.DateTimeField(auto_now=True,db_column='最后修改日期')
        def __str__(self):
            return self.date
        class Meta:
            db_table = "日退货表"
    
    
    class CommoditySales(models.Model):
        name = models.CharField(max_length=60,db_column='商品名',null=True)
        data = models.ForeignKey('DaySales','id',db_column='销售日期',null=True)
        selling_price= models.DecimalField (max_digits=60,decimal_places=2,db_column='销售价格',null=True)
        sales_volume = models.IntegerField(db_column='销售量数量',null=True)
        batch = models.CharField(max_length=60,db_column='批号',null=True)
        is_delete = models.BooleanField(default=False, db_column='是否删除')
        date_changed = models.DateTimeField(auto_now=True,db_column='最后修改日期')
        def __str__(self):
            return self.name
        class Meta:
            db_table = "商品销售表"
    
    
    class CommodityStock(models.Model):
        name = models.CharField(max_length=60,db_column='商品名',null=True)
        data = models.ForeignKey('DayStock','id',db_column='进货日期',null=True)
        cost = models.DecimalField (max_digits=60,decimal_places=2,db_column='单件成本',null=True)
        Stock_volume = models.IntegerField( db_column='进货数量', null=True)
        batch = models.CharField(max_length=60,db_column='批号',null=True)
        is_delete = models.BooleanField(default=False, db_column='是否删除')
        date_changed = models.DateTimeField(auto_now=True,db_column='最后修改日期')
        def __str__(self):
            return self.name
        class Meta:
            db_table = "商品进货表"
    
    class CommodityReturn(models.Model):
        name = models.CharField(max_length=60,db_column='商品名',null=True)
        data = models.ForeignKey('DayReturn','id',db_column='退货日期',null=True)
        cost = models.DecimalField (max_digits=60,decimal_places=2,db_column='退货价格',null=True)
        return_volume = models.IntegerField( db_column='退货数量', null=True)
        batch = models.CharField(max_length=60,db_column='批号',null=True)
        is_delete = models.BooleanField(default=False, db_column='是否删除')
        date_changed = models.DateTimeField(auto_now=True,db_column='最后修改日期')
        def __str__(self):
            return self.name
        class Meta:
            db_table = "商品退货表"
    

    3.路由

    """drf_test URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/1.11/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.conf.urls import url, include
        2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
    """
    from django.conf.urls import url
    from django.contrib import admin
    from django_filters import views
    
    from drf_api.views import user
    from drf_api.views import commodity
    from django.views.static import serve
    from .settings import MEDIA_ROOT
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^register/', user.register),
        url(r'^test/', user.test),
        url(r'^login/', user.login),
        url(r'^loginout/', user.loginout),
        url(r'^get_code/', user.get_code),
        url(r'^show/', commodity.Show.as_view()),
        url(r'^add/', commodity.Add.as_view()),
        url(r'^del/', commodity.Del.as_view()),
        url(r'^show_del/', commodity.ShowDel.as_view()),
        url(r'^sales/', commodity.Sales.as_view()),
        url(r'^return/', commodity.Return.as_view()),
        url(r'', user.index),
        url(r'^img/(?P<path>.*)', serve, {'document_root': MEDIA_ROOT}),
    ]
    
    

    4.用户视图

    user.py

    from django.shortcuts import render,HttpResponse,redirect
    from django.http import JsonResponse
    
    from PIL import Image,ImageDraw,ImageFont
    import random
    
    from io import BytesIO
    
    from django.contrib import auth
    
    from drf_api.userinfo_form import Register
    from drf_api import models
    from rest_framework.throttling import SimpleRateThrottle
    
    
    def test(request):
        return render(request, 'aa.html')
    
    
    
    def register(request):
        if request.method=='GET':
            form=Register()
            return render(request, 'register.html', {'form':form})
        elif request.is_ajax():
            response={'code':100,'msg':None}
            form = Register(request.POST)
            if form.is_valid():
                #校验通过的数据
                clean_data=form.cleaned_data
                #把re_pwd剔除
                clean_data.pop('re_pwd')
                #取出头像
                avatar=request.FILES.get('avatar')
                if avatar:
                    clean_data['avatar']=avatar
                user=models.UserInfo.objects.create_user(**clean_data)
                if user:
                    response['msg'] = '创建成功'
                else:
                    response['code'] = 103
                    response['msg'] = '创建失败'
            else:
                response['code']=101
                #把校验不通过的数据返回
                response['msg']=form.errors
                print(type(form.errors))
            return JsonResponse(response,safe=False)
    
    
    def login(request):
        if request.method=='GET':
            return render(request, 'login.html')
        else:
            print(request.POST)
            user_name=request.POST.get('name')
            pwd=request.POST.get('pwd')
            code=request.POST.get('code')
    
            user=auth.authenticate(username=user_name,password=pwd)
            print(user)
            if request.session.get('code').upper() !=code.upper(): #忽略大小写
                return HttpResponse('验证码错误')
            elif not user:
                return HttpResponse('账号密码错误')
            else:
                auth.login(request,user)
                return redirect('/show/')
    
    
    
    def get_code(request):
        if request.method == 'GET':
            img = Image.new('RGB', (350, 40), (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
            # 写文字
            # 生成一个字体对象
            font = ImageFont.truetype('/static/Gabriola.ttf', 34)
            # 调用方法,返回一个画板对象
            draw = ImageDraw.Draw(img)
    
            new_text =''
            x = 100
            # 生成随机4位数字
            text_chiose = 'zxcvbnmasdfghjklqwertyup23456789ZXCVBNMASDFGHJKLQWERTYUP'
            text_list=random.sample(text_chiose,4)
            for text in text_list:
                x+=20
                y = random.randint(1,5)
                draw.text((x, y), text, (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
                          font=font)
                new_text +=text
    
    
    
            # 加点线
            width = 320
            height = 35
            for i in range(2):
                x1 = random.randint(0, width)
                x2 = random.randint(0, width)
                y1 = random.randint(0, height)
                y2 = random.randint(0, height)
                # 在图片上画线
                draw.line((x1, y1, x2, y2), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
    
            for i in range(10):
                # 画点
                draw.point([random.randint(0, width), random.randint(0, height)], fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
                x = random.randint(0, width)
                y = random.randint(0, height)
                # 画弧形
                draw.arc((x, y, x + 4, y + 4), 0, 90, fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
            print(new_text)
            #存在session中
            request.session['code']=new_text
            #存内存
            f = BytesIO()
            img.save(f, 'png')
            return HttpResponse(f.getvalue())
    
    def loginout(request):
        auth.logout(request)
        return redirect('/login')
    
    
    def index(request):
        return render(request,'index.html')
    

    5.商品视图

    commodity.py

    这里Return视图类有点偷懒了里面变量名用的非常非常不规范请见谅

    import datetime
    
    from django.shortcuts import render, HttpResponse
    from rest_framework.views import APIView
    
    from drf_api.models import *
    
    
    class Show(APIView):
        def get(self, request):
            Commodity_list = Commodity.objects.filter(is_delete=False).order_by('name').all()
            print(Commodity_list)
            return render(request, 'show.html', {'Commodity_list': Commodity_list})
    
    
    class Add(APIView):
        def get(self, request):
            Commodity_list = Commodity.objects.filter(is_delete=False).order_by('name').all()
            print(Commodity_list)
            return render(request, 'add.html')
    
        def post(self, request):
            print(request.POST)
            name = request.POST.get('name')  # type:str
            batch = request.POST.get('batch')  # type:str
            cost = request.POST.get('cost')  # type:str
            Stock_volume = request.POST.get('Stock_volume')  # type:str
            time = str(datetime.datetime.now()).split(' ')[0].replace('-', '')
    
            DayStock_obj = DayStock.objects.filter(date=time).first()
    
            try:
                number = float(cost) * int(Stock_volume)
            except:
                return HttpResponse('数量和价格请输入数字')
            try:
                if not DayStock_obj:
                    DayStock_obj = DayStock.objects.create(date=time, number=number)
                else:
                    old_number = float(DayStock_obj.number)
                    DayStock_obj.number = old_number + number
                    DayStock_obj.save()
    
                CommodityStock_obj = CommodityStock.objects.create(name=name, data=DayStock_obj, cost=number,
                                                                   Stock_volume=int(Stock_volume), batch=batch)
    
                obj = Commodity.objects.filter(is_delete=False, name=name, batch=batch).first()
                if obj:
                    obj.quantity_in += int(Stock_volume)
                    obj.inventory += int(Stock_volume)
                    old_number = float(obj.cost)
                    obj.cost = old_number + number
                    obj.save()
                else:
                    Commodity.objects.create(name=name, inventory=int(Stock_volume), cost=float(cost),
                                             quantity_in=int(Stock_volume), batch=batch)
                return HttpResponse('添加成功')
            except:
                return HttpResponse('添加失败')
    
    
    class Del(APIView):
    
        def get(self, request):
            Commodity_list = Commodity.objects.filter(is_delete=False).order_by('name').all()
            print(Commodity_list)
            return render(request, 'del.html', {'Commodity_list': Commodity_list})
    
        def post(self, request):
            c_id = request.POST.get('c_id')
            Commodity_obj = Commodity.objects.filter(id=c_id).first()
            Commodity_obj.is_delete = True
            Commodity_obj.save()
            return HttpResponse('删除成功')
    
    
    class ShowDel(APIView):
    
        def get(self, request):
            Commodity_list = Commodity.objects.filter(is_delete=True).all()
            print(Commodity_list)
            return render(request, 'show_del.html', {'Commodity_list': Commodity_list})
    
        def post(self, request):
            c_id = request.POST.get('c_id')
            Commodity_obj = Commodity.objects.filter(id=c_id).first()
            Commodity_obj.is_delete = False
            Commodity_obj.save()
            return HttpResponse('恢复成功')
    
    
    class Sales(APIView):
    
        def get(self, request):
            Commodity_list = Commodity.objects.filter(is_delete=False).order_by('name').all()
            print(Commodity_list)
            return render(request, 'sales.html', {'Commodity_list': Commodity_list})
    
        def post(self, request):
            c_id = request.POST.get('c_id')
            selling_price = request.POST.get('selling_price')
            sales_volume = request.POST.get('sales_volume')
            try:
                selling_price = float(selling_price)
                sales_volume = int(sales_volume)
            except:
                return HttpResponse('数量和价格请输入数字')
    
            try:
                Commodity_obj = Commodity.objects.filter(id=c_id).first()
                name = Commodity_obj.name
                batch = Commodity_obj.batch
                time = str(datetime.datetime.now()).split(' ')[0].replace('-', '')
    
                DaySales_obj = DaySales.objects.filter(date=time).first()
    
                number = selling_price * sales_volume
    
                if not DaySales_obj:
                    DaySales_obj = DaySales.objects.create(date=time, number=number)
                else:
                    old_number = float(Commodity_obj.selling_price)
                    DaySales_obj.number = old_number + number
                    DaySales_obj.save()
    
                CommoditySales_obj = CommoditySales.objects.create(name=name, data=DaySales_obj, selling_price=selling_price,
                                                                   sales_volume=sales_volume, batch=batch)
    
                Commodity_obj.sales_volume += sales_volume
                Commodity_obj.inventory -= sales_volume
                old_number = float(Commodity_obj.selling_price)
                Commodity_obj.selling_price = old_number + number
                Commodity_obj.save()
                return HttpResponse('出售成功')
            except:
                return HttpResponse('数据异常')
    
    
    class Return(APIView):
    
        def get(self, request):
            Commodity_list = Commodity.objects.filter(is_delete=False).order_by('name').all()
            print(Commodity_list)
            return render(request, 'return.html', {'Commodity_list': Commodity_list})
    
        def post(self, request):
            c_id = request.POST.get('c_id')
            selling_price = request.POST.get('selling_price')
            sales_volume = request.POST.get('sales_volume')
            try:
                selling_price = float(selling_price)
                sales_volume = int(sales_volume)
            except:
                return HttpResponse('数量和价格请输入数字')
    
            try:
                Commodity_obj = Commodity.objects.filter(id=c_id).first()
                name = Commodity_obj.name
                batch = Commodity_obj.batch
                time = str(datetime.datetime.now()).split(' ')[0].replace('-', '')
    
                DayReturn_obj = DayReturn.objects.filter(date=time).first()
    
                number = selling_price * sales_volume
    
                if not DayReturn_obj:
                    DayReturn_obj = DayReturn.objects.create(date=time, number=number)
                else:
                    old_number = float(Commodity_obj.selling_price)
                    DayReturn_obj.number = old_number + number
                    DayReturn_obj.save()
    
                CommodityReturn_obj = CommodityReturn.objects.create(name=name, data=DayReturn_obj, cost=selling_price,
                                                                   return_volume=sales_volume, batch=batch)
    
                Commodity_obj.return_volume += sales_volume
                Commodity_obj.inventory -= sales_volume
                old_number = float(Commodity_obj.selling_price)
                Commodity_obj.selling_price = old_number + number
                Commodity_obj.save()
                return HttpResponse('退货成功')
            except:
                return HttpResponse('数据异常')
    

    6.网页

    模板template.html

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script src="/static/jquery-3.4.1.min.js"></script>
        <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
        <title>{% block title_text %}{% endblock %}</title>
    </head>
    <style>
        table{
                background: antiquewhite;
        }
        .header {
            position: fixed;
            top: 0;
            left: 0;
            height: 100px;
             100%;
            background: red;
        }
    
        .header_left {
    
            position: absolute;
            line-height: 100px;
            font-size: 50px;
             20%;
            text-align: center;
            background: black;
            color: white;
        }
            .header_middle {
            position: absolute;
            line-height: 100px;
            font-size: 50px;
             20%;
            background: none;
            color: white;
            left: 20%;
        }
    
        .header_right {
            float: right;
        }
    
        .body {
            position: fixed;
            top: 100px;
            left: 0;
            bottom: 20px;
             100%;
        }
    
        .body_left {
            position: fixed;
            top: 100px;
            bottom: 20px;
             20%;
            background: white;
            left: 0;
        }
    
        .body_right {
            overflow: auto;
            position: fixed;
            top: 100px;
            left: 20%;
            bottom: 20px;
             80%;
            background: #2aabd2;
        }
    
        .footer {
            position: fixed;
            left: 0;
            bottom: 0;
            height: 20px;
             100%;
            background: black;
        }
    </style>
    {% block new_css %}
    {% endblock %}
    <body>
    
    <div class="header">
        <div class="header_left">管理系统</div>
        <div class="header_middle"><span id="clock"></span></div>
        <div class="header_right">
            {% if request.user.is_authenticated %}
                <span><img src=http://127.0.0.1:8000/img/{{ request.user.avatar }} alt="" style="height: 30px; 30px">尊敬的{{ request.user.username }}</span>
                <span class="dropdown">
      <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown"
              aria-haspopup="true" aria-expanded="true" style="font-size: 12px">
        更多操作
        <span class="caret"></span>
      </button>
      <ul class="dropdown-menu" aria-labelledby="dropdownMenu1" >
        <li><a href="#" style="line-height: 0.428571;">修改头像</a><a href="#">修改密码</a></li>
        <li role="separator" class="divider"></li>
        <li><a href="/loginout/" style="line-height: 0.428571;">登出</a></li>
      </ul>
    </span>
            {% else %}
                <spen style="line-height: 50px;float: right;position: absolute;right: 120px;"><a
                        href="/login/">登入</a>{{ request.user.username }}</spen>
                <spen style="line-height: 50px;float: right;position: absolute;right: 80px;"><a
                        href="/register/">注册</a>{{ request.user.username }}</spen>
            {% endif %}
        </div>
    </div>
    <div class="body">
        <div class="body_left">
            <ul class="nav nav-pills nav-stacked nav-pills-stacked-example">
                <li role="presentation" class="active"><a>库存管理</a></li>
                <li role="presentation"><a href="/show/">商品库存</a></li>
                <li role="presentation"><a href="/add/">商品进货</a></li>
                <li role="presentation"><a href="/return/">商品退货</a></li>
                <li role="presentation"><a href="/sales/">商品销售</a></li>
                <li role="presentation"><a href="/del/">删除库存商品</a></li>
                <li role="presentation"><a href="/show_del/">删除商品查看</a></li>
            </ul>
    
        </div>
        <div class="body_right">
            {% block data %}
            {% endblock %}
        </div>
    </div>
    <div class="footer"></div>
    </body>
    </html>
    <script>
        function get_time() {
            var obj = new Date();
            var hour = obj.getHours();
            var min = obj.getMinutes();
            var seconds = obj.getSeconds();
            if (parseInt(seconds)<10)seconds='0'+seconds;
            if (parseInt(hour)<10)hour='0'+hour;
            if (parseInt(min)<10)min='0'+min;
            var time = hour + ':' + min + ':' + seconds
            var clock = document.querySelector('#clock')
            clock.innerText = time
        }
        setInterval(get_time,1000)
    </script>
    {% block new_js %}
    {% endblock %}
    

    注册register.html

    {% extends 'template.html' %}
    {% block title_text %}
        注册
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
    
                    <h1>注册</h1>
                    <form id="my_form">
                        {% for foo in form %}
                            <div class="form-group">
                                {#foo.auto_id   就是foo生成的input的id#}
                                <label for="{{ foo.auto_id }}">{{ foo.label }}</label>
                                {{ foo }} <span style="color: red" class="error pull-right"></span>
                            </div>
    
                        {% endfor %}
                        <div class="form-group">
                            <label for="id_file">头像
                                <img src="/img/avatar/default.png" width="80" height="80" style="margin-left: 20px"
                                     id="id_img">
                            </label>
    
    
                            <input type="file" name="file" id="id_file" style="display: none">
                        </div>
                        <input type="button" class="btn btn-success" value="提交" id="id_submit">
                    </form>
                </div>
            </div>
        </div>
    {% endblock %}
    {% block new_js %}
        <script>
            //当该控件发生变化,响应该事件
            $("#id_file").change(function () {
                //alert(1)
                //取到文件对象
                var file = $("#id_file")[0].files[0]
                //放到img控件上,借助于filereader 中间的东西,文件阅读器
                //生成一个文件阅读器对象赋值给filereader
                var filereader = new FileReader()
                //把文件读到filereader对象中
                //读文件需要时间,需要文件读完再去操作img
                filereader.readAsDataURL(file)
    
                filereader.onload = function () {
                    $("#id_img").attr('src', filereader.result)
                }
    
            })
            $("#id_submit").click(function () {
    
                //ajax 上传文件
    
    
                var formdata = new FormData()
                //一个一个往里添加,稍微复杂,用简便方法
                // formdata.append('name',$("#id_name").val())
                // formdata.append('pwd',$("#id_pwd").val())
    
                //简便方法
                //form 对象的serializeArray,它会把form中的数据包装到一个对象中(不包含文件)
                var my_form_data = $("#my_form").serializeArray()
                //console.log(typeof my_form_data)
                //console.log(my_form_data)
                //jq的循环,传两个参数,第一个是要循环的对象,第二个参数是一个匿名函数
                $.each(my_form_data, function (k, v) {
                    {#console.log(k)#}
                    {#console.log(v)#}
                    formdata.append(v.name, v.value)
                })
                formdata.append('avatar', $("#id_file")[0].files[0])
    
    
                $.ajax({
                    url: '/register/',
                    type: 'post',
                    processData: false, //告诉jQuery不要去处理发送的数据
                    contentType: false,// 告诉jQuery不要去设置Content-Type请求头
                    data: formdata,
                    success: function (data) {
                        //console.log(data)
                        if (data.code == 100) {
                            location.href = '/login/'
                        } else if (data.code == 101) {
                            $.each(data.msg, function (k, v) {
                                console.log(k)
                                console.log(v)
                                $("#id_" + k).next().html(v[0])
                                if (k == '__all__') {
                                    $("#id_re_pwd").next().html(v[0])
                                }
    
                            })
    
                        }
                        //定时器
                        setTimeout(function () {
                            $(".error").html("")
                        }, 3000)
                    }
    
    
                })
            })
    
    
        </script>
    {% endblock %}
    

    登入login.html

    {% extends 'template.html' %}
    {% block title_text %}
        登入
    {% endblock %}
    {% block new_css %}
        <style>
            .img-code:hover{
    
            }
        </style>
    {% endblock %}
    {% block data %}
        <div class="container-fluid center-block">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    {% csrf_token %}
                    <h1>登陆</h1>
                    <form action="">
                        <div class="form-group">
                            <label for="id_name">用户名</label>
                            <input type="text" name="name" id="id_name" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="pwd">密码</label>
                            <input type="password" name="pwd" id="pwd" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="id_code">验证码</label>
                            <div class="row">
                                <div class="col-md-6">
                                    <input type="text" name="code" id="id_code" class="form-control">
                                </div>
                                <div class="col-md-6" id="img">
                                    <img src="/get_code/" height="40" width="240" class="img-code">
                                </div>
                            </div>
                        </div>
                        <input type="button" value="提交" class="btn-success" id="up_data">
                        <span style="color: red" id="msg"></span>
                    </form>
                </div>
            </div>
        </div>
    {% endblock %}
    {% block new_js %}
        <script>
            $('.img-code').click(function () {
                var img_code_src = $(this).attr('src');
                img_code_src += '1';
                console.log(img_code_src);
                $(this).attr('src', img_code_src)
            })
        </script>
    
        <script>
            $('#up_data').click(function () {
                $.ajax({
                    type: 'post',
                    url: '/login/',
                    data: {
                        'name': $('#id_name').val(),
                        'pwd': $('#pwd').val(),
                        'code': $('#id_code').val(),
                        'csrfmiddlewaretoken': '{{csrf_token}}'
                    },
                    success: function (msg) {
                        console.log(msg);
                        $('#msg').text(msg);
                        if (msg == '登入成功') {
                            console.log('sb');
                        }
                    }
                })
            })
        </script>
    {% endblock %}
    

    首页index.html

    {% extends 'template.html' %}
    {% block title_text %}
        首页
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
        <div class="msg" style="    font-size: 100px;
        text-align: center;
        color: red;
    }">欢迎光临
        </div>
    {% endblock %}
    {% block new_js %}
    {% endblock %}
    

    进货add.html

    {% extends 'template.html' %}
    {% block title_text %}
        添加商品
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
        <form action="" method="post">
            {% csrf_token %}
            <label for="name">商品名</label>
            <input type="text" id="name" name="name">
            <label for="Stock_volume">商品数量</label>
            <input type="text" id="Stock_volume" name="Stock_volume">
            <label for="batch">商品批号</label>
            <input type="text" id="batch" name="batch">
            <label for="cost">商品单价(元)</label>
            <input type="text" id="cost" name="cost">
            <input type="button" value="提交" class="custom_button">
        </form>
        <div class="msg"></div>
    {% endblock %}
    {% block new_js %}
        <script>
        var new_show_msg =''
            var custom_button = document.querySelector('.custom_button');
            custom_button.onclick = function () {
                var name = document.querySelector('#name').value;
                var Stock_volume = document.querySelector('#Stock_volume').value;
                var batch = document.querySelector('#batch').value;
                var cost = document.querySelector('#cost').value;
                var show_msg = '商品名:' + name + '
    批号:' + batch + '
    数量:' + Stock_volume + '
    成本单价:' + cost+'元'
                if (name && Stock_volume && batch && cost) {
                    if (confirm(show_msg)){
                        $.ajax(
                            {
                                type: 'post',
                                url: '/add/',
                                data: {
                                    'name': name,
                                    'Stock_volume': Stock_volume,
                                    'batch': batch,
                                    'cost': cost,
                                    'csrfmiddlewaretoken': '{{csrf_token}}'
                                }, success: function (msg) {
                                    var show = document.querySelector('.msg')
                                    new_show_msg += '<div style="white-space: pre-line;border: 2px solid;position: inherit;"><div style="color:red">'+msg+'</div>'+show_msg+'</div>'
                                    show.innerHTML=new_show_msg
                                }
                            }
                        )
                    }
                } else {
                    alert('内容不能为空')
                }
    
    
            }
        </script>
    
    {% endblock %}
    

    销售sales.html

    {% extends 'template.html' %}
    {% block title_text %}
        删除商品库存
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
        <table class="table table-hover">
            <thead>
            <tr>
                <th></th>
                <th>商品名</th>
                <th>商品批号</th>
                <th>库存</th>
                <th>总成本</th>
                <th>总销售额</th>
                <th>进货总数量</th>
                <th>销售量总数量</th>
                <th>退货总数量</th>
                <th>销售</th>
            </tr>
            </thead>
            <tbody>
            {% for Commodity_obj in Commodity_list %}
                <tr>
                    <th scope="row">1</th>
                    <td>{{ Commodity_obj.name }}</td>
                    <td>{{ Commodity_obj.batch }}</td>
                    <td>{{ Commodity_obj.inventory }}</td>
                    <td>{{ Commodity_obj.cost }}</td>
                    <td>{{ Commodity_obj.selling_price }}</td>
                    <td>{{ Commodity_obj.quantity_in }}</td>
                    <td>{{ Commodity_obj.sales_volume }}</td>
                    <td>{{ Commodity_obj.return_volume }}</td>
                    <td>
                        <button class="del_button" inventory={{ Commodity_obj.inventory }} batch={{ Commodity_obj.batch }} c_id={{ Commodity_obj.id }}>出售</button>
                    </td>
    
                </tr>
            {% endfor %}
    
    
            </tbody>
        </table>
    {% endblock %}
    {% block new_js %}
        <script>
            var del_button = document.querySelectorAll('.del_button')
            for (var index = 0; index < del_button.length; index++) {
                del_button[index].onclick = function () {
                    if (confirm('是否确定出售')) {
                        var selling_price = parseFloat(prompt('出售价格'));
                        var sales_volume = parseInt(prompt('出售数量'));
                        var c_id = this.getAttribute('c_id');
                        var inventory = this.getAttribute('inventory');
                        if(sales_volume<=inventory){
                                     $.ajax({
                            url: /sales/,
                            type: 'post',
                            data: {
                                'c_id': c_id,
                                'selling_price': selling_price,
                                'sales_volume': sales_volume,
                                'csrfmiddlewaretoken': '{{csrf_token}}'
                            },
                            success: function (msg) {
                                alert(msg)
                                window.location.replace('/sales/')
                        }
                        })
                        }else {
                            alert('库存不足')
                        }
    
                    }
                }
            }
        </script>
    {% endblock %}
    

    退货return.html

    {% extends 'template.html' %}
    {% block title_text %}
        删除商品库存
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
        <table class="table table-hover">
            <thead>
            <tr>
                <th></th>
                <th>商品名</th>
                <th>商品批号</th>
                <th>库存</th>
                <th>总成本</th>
                <th>总销售额</th>
                <th>进货总数量</th>
                <th>销售量总数量</th>
                <th>退货总数量</th>
                <th>退货</th>
            </tr>
            </thead>
            <tbody>
            {% for Commodity_obj in Commodity_list %}
                <tr>
                    <th scope="row">1</th>
                    <td>{{ Commodity_obj.name }}</td>
                    <td>{{ Commodity_obj.batch }}</td>
                    <td>{{ Commodity_obj.inventory }}</td>
                    <td>{{ Commodity_obj.cost }}</td>
                    <td>{{ Commodity_obj.selling_price }}</td>
                    <td>{{ Commodity_obj.quantity_in }}</td>
                    <td>{{ Commodity_obj.sales_volume }}</td>
                    <td>{{ Commodity_obj.return_volume }}</td>
                    <td>
                        <button class="del_button" inventory={{ Commodity_obj.inventory }} batch={{ Commodity_obj.batch }} c_id={{ Commodity_obj.id }}>退货</button>
                    </td>
    
                </tr>
            {% endfor %}
    
    
            </tbody>
        </table>
    {% endblock %}
    {% block new_js %}
        <script>
            var del_button = document.querySelectorAll('.del_button')
            for (var index = 0; index < del_button.length; index++) {
                del_button[index].onclick = function () {
                    if (confirm('是否确定退货')) {
                        var selling_price = parseFloat(prompt('退货单价'));
                        var sales_volume = parseInt(prompt('退货数量'));
                        var c_id = this.getAttribute('c_id');
                        var inventory = this.getAttribute('inventory');
                        if(sales_volume<=inventory){
                                     $.ajax({
                            url: /return/,
                            type: 'post',
                            data: {
                                'c_id': c_id,
                                'selling_price': selling_price,
                                'sales_volume': sales_volume,
                                'csrfmiddlewaretoken': '{{csrf_token}}'
                            },
                            success: function (msg) {
                                alert(msg)
                                window.location.replace('/return/')
                        }
                        })
                        }else {
                            alert('库存不足')
                        }
    
                    }
                }
            }
        </script>
    {% endblock %}
    

    删除商品del.html

    {% extends 'template.html' %}
    {% block title_text %}
        删除商品库存
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
        <table class="table table-hover">
            <thead>
            <tr>
                <th></th>
                <th>商品名</th>
                <th>商品批号</th>
                <th>库存库存</th>
                <th>总成本</th>
                <th>总销售额</th>
                <th>进货总数量</th>
                <th>销售量总数量</th>
                <th>退货总数量</th>
                <th>是否删除</th>
            </tr>
            </thead>
            <tbody>
            {% for Commodity_obj in Commodity_list %}
                <tr>
                    <th scope="row">1</th>
                    <td>{{ Commodity_obj.name }}</td>
                    <td>{{ Commodity_obj.batch }}</td>
                    <td>{{ Commodity_obj.inventory }}</td>
                    <td>{{ Commodity_obj.cost }}</td>
                    <td>{{ Commodity_obj.selling_price }}</td>
                    <td>{{ Commodity_obj.quantity_in }}</td>
                    <td>{{ Commodity_obj.sales_volume }}</td>
                    <td>{{ Commodity_obj.return_volume }}</td>
                    <td>
                        <button class="del_button" c_id={{ Commodity_obj.id }}>删除</button>
                    </td>
    
                </tr>
            {% endfor %}
    
    
            </tbody>
        </table>
    {% endblock %}
    {% block new_js %}
        <script>
            var del_button = document.querySelectorAll('.del_button')
            for (var index = 0; index < del_button.length; index++) {
                del_button[index].onclick = function () {
                    if (confirm('是否确定删除')) {
                        var c_id = this.getAttribute('c_id');
                        $.ajax({
                            url: /del/,
                            type: 'post',
                            data: {
                                'c_id': c_id,
                                'csrfmiddlewaretoken': '{{csrf_token}}'
                            },
                            success: function (msg) {
                                alert(msg)
                                window.location.replace('/del/')
                        }
                        })
                    }
                }
            }
        </script>
    {% endblock %}
    

    展示show.html

    {% extends 'template.html' %}
    {% block title_text %}
        查看商品
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
    <table class="table table-hover">
          <thead>
            <tr>
              <th></th>
              <th>商品名</th>
              <th>批号</th>
              <th>库存库存</th>
              <th>总成本</th>
              <th>总销售额</th>
              <th>进货总数量</th>
              <th>销售量总数量</th>
              <th>退货总数量</th>
            </tr>
          </thead>
          <tbody>
            {% for Commodity_obj in Commodity_list %}
                <tr>
              <th scope="row">1</th>
              <td>{{ Commodity_obj.name}}</td>
              <td>{{ Commodity_obj.batch}}</td>
              <td>{{ Commodity_obj.inventory}}</td>
              <td>{{ Commodity_obj.cost}}</td>
              <td>{{ Commodity_obj.selling_price}}</td>
              <td>{{ Commodity_obj.quantity_in}}</td>
              <td>{{ Commodity_obj.sales_volume}}</td>
              <td>{{ Commodity_obj.return_volume}}</td>
    
            </tr>
            {% endfor %}
    
    
          </tbody>
        </table>
    {% endblock %}
    {% block new_js %}
    {% endblock %}
    

    展示删除show_del.html

    {% extends 'template.html' %}
    {% block title_text %}
        删除商品查看及还原
    {% endblock %}
    {% block new_css %}
    {% endblock %}
    {% block data %}
        <table class="table table-hover">
            <thead>
            <tr>
                <th></th>
                <th>商品名</th>
                <th>商品批号</th>
                <th>库存库存</th>
                <th>总成本</th>
                <th>总销售额</th>
                <th>进货总数量</th>
                <th>销售量总数量</th>
                <th>退货总数量</th>
                <th>是否还原</th>
            </tr>
            </thead>
            <tbody>
            {% for Commodity_obj in Commodity_list %}
                <tr>
                    <th scope="row">1</th>
                    <td>{{ Commodity_obj.name }}</td>
                    <td>{{ Commodity_obj.batch }}</td>
                    <td>{{ Commodity_obj.inventory }}</td>
                    <td>{{ Commodity_obj.cost }}</td>
                    <td>{{ Commodity_obj.selling_price }}</td>
                    <td>{{ Commodity_obj.quantity_in }}</td>
                    <td>{{ Commodity_obj.sales_volume }}</td>
                    <td>{{ Commodity_obj.return_volume }}</td>
                    <td>
                        <button class="del_button" c_id={{ Commodity_obj.id }}>还原</button>
                    </td>
    
                </tr>
            {% endfor %}
    
    
            </tbody>
        </table>
    {% endblock %}
    {% block new_js %}
        <script>
            var del_button = document.querySelectorAll('.del_button')
            for (var index = 0; index < del_button.length; index++) {
                del_button[index].onclick = function () {
                    if (confirm('是否确定还原')) {
                        var c_id = this.getAttribute('c_id');
                        $.ajax({
                            url: /show_del/,
                            type: 'post',
                            data: {
                                'c_id': c_id,
                                'csrfmiddlewaretoken': '{{csrf_token}}'
                            },
                            success: function (msg) {
                                alert(msg)
                                window.location.replace('/show_del/')
                        }
                        })
                    }
                }
            }
        </script>
    {% endblock %}
    

    五.自动生成项目目录树状图

    import os
    def dirsTree():
        PATH = os.path.dirname(__file__)
        print(PATH)
        lis = os.listdir(PATH)
        if lis != None:
            for a in lis:
                print(f'|___{a}')
                if '.' not in a:
                    a_path = os.path.join(PATH,a)
                    lis_2 = os.listdir(a_path)
                    if lis_2 != None:
                        for b in lis_2:
                            if b != '__pycache__':
                                print(f'|    |___{b}')
    if __name__ == '__main__':                  
        dirsTree()
     #弄了两级也没有用递归来做啦
    
  • 相关阅读:
    [openjudge] 2797最短前缀 Trie
    [poj]1050 To the Max dp
    [openjudge] 1455:An Easy Problem 贪心
    [poj] Catch That Cow--bfs
    = =
    dinic算法实现
    Dinic
    走进链式前向星的秘密
    树链剖分前传
    树链剖分
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11625930.html
Copyright © 2020-2023  润新知