首页 > 数据库 >[python毕业设计]免费分享一套基于Python的Django个人记账管理系统【论文+源码+SQL脚本】,帅呆了~~

[python毕业设计]免费分享一套基于Python的Django个人记账管理系统【论文+源码+SQL脚本】,帅呆了~~

时间:2024-10-15 09:46:36浏览次数:9  
标签:return form get python request 源码 毕业设计 new login

大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django个人记账管理系统,分享下哈。

项目视频演示

【免费】基于Python的Django个人理财(个人记账)管理系统 Python毕业设计_哔哩哔哩_bilibili

项目介绍

个人记账的主要对象不像企业那样,是企业的资产和资本这些大量的资金,个人的理财对大多数的人来说就是对个人收入的支配与规划。当代社会个人的收入往往就是工资,这些工资有的是以存入卡形式出现的,有的是现金形式出现的,这两种形式其实本身就为个人记账提供了很大的方便。在存卡形式出现之前,工资往往是完全以现金形式出现的,这就使得人们对收入的规划无序,大多数人遵循着“有多少,花多少”的原则,当然也有不少人利用“记账”的方式进行规划,这其实就是个人财务管理的初级表现之一。

系统展示

部分代码

{% load static %}
<!doctype html>
<html lang="en">
  <head>
       <style>
          .box{
              background: #eed3d7;
              width: 600px;
              height: 480px;
              margin:auto;
              background: rgba(255, 255, 255, 0.65);
              border-radius: 10px 10px 10px 10px;
              webkit-box-shadow: rgb(0 0 0 / 40%) 0 1px 3px, rgb(0 0 0 / 35%) 0 0 1px;
              box-shadow: 0 0 6px 2px rgb(0 0 0 / 10%);
              margin-top: 10px;
          }
          .header {
            height: 90px;
          }
          .gr{
              color: #2c3742;
              text-align: center;
              padding-top: 60px;
              font-family:"华文行楷";
              letter-spacing: 2px;
              font-size: 40px;
          }
          .dl{
            color: #fff;
            background-color: #007bff;
            border-color: #007bff;
            border-radius: 5px 5px 5px 5px;
            margin-left: 250px;
            webkit-box-shadow: rgb(0 0 0 / 40%) 0 1px 3px, rgb(0 0 0 / 35%) 0 0 1px;
              box-shadow: rgb(0 0 0 / 40%) 0 1px 3px, rgb(0 0 0 / 35%) 0 0 1px;
              margin-top: -30px;
        }
          .cw{
                color: #856404;
                background-color: #fff3cd;
                border-color: #ffeeba;
              position: relative;
                margin-bottom: 1rem;

                border-radius: 75.25rem;
          }
      </style>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- 上述meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <!-- Bootstrap CSS -->
    <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
    <link href="{% static 'login/css/login.css' %}" rel="stylesheet"/>
    <title>登录</title>
  </head>
  <body>
   <div class="header">
        <h3 class="gr">个人记账系统</h3>
    </div>
    <div class="container">
            <div class="col">
            <div class="box" style="margin-top: -30px">
                <form class="form-login" action="/login/" method="post">

                {% if login_form.captcha.errors %}
                    <div class="cw">{{ login_form.captcha.errors }}</div>
                {% elif message %}
                    <div class="cw">{{ message }}</div>
                {% endif %}

                  {% csrf_token %}
                  <h3 class="text-center">欢迎登录</h3>

                  <div class="form-group">
                    {{ login_form.uname.label_tag }}
                    {{ login_form.uname}}
                  </div>

                  <div class="form-group">
                    {{ login_form.upwd.label_tag }}
                    {{ login_form.upwd }}
                  </div>

{#                  <div class="form-group">#}
{#                    {{ login_form.captcha.label_tag }}#}
{#                    {{ login_form.captcha }}#}
{#                  </div>#}

                  <div>
                      <a href="/register/" class="text-success " ><ins>新用户注册</ins></a>
                      <button type="submit" class="dl">登录</button>
                  </div>
               

                </form>
            </div>
            </div>
    </div> <!-- /container -->

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    {#    以下三者的引用顺序是固定的#}
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>

  </body>
</html>
import random

from django.http import JsonResponse

from OAUser.models import *  # 应⽤数据库表
from django.shortcuts import render
from django.shortcuts import redirect
from pymysql import DatabaseError
from OAUser.models import Users, Income, Pay
from django.db import transaction
from . import models
from . import forms
import time
from pyecharts.charts import Bar, Pie
from pyecharts import options as opts


# Create your views here.


def index(request):
    if not request.session.get('is_login', None):
        return redirect('/login/')
    return render(request, 'login/index.html')


def personal(request):
    uid_nums = request.session['user_uid']
    user_list = Users.objects.get(uid=uid_nums);
    return render(request, 'login/personal-info.html', {
        "user": user_list,
    })


def insertRecord(request):
    if not request.session.get('is_login', None):
        return redirect('/login/')
    income_form = forms.IncomeForm(request.POST)
    if income_form.is_valid():
        iType = income_form.cleaned_data.get('iType')
        iMoney = income_form.cleaned_data.get('iMoney')
        iRemark = income_form.cleaned_data.get('iRemark')
        iTime = income_form.cleaned_data.get('iTime')
        if iType == "收入":
            models.Income.objects.create(iType=iType,
                                         iMoney=iMoney,
                                         iRemark=iRemark,
                                         iTime=iTime)
        else:
            models.Pay.objects.create(pType=iType,
                                      pMoney=iMoney,
                                      pRemark=iRemark,
                                      pTime=iTime)
    if iType == "收入":
        return redirect('/income')
    else:
        return redirect('/pay')


def income(request):
    if not request.session.get('is_login', None):
        return redirect('/login/')
    key = request.GET.get("key")
    if key is None:
        new_list = Income.objects.all()
    else:
        new_list = Income.objects.filter(iRemark__contains=key)
    page = request.GET.get("page")
    if page is None:
        page = 1
    else:
        page = int(page)
    page_count = (len(new_list) - 1) // 10 + 1
    page_count = range(1, page_count + 1)
    new_list = new_list[page * 10 - 10: page * 10]
    return render(request, 'login/income.html', locals())


def update_income(request):
    update_id = request.GET.get("iId")
    if request.method == "POST":
        new_type = request.POST.get('iType')
        new_money = request.POST.get('iMoney')
        new_remark = request.POST.get('iRemark')
        new_time = request.POST.get('iTime')
        update_obj = models.Income.objects.get(iId=update_id)
        update_obj.iType = new_type
        update_obj.iMoney = new_money
        update_obj.iRemark = new_remark
        update_obj.iTime = new_time
        update_obj.save()
        return redirect('/income/')
    ret = models.Income.objects.get(iId=update_id)
    return render(request, 'login/update_income.html', {'ret': ret})


def del_income(request):
    income_id = request.GET.get("iId")
    models.Income.objects.filter(iId=income_id).delete()
    return redirect('/income/')


def pay(request):
    if not request.session.get('is_login', None):
        return redirect('/login/')
    key = request.GET.get("key")
    if key is None:
        new_list1 = Pay.objects.all()
    else:
        new_list1 = Pay.objects.filter(pRemark__contains=key)

    page = request.GET.get("page")
    if page is None:
        page = 1
    else:
        page = int(page)
    page_count = (len(new_list1) - 1) // 10 + 1
    page_count = range(1, page_count + 1)
    new_list1 = new_list1[page * 10 - 10: page * 10]
    return render(request, 'login/pay.html', locals())


def update_pay(request):
    edit_id = request.GET.get("pId")
    if request.method == "POST":
        new_ptype = request.POST.get('pType')
        new_pmoney = request.POST.get('pMoney')
        new_premark = request.POST.get('pRemark')
        new_ptime = request.POST.get('pTime')
        edit_obj = models.Pay.objects.get(pId=edit_id)
        edit_obj.pType = new_ptype
        edit_obj.pMoney = new_pmoney
        edit_obj.pRemark = new_premark
        edit_obj.pTime = new_ptime
        edit_obj.save()
        return redirect('/pay/')
    reet = models.Pay.objects.get(pId=edit_id)
    return render(request, 'login/update_pay.html', {'reet': reet})


def del_pay(request):
    pay_id = request.GET.get("pId")
    models.Pay.objects.filter(pId=pay_id).delete()
    return redirect('/pay/')


def chart(request):
    if not request.session.get('is_login', None):
        return redirect('/login/')
    # 横坐标,表示日期
    x = []
    # 纵坐标
    y1 = []
    y2 = []
    # 最近十五天的总收入和总支出
    s1 = []
    s2 = []

    i_dir = {}
    p_dir = {}
    # 返回当前时间的时间戳(1970纪元后经过的浮点秒数)
    time_sprite = time.time()
    time_sprite -= 14 * 24 * 60 * 60
    for i in range(15):
        # 得到当前的年月日信息
        local = time.localtime(time_sprite)
        year = local.tm_year
        month = local.tm_mon
        day = local.tm_mday
        date_str = "%d-%02d-%02d" % (year, month, day)
        i_dir[date_str] = 0
        p_dir[date_str] = 0
        # 日期一天天叠加
        x.append(date_str)
        time_sprite += 24 * 60 * 60
    # 获取收入表里面的所有信息
    income_list = Income.objects.all()
    for item in income_list:
        time_str = str(item.iTime)
        # 判断收入日期是否在最近15天内,若在,则计算当天收入金额总和
        if time_str in i_dir:
            i_dir[time_str] += item.iMoney
    # 获取支出表里面的所有信息
    pay_list = Pay.objects.all()
    for item in pay_list:
        time_str = str(item.pTime)
        # 判断支出日期是否在最近15天内,若在,则计算当天支出金额总和
        if time_str in p_dir:
            p_dir[time_str] += item.pMoney

    for day in x:
        y1.append(float(i_dir[day]))
        y2.append(float(p_dir[day]))

    bar = Bar()
    bar.add_xaxis(xaxis_data=x)
    # 第一个参数是图例的名称
    bar.add_yaxis(series_name='收入', y_axis=y1)
    bar.add_yaxis(series_name='支出', y_axis=y2)
    # 添加options
    bar.set_global_opts(title_opts=opts.TitleOpts(title='最近15天的收入与支出'))
    # 生成HTML文件
    bar.render('temp.html')
    html = ""
    with open("temp.html") as f:
        html = f.read()
    html = html.split("</body>")[0]

    # 最近十五天的总收入
    s1 += y1
    # 最近十五天的总支出
    s2 += y2

    names = ['收入', sum(s1)]
    values = ['支出', sum(s2)]
    data = []
    for name,value in names, values:
        datadict = {
            'name': name,
            'value': value
        }
        data.append(datadict)
    return render(request, 'login/chart.html', locals())

@transaction.atomic
def UpdatePro(request):
    """接收参数"""
    uame = request.GET.get('uname')
    upwd = request.GET.get('upwd')
    uemail = request.GET.get('uemail')
    utel = request.GET.get('utel')

    try:
        user = Users.objects.filter(uname__exact=uame).first()
        user.uname = uame
        user.upwd = upwd
        user.uemail = uemail
        user.utel = utel
        user.save()
    except DatabaseError as e:
        print(e)

    return redirect("/personal/")


def login(request):
    if request.session.get('is_login', None):  # 不允许重复登录
        return redirect('/index/')
    if request.method == 'POST':
        login_form = forms.UserForm(request.POST)
        message = '请检查填写的内容!'
        if login_form.is_valid():
            uname = login_form.cleaned_data.get('uname')
            upwd = login_form.cleaned_data.get('upwd')

            try:
                user = models.Users.objects.get(uname=uname)
            except:
                message = '用户不存在!'
                return render(request, 'login/login.html', locals())

            if user.upwd == upwd:
                request.session['is_login'] = True
                request.session['user_uid'] = user.uid
                request.session['user_uname'] = user.uname
                return redirect('/index/')
            else:
                message = '密码不正确!'
                return render(request, 'login/login.html', locals())
        else:
            return render(request, 'login/login.html', locals())

    login_form = forms.UserForm()
    return render(request, 'login/login.html', locals())


def register(request):
    if request.session.get('is_login', None):
        return redirect('/login/')

    if request.method == 'POST':
        register_form = forms.RegisterForm(request.POST)
        message = "请检查填写的内容!"
        if register_form.is_valid():
            uname = register_form.cleaned_data.get('uname')
            upwd1 = register_form.cleaned_data.get('upwd1')
            upwd2 = register_form.cleaned_data.get('upwd2')
            uemail = register_form.cleaned_data.get('uemail')
            utel = register_form.cleaned_data.get('utel')
            usex = register_form.cleaned_data.get('usex')

            if upwd1 != upwd2:
                message = '两次输入的密码不同!'
                return render(request, 'login/register.html', locals())
            else:
                same_name_user = models.Users.objects.filter(uname=uname)
                if same_name_user:
                    message = '用户名已经存在'
                    return render(request, 'login/register.html', locals())
                same_email_user = models.Users.objects.filter(uemail=uemail)
                if same_email_user:
                    message = '该邮箱已经被注册了!'
                    return render(request, 'login/register.html', locals())
                print(uname, upwd1, uemail, utel, usex)
                models.Users.objects.create(uname=uname,
                                            upwd=upwd1,
                                            uemail=uemail,
                                            utel=utel,
                                            usex=usex)
                return redirect('/login/')
        else:
            return render(request, 'login/register.html', locals())
    register_form = forms.RegisterForm()
    return render(request, 'login/register.html', locals())


def logout(request):
    if not request.session.get('is_login', None):
        # 如果本来就未登录,也就没有登出一说
        return redirect("/login/")
    request.session.flush()
    # 或者使用下面的方法
    # del request.session['is_login']
    # del request.session['user_id']
    # del request.session['user_name']
    return redirect("/login/")

源码代码

链接:https://pan.baidu.com/s/1thU435rZutKGLcw-l58BKQ 
提取码:1234

标签:return,form,get,python,request,源码,毕业设计,new,login
From: https://blog.csdn.net/caoli201314/article/details/142921246

相关文章

  • python使用smtp发送邮件
    python使用smtp发送邮件一、概述与发送邮件相关的Python模块:smtplib是关于SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。email简单来说,即服务器之间通信的信息,包括信息头、信息主体等等。举个简单的例子,当你登录邮箱,写好邮件......
  • 用python、JavaScript、JAVA等多种语言的实例代码演示教你如何免费获取股票数据(实时数
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • 基于SpringBoot+vue的社区流浪动物救助系统(源码+文档+部署讲解等)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • Python编程、机器学习与深度学习技术——建议收藏!附代码!
    原文链接:Python编程、机器学习与深度学习技术——建议收藏!附代码!https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247622086&idx=4&sn=a2e310ea4b6e8a40de2fc683215e839b&chksm=fa825c21cdf5d537c8ef826df48d5e4791c48eda7bc53733a14dfaa67613dc76842db5da7104&token=......
  • java计算机毕业设计创意产业园区管理(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着创意产业的蓬勃发展,创意产业园区作为产业集聚和创新的重要载体,日益成为推动区域经济增长和文化创新的关键力量。然而,传统的管理方式已难以满足当......
  • java计算机毕业设计公司资产(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今快速发展的商业环境中,企业对于资产管理的重视程度日益加深。随着公司规模的扩大和业务范围的拓展,各类资产的管理变得愈发复杂。传统的人工管理......
  • java计算机毕业设计大学生租房系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及和城市化进程的加速,大学生群体逐渐成为城市租房市场中的重要组成部分。然而,传统的租房方式往往存在信息不对称、中介费用高昂、房......
  • java计算机毕业设计本校招聘网站(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网的广泛普及,高校毕业生就业问题已成为社会各界关注的焦点。传统的招聘方式存在信息不对称、招聘效率低等问题,难以满足......
  • Python中的pool.map函数:高效处理数据与计算任务
    在Python中,map()函数是一个非常实用的工具,它能对序列(如列表、元组等)进行映射操作,将一个函数作用于序列中的每个元素,并将结果组成一个新的序列返回。在一些大规模的数据处理和计算任务中,我们往往需要对大量数据进行高效的处理。这时,map()函数就显得尤为重要,而它的一个实现——pool.......
  • 针对不同类型的数据,哪些Python可视化库更适合处理时间序列数据?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......