当前位置:网站首页 >  教程

从零搭建商城积分体系:可直接落地的实操全流程指南

时间:2026年05月31日 21:04:37 来源:易频IT社区

商城积分体系实操落地全流程

本文所有步骤均可直接复制执行,无额外依赖要求,全程无需复杂配置。

一、明确积分核心规则(硬性落地规则)

  • 消费规则:每消费1元(实付,不含优惠券、运费)累计1积分,单笔订单最高积100分
  • 签到规则:每日签到得5分,连续7天额外加10分,每月最多得200签到分
  • 兑换规则:积分100:1兑换商城通用抵扣券,积分不足时无法发起兑换
  • 过期规则:积分有效期1年,每年12月31日自动清零当年1月1日之前获得的积分

二、创建数据库表(复制SQL直接执行)

提前启动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账号拥有建表权限,所有字段无需修改直接执行即可。

三、开发核心后端接口(Python+Flask,复制代码直接用)

提前安装依赖:```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]核心修改:将DB_CONFIG中的password替换为你的MySQL密码,database替换为你创建的数据库名;启动方式:执行```python app.py```,服务默认运行在5000端口。

四、前端调用示例(通用原生JS)

以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)); } ```

五、日常运维必做步骤

  • 每天执行一次积分过期清理:用MySQL事件或Linux定时任务执行SQL,删除已过期的积分明细并同步扣减可用积分:
    ```UPDATE user_integral ui JOIN integral_detail id ON ui.user_id=id.user_id SET ui.available_integral=ui.available_integral - id.amount WHERE id.expire_time < NOW() AND id.type IN (1,2)```
  • 每周导出积分明细,核对消费、签到、兑换的积分数据一致性
  • 每月过滤接口日志,拦截重复调用同一订单积分接口的非法请求

完成所有步骤后,你的商城积分体系即可稳定运行,如需调整规则直接修改接口内的对应数值即可。

相关推荐

最新

热门

推荐

精选

标签

易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。

Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图