本文所有步骤均可直接复制执行,无额外依赖要求,全程无需复杂配置。
提前启动MySQL服务,执行以下完整建表SQL:
``` -- 1. 用户积分主表 CREATE TABLE `user_integral` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '用户ID', `total_integral` int(11) NOT NULL DEFAULT 0 COMMENT '累计总积分', `available_integral` int(11) NOT NULL DEFAULT 0 COMMENT '可用积分', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 2. 积分明细表 CREATE TABLE `integral_detail` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `type` tinyint(1) NOT NULL COMMENT '1=消费加积分 2=签到加积分 3=兑换减积分', `amount` int(11) NOT NULL COMMENT '积分变化量,加为正减为负', `order_id` varchar(32) DEFAULT NULL COMMENT '关联订单ID', `expire_time` datetime DEFAULT NULL COMMENT '积分过期时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_expire_time` (`expire_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 3. 积分规则表 CREATE TABLE `integral_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT, `rule_code` varchar(20) NOT NULL, `rule_name` varchar(50) NOT NULL, `value` int(11) NOT NULL, `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1=启用 0=停用', PRIMARY KEY (`id`), UNIQUE KEY `idx_rule_code` (`rule_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```必须确保MySQL账号拥有建表权限,所有字段无需修改直接执行即可。
提前安装依赖:```pip install flask pymysql```

新建app.py,写入以下完整代码:
``` from flask import Flask, request, jsonify import pymysql from datetime import datetime, timedelta app = Flask(__name__) 数据库核心配置 DB_CONFIG = { 'host': 'localhost', 'user': 'root', 'password': '你的MySQL密码', 'database': '你的自定义数据库名', 'charset': 'utf8mb4' } 数据库连接工具 def get_db_conn(): return pymysql.connect(DB_CONFIG) 1. 消费加积分接口 @app.route('/api/integral/consume', methods=['POST']) def add_consume_integral(): 必须校验用户ID,非法请求直接拒绝 user_id = request.headers.get('X-User-Id') if not user_id: return jsonify({'code':400, 'msg':'缺少用户ID'}),400 接收订单金额 order_amount = request.json.get('order_amount',0) if order_amount <=0: return jsonify({'code':400, 'msg':'订单金额无效'}),400 计算积分,单笔最高100分 add_integral = min(int(order_amount),100) if add_integral ==0: return jsonify({'code':200, 'msg':'无积分可加', 'data':{}}) conn = get_db_conn() try: with conn.cursor() as cur: 更新用户积分 cur.execute(""" INSERT INTO user_integral (user_id, total_integral, available_integral) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE total_integral = total_integral + VALUES(total_integral), available_integral = available_integral + VALUES(available_integral) """, (user_id, add_integral, add_integral)) 插入积分明细,设置1年过期 expire_time = datetime.now() + timedelta(days=365) cur.execute(""" INSERT INTO integral_detail (user_id, type, amount, order_id, expire_time) VALUES (%s,1,%s,%s,%s) """, (user_id, add_integral, request.json.get('order_id'), expire_time)) conn.commit() return jsonify({'code':200, 'msg':'积分添加成功', 'data':{'add_integral':add_integral}}) except Exception as e: conn.rollback() return jsonify({'code':500, 'msg':f'系统错误:{str(e)}'}),500 finally: conn.close() 2. 签到加积分接口 @app.route('/api/integral/sign', methods=['POST']) def sign_in(): user_id = request.headers.get('X-User-Id') if not user_id: return jsonify({'code':400, 'msg':'缺少用户ID'}) conn = get_db_conn() try: with conn.cursor() as cur: 校验今日是否已签到 today = datetime.now().strftime('%Y-%m-%d') cur.execute("SELECT id FROM integral_detail WHERE user_id=%s AND type=2 AND DATE(create_time)=%s", (user_id, today)) if cur.fetchone(): return jsonify({'code':400, 'msg':'今日已签到'}) 计算连续签到积分 cur.execute("SELECT COUNT() FROM integral_detail WHERE user_id=%s AND type=2 AND create_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)", (user_id,)) consecutive_days = cur.fetchone()[0] add_integral =5 + (10 if consecutive_days>=7 else 0) 更新积分 cur.execute(""" INSERT INTO user_integral (user_id, total_integral, available_integral) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE total_integral = total_integral + VALUES(total_integral), available_integral = available_integral + VALUES(available_integral) """, (user_id, add_integral, add_integral)) 插入签到明细 cur.execute("INSERT INTO integral_detail (user_id, type, amount) VALUES (%s,2,%s)", (user_id, add_integral)) conn.commit() return jsonify({'code':200, 'msg':'签到成功', 'data':{'add_integral':add_integral}}) except Exception as e: conn.rollback() return jsonify({'code':500, 'msg':f'错误:{str(e)}'}) finally: conn.close() 3. 积分兑换抵扣券接口 @app.route('/api/integral/exchange', methods=['POST']) def exchange_voucher(): user_id = request.headers.get('X-User-Id') if not user_id: return jsonify({'code':400, 'msg':'缺少用户ID'}) need_integral =100 conn = get_db_conn() try: with conn.cursor() as cur: 校验可用积分 cur.execute("SELECT available_integral FROM user_integral WHERE user_id=%s", (user_id,)) result = cur.fetchone() if not result or result[0]以Web端调用为例,直接复制即可适配微信小程序、H5等前端场景:
``` // 消费加积分调用 function addOrderIntegral(orderId, amount, userId) { fetch('http://你的服务器IP:5000/api/integral/consume', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-User-Id': userId }, body: JSON.stringify({ order_id: orderId, order_amount: amount }) }).then(res=>res.json()).then(data=>alert(data.msg)); } // 签到调用 function userSignIn(userId) { fetch('http://你的服务器IP:5000/api/integral/sign', { method: 'POST', headers: { 'X-User-Id': userId } }).then(res=>res.json()).then(data=>alert(data.msg)); } ```完成所有步骤后,你的商城积分体系即可稳定运行,如需调整规则直接修改接口内的对应数值即可。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图