分享一套【优质Python源码】基于Python的Django个人理财(个人记账)管理系统

0 阅读5分钟

大家好,我是python222_小锋老师,分享一套优质的基于Python的Django个人理财(个人记账)管理系统  。  

5.jpg

项目简介

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

源码下载

链接: pan.baidu.com/s/1zRCqaEIZ…

提取码: 1234

相关截图

image.png

6.jpg

3.jpg

4.jpg

核心代码

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/")