python:django项目知识点02——搭建简易授权码核销系统

前言

        如标题所述,本篇博客主要围绕快速搭建业务系统展开,旨在:快速、逻辑分明

 

适用对象

        django+mysql,实现一套授权码核销功能,包含用户登录和授权码核销两个方面内容

业务代码

        前述

        基础代码已在上篇博客中讲述,这里给出核心views代码和html代码

        python:django项目知识点01——前期配置、用户管理、权限核验、django-orm-CSDN博客

        最终效果 

 

 

        登录

login.pyfrom django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth import authenticate, logindef user_input_check(username, password):message = ''if len(username) > 16:message = "用户名不得超过16位!"elif len(password) < 6:message = "密码不得少于6位!"elif len(password) > 16:message = "密码不得超过16位!"if message:return False, messageelse:return True, ''def login_view(request):if request.method == 'POST':username = request.POST['username']password = request.POST['password']ret, msg = user_input_check(username, password)if ret:user = authenticate(request, username=username, password=password)if user:login(request, user)return redirect('/welcome')  # 替换 'welcome' 为你应用的主页视图名else:messages.error(request, "用户名或密码错误!")else:messages.error(request, msg)return render(request, 'user/login.html')
login.html<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title><link rel="stylesheet" href="/static/css/form_add.css">
</head>
<body><div class="container"><div class="form-wrapper"><h2>用户登录</h2>{% if messages %}<ul class="messages">{% for message in messages %}<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>{% endfor %}</ul>{% endif %}{% if form.errors %}<div class="errors"><ul>{% for field in form %}{% for error in field.errors %}<li>{{ error }}</li>{% endfor %}{% endfor %}{% for error in form.non_field_errors %}<li>{{ error }}</li>{% endfor %}</ul></div>{% endif %}<form method="post">{% csrf_token %}<div class="form-group"><label for="username">用户名</label><input type="text" name="username" id="username" required></div><div class="form-group"><label for="password">密码</label><input type="password" name="password" id="password" required></div><button type="submit">登录</button></form></div></div>
</body>
</html>
body {font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;
}
.container {background: #fff;padding: 2rem;border-radius: 8px;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);max-width: 500px;width: 100%;
}
h1 {margin-bottom: 1rem;font-size: 24px;color: #333;
}
.form-group {margin-bottom: 1rem;
}
.form-group label {display: block;margin-bottom: 0.5rem;font-weight: bold;color: #555;
}
.form-group input,
.form-group select,
.form-group textarea {width: 100%;padding: 0.75rem;border: 1px solid #ccc;border-radius: 4px;box-sizing: border-box;
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {border-color: #007bff;outline: none;
}
.form-group .error {color: #e74c3c;font-size: 0.875rem;margin-top: 0.25rem;
}
button {background-color: #007bff;color: #fff;border: none;padding: 0.75rem 1.5rem;border-radius: 4px;cursor: pointer;font-size: 16px;transition: background-color 0.3s;
}
button:hover {background-color: #0056b3;
}

         

        授权码核销

permission.pyimport datetime
import json
from django.http import JsonResponse
from django.shortcuts import render, redirect
from django.conf import settings
from myProject.models.mysql_models import TmLicense, TmAccount, TmAccountLog, raw_sql_selectdef permission_view(request):if not request.user.is_authenticated:# 用户未登录,重定向到登录页面或显示提示return redirect('login')if request.method == 'GET':username = request.user.username# 将结果转换为字典列表results = raw_sql_select("""SELECT a.username as username, a.account_id as account_id, b.dict_value as user_state, c.account_money as account_money, c.lock_money as lock_money, d.dict_value as account_stateFROM tp_user aLEFT JOIN tb_dict b ON a.state = b.dict_id AND b.dict_type = 'user_state'LEFT JOIN tm_account c ON a.account_id = c.account_idLEFT JOIN tb_dict d ON c.state = d.dict_id AND d.dict_type = 'account_state'WHERE a.username = %s""", [username])[0]# 用户已登录,处理登录用户的逻辑return render(request, 'user/permission.html',context={'back_url': settings.WELCOME_URL, 'user': results})elif request.method == 'POST':# 解析 JSON 数据comes = json.loads(request.body)license_code = comes['license_code']account_id = comes['account_id']# 查询当前账户状态account_msg = TmAccount.objects.filter(account_id=account_id).values('state', 'account_money').get()account_state = account_msg['state']account_money = account_msg['account_money']# 当账户可用时if account_state == 1:# 查询该授权码是否正常在用# 之后的代码都是按照约定状态默认值来的,没有借助字典表# 因此这里借助字典表来判别验证码状态的情况 存在设计问题# 这点留给自己做警醒:考虑用哪种策略后,就不要东一道西一道了,要尽量保障代码逻辑一致性license_msg = raw_sql_select("""select a.save_money as save_money, b.dict_value as license_statefrom tm_license ajoin tb_dict b on a.state = b.dict_id and b.dict_type = 'license_state'where a.license_code = %s""", [license_code])print(license_msg)if not license_msg:return JsonResponse({'status': False, 'msg': '授权码不存在'})license_msg = license_msg[0]if license_msg['license_state'] == '待使用':after_money = account_money + license_msg['save_money']# 添加核销记录log_entry = TmAccountLog(order_effect_ret=0,reason=f'license recharge: {license_code}',account_id=account_id,effect=license_msg['save_money'],before=account_money,after=after_money,create_time=datetime.datetime.now())log_entry.save()# 核销授权码license_updated = TmLicense.objects.filter(license_code=license_code).update(state=2)if license_updated:# 账户余额更新account_updated = TmAccount.objects.filter(account_id=account_id).update(account_money=after_money)if account_updated:return JsonResponse({'status': True, 'msg': '成功!'})# 账户更新失败则回滚授权码状态为待用else:TmLicense.objects.filter(license_code=license_code).update(state=1)return JsonResponse({'status': False, 'msg': '账户异常!'})return JsonResponse({'status': False, 'msg': '授权码核销失败!'})else:return JsonResponse({'status': False, 'msg': '授权码已失效'})
permission.html<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="/static/css/user_permission.css"><meta name="csrf-token" content="{% csrf_token %}"><title>用户授权</title><style>body {font-family: Arial, sans-serif;margin: 0;padding: 0;background-color: #f4f4f4;color: #333;}.container {width: 80%;max-width: 800px;margin: 20px auto;background: #fff;padding: 20px;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}h1 {text-align: center;color: #007bff;}</style>
</head>
<body><div class="container"><h1>授权详情</h1><!-- 用户信息部分 --><div class="info-section"><h2>用户名</h2><p>{{ user.username }}</p></div><div class="info-section"><h2>用户状态</h2><p>{{ user.user_state }}</p></div><div class="info-section"><h2>账户状态</h2><p>{{ user.account_state }}</p></div><div class="info-section"><h2>钱包余额</h2><p style="color: goldenrod">¥ {{ user.account_money }}</p></div><div class="info-section"><h2>冻结金额</h2><p style="color: red">¥ {{ user.lock_money }}</p></div><!-- 授权码提交表单 --><div class="form-container"><h2>提交授权码</h2><input name="account_id" id="account_id" value="{{ user.account_id }}" hidden/><div class="form-group"><label for="auth-code">授权码</label><input type="text" id="license_code" name="license_code" required></div><div class="form-group"><button onclick="upMsg()">提交</button></div></div></div></body><script>function upMsg() {var license_code = document.getElementById("license_code").value;var account_id = document.getElementById("account_id").value;if (license_code === "") {alert("请填写完整内容");return false; // 阻止表单提交}var jsonData = JSON.stringify({"license_code": license_code,"account_id": account_id,});fetch('', {method: 'POST',headers: {'Content-Type': 'application/json','X-CSRFToken': csrfToken // 添加 CSRF 令牌到请求头中},body: jsonData}).then(response => response.json()).then(data => {if (data.status === true) {alert("已充值")window.location.reload()} else {alert("提交失败: " + data.msg);}}).catch(error => {console.error('提交失败:', error);alert("提交失败: " + error);});}
</script>
</html>
user_permission.css.info-section {margin-bottom: 20px;
}
.info-section h2 {margin-bottom: 10px;font-size: 1.2em;color: #555;
}
.info-section p {font-size: 1.1em;margin: 5px 0;
}
.form-container {margin-top: 20px;
}
.form-container h2 {margin-bottom: 10px;font-size: 1.2em;color: #555;
}
.form-group {margin-bottom: 15px;
}
.form-group label {display: block;margin-bottom: 5px;font-weight: bold;
}
.form-group input[type="text"] {width: 100%;padding: 10px;font-size: 1em;border: 1px solid #ddd;border-radius: 4px;
}
.form-group button {background-color: #007bff;border: none;color: white;padding: 10px 20px;text-align: center;text-decoration: none;display: inline-block;font-size: 1em;margin-top: 10px;cursor: pointer;border-radius: 4px;
}
.form-group button:hover {background-color: #0056b3;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147859.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3:provide-inject实现组件通信

目录 一.作用 1.跨层级通信 2.避免重复声明 3.封装通用服务 二.性质 1.非响应式 2.不可选项 3.高级用法 三.使用 1.爷组件 2.父组件 3.子组件 四.代码 1.爷组件代码 2.父组件代码 3.子组件代码 五.效果 Vue3中的provide-inject机制是用于在组件树中进行依赖注…

01【MATLAB】最小二乘系统辨识

目录 1.系统辨识的定义及其分类 1.1 系统辨识的定义 1.2 系统辨识的分类 2.参数模型 3.系统辨识的步骤 一、最小二乘法&#xff08;Least Squares Method&#xff09;一般步骤 二、LSM原理及应用 三、LSM在控制系统建模中的应用 1.系统辨识的定义及其分类 1.1 系统辨识的…

有没有适合初学者的 OpenLayers 项目实战案例推荐?

对于初学者来说&#xff0c;OpenLayers 提供了一系列实用的项目实战案例&#xff0c;可以帮助你快速上手并掌握关键的开发技能。以下是一些推荐的入门项目案例&#xff1a; 1.基础地图显示&#xff1a; 学习如何创建一个简单的地图视图&#xff0c;并加载基础的地图图层&…

19个邮件群发小技巧,最大水平充分利用邮件营销

邮件群发在现代通信中占据着非常重要的位置。无论是在商业环境还是个人生活中&#xff0c;它都有着广泛的应用。无论您是公司的市场推广专家&#xff0c;还是社交团体的筹办者&#xff0c;掌握有效的邮件群发技巧会帮助您更好地传递信息、节约时间和提升工作效率。 确定目标受众…

DK5V100R20S双引脚同步整流芯片12V 2.4A封装SM-7

高性能双引脚同步整流芯片 DK5V100R20S是一款简单高效率的同步整流芯片&#xff0c;只有A&#xff0c;K两个引脚&#xff0c;分别对应肖特基二极管PN管脚。芯片内部集成了100V功率NMOS管&#xff0c;可以大幅降低二极管导通损耗&#xff0c;提高整机效率&#xff0c;取代或替换…

Debian安装mysql遇到的问题解决及yum源配置

文章目录 一、安装mysql遇到的问题解决二、Debain系统mysql8.0的安装以及远程连接三、彻底卸载软件四、Python 操作 mysql五、debian软件源source.list文件格式说明1. 第一部分2. 第二部分3. 第三部分4. 第四部分5. 关于源的混用问题6. 按需修改自己的sources.list7. 更新软件包…

详解运行时安全检测神器:Falco

在当今快速发展的云计算和容器技术时代,安全已成为组织面临的一大挑战。随着云原生应用的普及,传统的安全措施已不足以应对复杂的分布式环境。在这样的背景下,Falco应运而生,成为云原生安全领域的一颗新星。目前在github中&#xff0c;该项目已经拥有了7.3k的star&#xff0c;众…

显示和隐藏图片【JavaScript】

使用 JavaScript 来实现显示和隐藏图片。下面是一个简单的示例&#xff0c;展示如何通过按钮点击来切换图片的可见性。 实现效果: 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name&…

Sample Packing:长序列 LLM 训练的 Attention 问题及优化

一、背景 之前看过部分 Megatron-LM 的源码&#xff0c;也详细分析过对应的 Dataset 和 DataLoader&#xff0c;想当然的认为在 LLM 预训练时会使用 Document Level 的 Mask&#xff0c;也就是常说的 Sample Packing 技术。最近我们在做长序列训练相关工作时发现并非如此&…

灰狼算法求解函数,MATLAB代码

目录 程序说明 概述 主要功能 关键函数 结论 程序说明 概述 该程序实现了灰狼优化算法&#xff08;GWO&#xff09;&#xff0c;用于求解优化问题。该算法模拟灰狼的捕猎行为&#xff0c;通过种群搜索找到最优解。程序中定义了种群数量、问题维度、变量上下界和适应度函…

全行业商家0退货0退款一键卖全球,淘天助力卖家拓展海外生意!

今年7月中旬&#xff0c;淘宝推出了“大服饰全球包邮计划”&#xff0c;在服饰行业先行先试&#xff0c;带领商家拓展海外市场。计划推出以来&#xff0c;吸引了数十万服饰商家报名参与&#xff0c;包括天猫商家蕉下、淘宝商家JOC、美洋等。有服饰商家怀着试一试的心态报了名&a…

碳课堂|CBAM的制度及核心内容

引言 全球变暖和气候变化是21世纪面临的最严峻挑战之一。为应对这一全球性问题&#xff0c;各国纷纷采取措施&#xff0c;减少温室气体排放&#xff0c;并推动可持续发展。其中&#xff0c;欧盟提出的碳边界调整机制&#xff08;CBAM, Carbon Border Adjustment Mechanism&…

pr视频剪辑、福昕剪辑……四款剪辑视频大比拼

最近入了视频剪辑的坑&#xff0c;我最近在尝试不同的视频剪辑软件&#xff0c;想找到最适合我的那一款。今天&#xff0c;我就来跟大家分享一下我使用福昕视频剪辑、爱拍视频剪辑、Adobe Premiere&#xff08;简称PR&#xff09;和Shotcut这四款软件时的一些体验和感受。希望我…

FPGA_传递参数的方式

FPGA Verilog 调用模块后带有 “ #()” 的含义 最后4个LED闪烁控制模块的例化,它们的源码都是 led_controller.v 模块&#xff0c;但它们的名称不一样,分别为“uut_led_controller_clk12m5 ”&#xff0c;“uut_led_controller_clk25m”&#xff0c;“uut_ledcontroller clk50…

Pandas -----------------------基础知识(二)

dataframe读写数据操作 import pandas as pd# 准备数据(字典) data [[1, 张三, 1999-3-10, 18],[2, 李四, 2002-3-10, 15],[3, 王五, 1990-3-10, 33],[4, 隔壁老王, 1983-3-10, 40] ]df pd.DataFrame(data, columns[id, name, birthday, age]) df写到csv文件中 &#xff0c;…

Azure Pipeline 常用任务记录

各种任务的查询&#xff1a; 任务查询 下载类 1 DownloadPackage1 从 Azure Artifacts 中的包管理源下载包 2 DownloadSecureFile1 下载安全文件&#xff0c;这里的安全文件在Library中上传&#xff0c;默认的位置会传到$(Agent.TempDirectory) 3 DownloadBuildArtifacts1…

shopify主题开发中给产品页设置多个模板

在shopify开发中&#xff0c;有时候商家可能需要为不同的产品去设置自己想要的产品页模板。下面主要教大家如何为产品类型页面设置多个模板&#xff0c;大家只要按照下面几个步骤就可以轻松实现产品的定制化页面&#xff1a; 1、首先在定制器创建产品模板 进入商品自定义页面…

【LangChain系列】实战案例5:用LangChain实现灵活的Agents+RAG,该查时查,不该查时就别查

目前为止&#xff0c;我们实现的RAG练习中&#xff0c;答案都是全部来源于检索到的文本内容。而检索过程可能在某些情况下是不需要的。 如何优化这个过程&#xff0c;让我们的RAG程序在必要时才去检索&#xff0c;不必要时&#xff0c;直接使用大模型原有数据来回答呢&#xf…

M2型TAM靶向肽CRV; Ahx-CRVLRSGSC ;

【M2型TAM靶向肽CRV 简介】 M2型TAM靶向肽CRV是一种用于靶向肿瘤相关巨噬细胞&#xff08;TAMs&#xff09;中M2型亚群的多肽。这种多肽序列为CRVLRSGSC&#xff0c;包含一对二硫键&#xff0c;其三字母代码为Cys-Arg-Val-Leu-Arg-Ser-Gly-Ser-Cys&#xff08;Cys-Cys&#xff…

什么是json?

JSON简介:JSON的全称为JavaScript Object Nation(JavaScript 对象表示语法)&#xff0c;基于 ECMAScript&#xff0c;存放的是的类似于键值对&#xff0c;本质上来说是javascript的数据类型&#xff0c;是一种轻量级的数据交互格式&#xff0c;简单来说呢&#xff0c;json就是一…