前几天遇到一个计算量稍大的一个项目
测试环境机器配置:
i5-12600KF
海盗船 16G*2 3200 但是不知道咋回事 当前是2133 测完再看吧
金士顿 SNV2S1000G (固态硬盘)
啥玩意儿 RTX3060 12G
业务逻辑
它的用户奖励机制大概如下:
用户使用A积分 兑换 B冻结积分
1000积分 兑换成 2000冻结积分
冻结积分每日按照百分之5 转化为 百分之80的红积分、百分之20的绿积分
解冻之前,判断本人的 手续费是否足够,按照百分之10的比例计算
扣除手续费=当日解冻积分*0.1
如果手续费足够就解冻积分并扣除手续费并写解冻日志
否则不解冻,且写解冻日志
当日解冻=总冻结 * 解冻比例
当日扣除手续费 = 当日解冻 * 扣手续费比例
发放状态 = 0
if 手续费余额 > 当日扣除手续费 :
当日红积分 = 当日解冻 * 红积分百分比
当日绿积分 = 当日解冻 * 绿积分百分比
增加红积分
增加绿积分
减少冻结积分
减少手续费
写入日志
发放状态 = 1
else:
写入失败日志
if 发放状态 == 1:
循环找上级,然后解冻奖励
然后,在本人解冻的时候
推荐人 根据 它自身的推荐等级 享受 下级的解冻的百分比额外解冻
然后推荐人的推荐人按比例 向上循环计算额外解冻发放
ok 脑子差不对是浆糊了,整理字段 开整
下面流程是从0开始新建 便于初学新人,如果您想直接看硬货 ,辛苦动动小手按目录跳转吧
准备工作
本次测试是使用python、flask、mysql进行开发
orm是使用的flask_sqlalchemy
首先是给chatgpt调教的基础指令
前两天简单些过一点点 有兴趣的可以查看 :
一步一步教你调教 ChatGPT生成你的代码之python篇
但是本次项目要具体的多,所以在哪基础上增加更多的条件使chatgpt更加的符合我们的要求
初始调教语句:
我需要你的帮助,需要用你专业的软件开发经验协助我完成一些代码的编写,
本次项目是是用python、flask、mysql、进行开发,额外需要使用的还有:flask_sqlalchemy、cors
我需要将代码文件分为app.py、models.py、api.py
在新建表的时候我会给你表字段,需要你给我对应的 建表sql 和models的class和to_dict方法,还需要显式的指定表名
表字段名请使用英文,需要避开系统保留词,记得把字段的中文意思保存到字段注释
我一直使用的3.5的模型感觉还够用吧
开始敲码子
项目代码结构初始化,以及用户表
我们先来创建用户表,字段如下:
id、推荐人id、手机号、密码、openid、状态、分销等级、推荐关系等级、余额、积分、冻结积分、手续费、绿积分、红积分
记得我上面说的记得写入注释
因为它有点粗心,所以首次生成的时候没有保留到中文注释,后来又加一句就好了
回复如下:
好的,我会为用户表创建相应的建表 SQL 和模型类,并在注释中包含字段的中文意思以及小数位数的要求。首先,让我们定义这个用户表的建表 SQL:
CREATE TABLE IF NOT EXISTS user (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
referrer_id INT COMMENT '推荐人ID',
phone_number VARCHAR(255) NOT NULL COMMENT '手机号',
password VARCHAR(255) NOT NULL COMMENT '密码',
openid VARCHAR(255) COMMENT 'OpenID',
status INT COMMENT '状态',
distribution_level INT COMMENT '分销等级',
relationship_level INT COMMENT '推荐关系等级',
balance DECIMAL(10, 4) COMMENT '余额',
points DECIMAL(10, 4) COMMENT '积分',
frozen_points DECIMAL(10, 4) COMMENT '冻结积分',
fee DECIMAL(10, 4) COMMENT '手续费',
green_points DECIMAL(10, 4) COMMENT '绿积分',
red_points DECIMAL(10, 4) COMMENT '红积分'
);
接下来,我将为用户表创建一个 Python 模型类,并在注释中包含字段的中文意思:
# models.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, comment='用户ID')
referrer_id = db.Column(db.Integer, comment='推荐人ID')
phone_number = db.Column(db.String(255), nullable=False, comment='手机号')
password = db.Column(db.String(255), nullable=False, comment='密码')
openid = db.Column(db.String(255), comment='OpenID')
status = db.Column(db.Integer, comment='状态')
distribution_level = db.Column(db.Integer, comment='分销等级')
relationship_level = db.Column(db.Integer, comment='推荐关系等级')
balance = db.Column(db.Numeric(10, 4), comment='余额')
points = db.Column(db.Numeric(10, 4), comment='积分')
frozen_points = db.Column(db.Numeric(10, 4), comment='冻结积分')
fee = db.Column(db.Numeric(10, 4), comment='手续费')
green_points = db.Column(db.Numeric(10, 4), comment='绿积分')
red_points = db.Column(db.Numeric(10, 4), comment='红积分')
def to_dict(self):
return {
'id': self.id,
'referrer_id': self.referrer_id,
'phone_number': self.phone_number,
'openid': self.openid,
'status': self.status,
'distribution_level': self.distribution_level,
'relationship_level': self.relationship_level,
'balance': float(self.balance),
'points': float(self.points),
'frozen_points': float(self.frozen_points),
'fee': float(self.fee),
'green_points': float(self.green_points),
'red_points': float(self.red_points)
}
这是用户表的建表 SQL 和模型类,包含了字段的中文注释和小数位数的要求。你可以将上述代码添加到相应的文件中,并继续开发你的 Flask 应用程序。如果需要创建其他表或有其他问题,随时告诉我。
然后继续向他要代码:
继续给我app.py和api.py部分的代码
在api.py里 写一个 新建用户的api
我会post新创建用户的数量,
你根据我的要求 创建对应数量的用户
如果数据表里没有用户则创建一个初始用户,账号:18140208525 密码:123456 状态1 推荐人id:0 等级都为1 其他都为99999
其他用户 手机号使用随机但是不能和当前数据重复、密码默认123456、推荐人id使用数据库内用户id中的随机一个
用户状态默认为1、用户等级为0-5之间随机数、推荐关系等级默认0
余额、积分、冻结积分、手续费、绿积分、红积分 随机0-99999
给出的app.py如下:
# app.py
from flask import Flask
from flask_cors import CORS
from models import db
from api import app as api_app # 导入 api.py 中的 Flask 应用实例
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://your_username:your_password@localhost/your_database'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
CORS(app)
# 注册 API 蓝图
app.register_blueprint(api_app)
if __name__ == '__main__':
app.run()
然后是:
# api.py
import time
import random
from flask import request, jsonify, Blueprint
from models import db, User
app = Blueprint('api', __name__)
@app.route('/create_users', methods=['POST'])
def create_users():
try:
start_time = time.time()
data = request.get_json()
num_users = data['num_users']
if num_users <= 0:
return jsonify({'message': 'Number of users must be greater than 0'}), 400
# Create an initial user if the table is empty
if User.query.count() == 0:
initial_user = User(
phone_number='18140208525',
password='123456',
status=1,
referrer_id=0,
distribution_level=1,
relationship_level=0,
balance=random.uniform(0, 99999),
points=random.uniform(0, 99999),
frozen_points=random.uniform(0, 99999),
fee=random.uniform(0, 99999),
green_points=random.uniform(0, 99999),
red_points=random.uniform(0, 99999)
)
db.session.add(initial_user)
# Get all existing user IDs
user_ids = [user.id for user in User.query.all()]
# Generate and add random users
for _ in range(num_users):
new_user = User(
phone_number=str(random.randint(10000000000, 99999999999)),
password='123456',
status=1,
referrer_id=random.choice(user_ids), # Random referrer from existing users
distribution_level=random.randint(0, 5),
relationship_level=0, # Default to 0
balance=random.uniform(0, 99999),
points=random.uniform(0, 99999),
frozen_points=random.uniform(0, 99999),
fee=random.uniform(0, 99999),
green_points=random.uniform(0, 99999),
red_points=random.uniform(0, 99999)
)
db.session.add(new_user)
db.session.commit()
# 记录结束时间
end_time = time.time()
# 计算执行时间
execution_time = end_time - start_time
return jsonify({'message': f'{num_users} 个用户创建完毕', 'TIME:': f"代码执行时间为:{execution_time} 秒"}), 201
except Exception as e:
return jsonify({'error': str(e)}), 500
上面的代码经过简单修改(增加计时功能)后运行如下:
用户生成数据速度测试
然后经过一些简单测试后得出如下数据
{
“TIME:”: “代码执行时间为:0.02700066566467285 秒”,
“message”: “10 个用户创建完毕”
}
{
“TIME:”: “代码执行时间为:0.1758420467376709 秒”,
“message”: “100 个用户创建完毕”
}
{
“TIME:”: “代码执行时间为:1.6590464115142822 秒”,
“message”: “1000 个用户创建完毕”
}
{
“TIME:”: “代码执行时间为:16.40705704689026 秒”,
“message”: “10000 个用户创建完毕”
}
{
“TIME:”: “代码执行时间为:164.3725016117096 秒”,
“message”: “100000 个用户创建完毕”
}
然后发现一些小问题,
就是它注册的时候 推荐人的id是本次任务提交时 之前的用户id列表内随机
而不是创建用户时现查的,所以把它改到内部 再次测试
果然一下就蚌住了,因为当前库里以及有10w+用户
{
“TIME:”: “代码执行时间为:27.823791980743408 秒”,
“message”: “10 个用户创建完毕”
}
算了 还是改回去吧,反正只是数据填充使用
改回去后:
{
“TIME:”: “代码执行时间为:2.807732343673706 秒”,
“message”: “10 个用户创建完毕”
}
此时的数据条数:
正在显示第 0 - 24 行 (共 111153 行, 查询花费 0.0002 秒。)
未完待续。。。。 这本来是2023-09-17 日的稿子