developing
This commit is contained in:
parent
87f497a8de
commit
32fd7fdf24
|
|
@ -6,6 +6,7 @@ from flask import Flask, request, jsonify, make_response
|
|||
from flask_cors import CORS
|
||||
|
||||
from config import get_config
|
||||
from loguru import logger
|
||||
from services.order import OrderService
|
||||
from services.user import UserService
|
||||
from utils.datetime import parse_time_string, to_milliseconds
|
||||
|
|
@ -30,6 +31,9 @@ def add_cors_headers(response):
|
|||
@app.route('/createOrder', methods=['POST'])
|
||||
def create_order():
|
||||
data = request.get_json()
|
||||
name = data.get('name', None)
|
||||
phone = data.get('phone', None)
|
||||
email = data.get('email', None)
|
||||
payment_method = data.get('paymentMethod', None)
|
||||
if payment_method not in config['PaymentAddresses']:
|
||||
return jsonify({
|
||||
|
|
@ -43,9 +47,6 @@ def create_order():
|
|||
|
||||
wallet_address = data.get('wallet_address', None)
|
||||
if wallet_address is None:
|
||||
name = data.get('name', None)
|
||||
phone = data.get('phone', None)
|
||||
email = data.get('email', None)
|
||||
wallet_addresses = user_service.get_wallet_addresses(name, phone, email)
|
||||
|
||||
if not wallet_addresses:
|
||||
|
|
@ -60,7 +61,8 @@ def create_order():
|
|||
# 单个地址
|
||||
wallet_address = wallet_addresses[0]
|
||||
|
||||
order_id, create_timestamp = order_service.create_order(quant, wallet_address)
|
||||
order_id, create_timestamp = order_service.create_order(name=name, phone=phone, email=email,
|
||||
quant=quant, wallet_address=wallet_address)
|
||||
|
||||
return jsonify({"orderID": order_id,
|
||||
"amount": quant,
|
||||
|
|
@ -68,13 +70,31 @@ def create_order():
|
|||
"orderExpirationTime": config.order.lifetime}), 200
|
||||
|
||||
|
||||
@app.route('/queryOrder', methods=['POST'])
|
||||
def query_order():
|
||||
data = request.get_json()
|
||||
name = data.get('name', None)
|
||||
phone = data.get('phone', None)
|
||||
email = data.get('email', None)
|
||||
wallet_address = data.get('wallet_address', None)
|
||||
page = data.get('page', 1) # 获取页码,默认为第 1 页
|
||||
page_size = data.get('page_size', 10)
|
||||
|
||||
offset = (page - 1) * page_size
|
||||
limit = page_size
|
||||
|
||||
|
||||
orders = order_service.queryOrder(name, phone, email, wallet_address, offset, limit)
|
||||
return jsonify({"orders": orders}), 200
|
||||
|
||||
|
||||
order_status = config.order.order_status
|
||||
|
||||
|
||||
@app.route('/finishOrder', methods=['GET'])
|
||||
def finish_order():
|
||||
data = request.get_json()
|
||||
order_id = data.get('orderID', None)
|
||||
order_id = request.args.get('orderID', None)
|
||||
logger.debug(f"complete oreder: {order_id}")
|
||||
status = order_service.finish_order(order_id)
|
||||
return jsonify({"order_id": order_id,
|
||||
"status": status,
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ order:
|
|||
mysql:
|
||||
user: wystan
|
||||
password: Wystan14Brown!
|
||||
host: 100.64.0.1
|
||||
host: 100.64.0.4
|
||||
port: 3306
|
||||
database: payment
|
||||
autocommit: false
|
||||
|
|
@ -54,9 +54,6 @@ class Database:
|
|||
except db_errors.Error as e:
|
||||
logger.info(f"Database error: {e}")
|
||||
raise
|
||||
finally:
|
||||
if cursor:
|
||||
cursor.close()
|
||||
|
||||
def commit(self):
|
||||
"""Commit the current transaction."""
|
||||
|
|
|
|||
|
|
@ -84,3 +84,43 @@ class User:
|
|||
|
||||
def __hash__(self):
|
||||
return hash((self.name, self.phone, self.email, self.wallet_address, self.payment_method))
|
||||
|
||||
class Order:
|
||||
def __init__(self, id_=None, order_id=None, name=None, phone=None, email=None, quant=None, from_address=None,
|
||||
to_address=None, create_timestamp=None, update_timestamp=None, status=None):
|
||||
self.id = id_
|
||||
self.order_id = order_id
|
||||
self.name = name
|
||||
self.phone = phone
|
||||
self.email = email
|
||||
self.quant = quant
|
||||
self.from_address = from_address
|
||||
self.to_address = to_address
|
||||
self.create_timestamp = create_timestamp
|
||||
self.update_timestamp = update_timestamp
|
||||
self.status = status
|
||||
|
||||
def insert_sql(self, params_format="list"):
|
||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",",
|
||||
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email,
|
||||
quant=self.quant,
|
||||
from_address=self.from_address, to_address=self.to_address,
|
||||
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
||||
status=self.status)
|
||||
return f"INSERT INTO orders ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params
|
||||
|
||||
def select_sql(self, condition="AND", params_format="list"):
|
||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
||||
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant,
|
||||
from_address=self.from_address, to_address=self.to_address,
|
||||
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
||||
status=self.status)
|
||||
return f"SELECT id, name, phone, email, wallet_address, payment_method FROM orders WHERE {params_sql}", params
|
||||
|
||||
def exists_sql(self, condition="AND", params_format="list"):
|
||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
||||
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant,
|
||||
from_address=self.from_address, to_address=self.to_address,
|
||||
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
||||
status=self.status)
|
||||
return f"SELECT id FROM orders WHERE {params_sql} LIMIT 1", params
|
||||
|
|
@ -1,5 +1,8 @@
|
|||
import loguru
|
||||
|
||||
from custom_decorators import singleton
|
||||
from database import Database
|
||||
from loguru import logger
|
||||
from utils.datetime import current_timestamp
|
||||
|
||||
|
||||
|
|
@ -8,14 +11,16 @@ class OrderRepository:
|
|||
def __init__(self, config):
|
||||
self.db = Database(config['MYSQL'])
|
||||
|
||||
def create(self, order_id, quant, from_address, to_address):
|
||||
def create(self, order):
|
||||
timestamp = current_timestamp()
|
||||
order.create_timestamp = timestamp
|
||||
order.update_timestamp = timestamp
|
||||
sql, params = order.insert_sql()
|
||||
logger.debug(sql)
|
||||
logger.debug(params)
|
||||
try:
|
||||
self.db.execute_query(
|
||||
"INSERT INTO orders (order_id, quant, from_address, to_address, create_timestamp, update_timestamp) "
|
||||
"VALUES (%s, %s, %s, %s, %s, %s)",
|
||||
[order_id, quant, from_address, to_address, timestamp, timestamp]
|
||||
)
|
||||
cursor = self.db.execute_query(sql, params)
|
||||
cursor.close()
|
||||
self.db.commit()
|
||||
return timestamp
|
||||
except Exception:
|
||||
|
|
@ -34,7 +39,19 @@ class OrderRepository:
|
|||
raise
|
||||
|
||||
def get_order_info(self, order_id):
|
||||
self.db.execute_query("SELECT quant, from_address, to_address, create_timestamp "
|
||||
"FROM orders "
|
||||
"WHERE order_id = %s",
|
||||
[order_id])
|
||||
sql = 'SELECT quant, from_address, to_address, create_timestamp FROM orders WHERE order_id = %s'
|
||||
logger.debug(f'getting order {order_id} info')
|
||||
cursor = self.db.execute_query(sql, [order_id])
|
||||
result = cursor.fetchone()
|
||||
cursor.close()
|
||||
logger.debug(f'order {order_id} info: {result}')
|
||||
return result
|
||||
|
||||
def query(self, order, offset, limit):
|
||||
select_sql, params = order.select_sql()
|
||||
select_sql = f"{select_sql} LIMIT %s OFFSET %s"
|
||||
params = params + [limit, offset]
|
||||
cursor = self.db.execute_query(select_sql, params)
|
||||
result = cursor.fetchmany(limit)
|
||||
cursor.close()
|
||||
return result
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import uuid
|
||||
|
||||
from custom_decorators import singleton
|
||||
from models import Order
|
||||
from repositories.order import OrderRepository
|
||||
from services.payment import PaymentService
|
||||
from utils.datetime import current, current_timestamp, is_time_difference_greater_than
|
||||
|
|
@ -13,13 +14,18 @@ class OrderService:
|
|||
self.payment_service = PaymentService(config.APIKey.tronscan)
|
||||
self.order_repo = OrderRepository(config)
|
||||
|
||||
def create_order(self, quant, address):
|
||||
def queryOrder(self, name, phone, email, wallet_address, offset, limit):
|
||||
orders = self.order_repo.query(Order(name=name, phone=phone, email=email, from_address=wallet_address),
|
||||
offset, limit)
|
||||
return orders
|
||||
|
||||
def create_order(self, name, phone, email, quant, wallet_address):
|
||||
date_str = current().strftime('%Y%m%d%H%M%S')
|
||||
unique_id = str(uuid.uuid4()).split('-')[0]
|
||||
order_id = f"{date_str}-{unique_id}"
|
||||
|
||||
create_timestamp = self.order_repo.create(order_id, quant,
|
||||
address, self.config['PaymentAddresses']['usdt'])
|
||||
order = Order(order_id=order_id, name=name, phone=phone, email=email, quant=quant,
|
||||
from_address=wallet_address, to_address=self.config['PaymentAddresses']['usdt'])
|
||||
create_timestamp = self.order_repo.create(order)
|
||||
return order_id, create_timestamp
|
||||
|
||||
def finish_order(self, order_id):
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ class PaymentService:
|
|||
self.tronscan = Tronscan(api_key)
|
||||
|
||||
def check_payment(self, quant, from_address, to_address, order_create_timestamp, end_timestamp=None):
|
||||
# # 删除测试代码
|
||||
# return 1, 1
|
||||
if end_timestamp is None:
|
||||
end_timestamp = current_timestamp()
|
||||
result = self.tronscan.token_trc20_transfers(limit=100,
|
||||
|
|
|
|||
|
|
@ -14,4 +14,4 @@ class UserService:
|
|||
users = self.user_repo.get_or_create(User(name=name, phone=phone, email=email))
|
||||
addresses = set(user.address for user in users if user.address)
|
||||
return list(addresses)
|
||||
raise ValueError('A phone number, email, or address is required.')
|
||||
return []
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ def is_time_difference_greater_than(timestamp1, timestamp2, hours=0, minutes=0,
|
|||
bool: 如果时间差大于指定的小时、分钟和秒数返回True,否则返回False
|
||||
"""
|
||||
# 将时间戳转换为 datetime 对象
|
||||
time1 = datetime.fromtimestamp(timestamp1) / 1000.0
|
||||
time2 = datetime.fromtimestamp(timestamp2) / 1000.0
|
||||
time1 = datetime.datetime.fromtimestamp(timestamp1 / 1000.0)
|
||||
time2 = datetime.datetime.fromtimestamp(timestamp2 / 1000.0)
|
||||
|
||||
# 计算时间差
|
||||
time_difference = abs(time2 - time1)
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
.el-card[data-v-0f66bda2] .el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color)}.description[data-v-0f66bda2]{margin-bottom:15px;padding:10px 20px 12px;color:#0d236d;-webkit-text-size-adjust:none;background:rgba(52,100,255,.1);border:1px solid rgba(52,100,255,.3);font:12px Microsoft YaHei,Arial}.description p.title[data-v-0f66bda2]{line-height:30px}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,17 @@
|
|||
.custom-alert {
|
||||
display: none;
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
color: white;
|
||||
padding: 15px 30px;
|
||||
border-radius: 5px;
|
||||
font-size: 16px;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||
z-index: 1000;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease-in-out;
|
||||
text-align: center;
|
||||
}
|
||||
|
|
@ -6,8 +6,10 @@
|
|||
<title>Recharge Page</title>
|
||||
<link href="/css/modules.fdcec670.css" rel="stylesheet"/>
|
||||
<link rel="stylesheet" href="/css/styles.css"/>
|
||||
<link rel="preload" href="/index.js" as="script">
|
||||
<script src="/index.js"></script>
|
||||
<link rel="stylesheet" href="/css/customAlert.css"/>
|
||||
<link rel="preload" href="/js/index.js" as="script">
|
||||
<script src="/js/index.js"></script>
|
||||
<script src="/js/customAlert.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
|
|
@ -115,7 +117,8 @@
|
|||
<label for="wallet">Wallet address:</label>
|
||||
<input type="text" id="wallet" placeholder="Enter your wallet address.">
|
||||
</div>
|
||||
<button type="button" onclick="handleSubmit()">Gain Points Now!!!</button>
|
||||
<button type="button" onclick="handleSubmit()" id="createOrder" style="background-color: orange;">Gain Points Now!!!</button>
|
||||
<button type="button" onclick="handleQuery()" style="margin-top: 1vh;">Query My Order</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
|
@ -149,6 +152,16 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="alertModal" class="modal" style="display: none;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header" id="alertMessage">
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button onclick="closeAlertModal()">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="customAlert" class="custom-alert"></div>
|
||||
<script>
|
||||
function copyText(text) {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
|
|
|
|||
|
|
@ -1,177 +0,0 @@
|
|||
<html lang="en" class=" ">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<title>余额充值 - API管理平台</title>
|
||||
<link href="/css/modules.fdcec670.css" rel="stylesheet" />
|
||||
<link href="/css/app.f2b97341.css" rel="stylesheet" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/admin-system-adminMoneyRecharge.5cf4644c.css"
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css"/>
|
||||
<link rel="preload" href="/index.js" as="script">
|
||||
</head>
|
||||
|
||||
<body inmaintabuse="1" data-layout="default">
|
||||
<div id="app" class="aminui" data-v-app="">
|
||||
<section class="aminui-wrapper">
|
||||
<div class="aminui-body el-container">
|
||||
<div class="adminui-main" id="adminui-main">
|
||||
<main class="el-main" data-v-0f66bda2="">
|
||||
<div class="el-card is-always-shadow" data-v-0f66bda2="">
|
||||
<div class="el-card__header">
|
||||
<div class="card-header" data-v-0f66bda2="">
|
||||
<span data-v-0f66bda2="">充值</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-card__body" style="">
|
||||
<div class="el-scrollbar table-form-scrollbar" data-v-0f66bda2="">
|
||||
<div class="el-scrollbar__wrap el-scrollbar__wrap--hidden-default">
|
||||
<div class="el-scrollbar__view" style="">
|
||||
<div data-v-0f66bda2="">
|
||||
<section class="description" data-v-0f66bda2="">
|
||||
<p class="title" data-v-0f66bda2="">温馨提示:</p>
|
||||
<p data-v-0f66bda2="">
|
||||
1、目前仅支持USDT充值,充值的金额不支持提现
|
||||
</p>
|
||||
<p data-v-0f66bda2="">
|
||||
2、金额会在支付后1分钟内到账,如果5分钟未到账请联系客服
|
||||
</p>
|
||||
<p data-v-0f66bda2="" style="color: red">
|
||||
3、实际转账金额必须与支付页面显示金额一致,否则无法到账
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
|
||||
<label id="el-id-7163-5" for="el-id-7163-12" class="el-form-item__label">Payment method:</label>
|
||||
<div class="el-form-item__content">
|
||||
<i class="el-icon"
|
||||
data-v-0f66bda2=""
|
||||
style="font-size: 30px">
|
||||
<svg
|
||||
t="1693061019040"
|
||||
class="icon"
|
||||
viewBox="0 0 1024 1024"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="4072"
|
||||
width="200"
|
||||
height="200"
|
||||
data-v-0f66bda2="">
|
||||
<path
|
||||
d="M1023.082985 511.821692c0 281.370746-228.08199 509.452736-509.452736 509.452736-281.360557 0-509.452736-228.08199-509.452737-509.452736 0-281.365652 228.092179-509.452736 509.452737-509.452737 281.370746 0 509.452736 228.087085 509.452736 509.452737"
|
||||
fill="#1BA27A"
|
||||
p-id="4073"></path>
|
||||
<path
|
||||
d="M752.731701 259.265592h-482.400796v116.460896h182.969951v171.176119h116.460895v-171.176119h182.96995z"
|
||||
fill="#FFFFFF"
|
||||
p-id="4074"></path>
|
||||
<path
|
||||
d="M512.636816 565.13592c-151.358408 0-274.070289-23.954468-274.070289-53.50782 0-29.548259 122.706786-53.507821 274.070289-53.507821 151.358408 0 274.065194 23.959562 274.065194 53.507821 0 29.553353-122.706786 53.507821-274.065194 53.50782m307.734925-44.587303c0-38.107065-137.776398-68.995184-307.734925-68.995184-169.953433 0-307.74002 30.888119-307.74002 68.995184 0 33.557652 106.837333 61.516418 248.409154 67.711363v245.729433h116.450707v-245.632637c142.66205-6.001353 250.615085-34.077294 250.615084-67.808159"
|
||||
fill="#FFFFFF"
|
||||
p-id="4075"></path>
|
||||
</svg>
|
||||
</i>
|
||||
<div data-v-0f66bda2="" style="margin-left: 20px">
|
||||
<div class="el-radio-group" role="radiogroup" aria-labelledby="el-id-7163-5" data-v-0f66bda2="" id="el-id-7163-12">
|
||||
<label class="el-radio is-bordered is-checked el-radio--default" data-v-0f66bda2="">
|
||||
<span class="el-radio__input is-checked">
|
||||
<input class="el-radio__original" name="el-id-7163-6" type="radio" value="30" onclick="setAmountValue(this.value)"/>
|
||||
<span class="el-radio__inner"></span>
|
||||
</span>
|
||||
<span class="el-radio__label">30$</span>
|
||||
</label>
|
||||
<label class="el-radio is-bordered el-radio--default" data-v-0f66bda2="">
|
||||
<span class="el-radio__input">
|
||||
<input class="el-radio__original" name="el-id-7163-6" type="radio" value="90" onclick="setAmountValue(this.value)"/>
|
||||
<span class="el-radio__inner"></span>
|
||||
</span>
|
||||
<span class="el-radio__label">90$</span>
|
||||
</label>
|
||||
<label class="el-radio is-bordered el-radio--default" data-v-0f66bda2="">
|
||||
<span class="el-radio__input">
|
||||
<input class="el-radio__original" name="el-id-7163-6" type="radio" value="150" onclick="setAmountValue(this.value)"/>
|
||||
<span class="el-radio__inner"></span>
|
||||
</span>
|
||||
<span class="el-radio__label">150$</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
|
||||
<label id="amount_label" for="amount_input" class="el-form-item__label">Amount:</label>
|
||||
<div class="el-form-item__content">
|
||||
<div class="el-input el-input--default" data-v-0f66bda2="" style="width: 7em">
|
||||
<div class="el-input__wrapper">
|
||||
<input class="el-input__inner" type="number" min="30" step="any" autocomplete="off" tabindex="0"
|
||||
id="amount_input" value="30"/>
|
||||
</div>
|
||||
</div>(USDT)
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
|
||||
<label id="name_label" for="name_input" class="el-form-item__label">Name:</label>
|
||||
<div class="el-form-item__content">
|
||||
<div class="el-input el-input--default" data-xv-0f66bda2="">
|
||||
<div class="el-input__wrapper">
|
||||
<input class="el-input__inner" type="text" autocomplete="off" tabindex="0" placeholder="Please enter your Nickname." id="name_input"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
|
||||
<label id="phone_label" for="phone_input" class="el-form-item__label">Phone:</label>
|
||||
<div class="el-form-item__content">
|
||||
<div class="el-input el-input--default" data-v-0f66bda2="">
|
||||
<div class="el-input__wrapper">
|
||||
<input class="el-input__inner" type="tel" autocomplete="off" tabindex="0" placeholder="Please enter your phone number." id="phone_input"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
|
||||
<label id="email_label" for="email_input" class="el-form-item__label">Email:</label>
|
||||
<div class="el-form-item__content">
|
||||
<div class="el-input el-input--default" data-v-0f66bda2="">
|
||||
<div class="el-input__wrapper">
|
||||
<input class="el-input__inner" type="email" autocomplete="off" tabindex="0" placeholder="Please enter your email." id="email_input"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
|
||||
<label id="address_label" for="address_input" class="el-form-item__label">Wallet address:</label>
|
||||
<div class="el-form-item__content">
|
||||
<div class="el-input el-input--default" data-v-0f66bda2="">
|
||||
<div class="el-input__wrapper">
|
||||
<input class="el-input__inner" type="text" autocomplete="off" tabindex="0" placeholder="Please enter your wallet address." id="address_input"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="el-button el-button--primary el-button--default" type="button" data-v-0f66bda2="" onclick="handleSubmit()">
|
||||
<span class="">Gain Points Now!!!</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-scrollbar__bar is-horizontal" style="display: none">
|
||||
<div class="el-scrollbar__thumb" style="transform: translateX(0%)"></div>
|
||||
</div>
|
||||
<div class="el-scrollbar__bar is-vertical" style="display: none">
|
||||
<div class="el-scrollbar__thumb" style="transform: translateY(0%)"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-overlay" style="z-index: 2002; display: none">
|
||||
<div role="dialog" aria-modal="true" aria-label="支付" aria-describedby="el-id-7163-9" class="el-overlay-dialog"></div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
function showCustomAlert(message) {
|
||||
const alertBox = document.getElementById('customAlert');
|
||||
alertBox.textContent = message;
|
||||
alertBox.style.display = 'block';
|
||||
alertBox.style.opacity = '1';
|
||||
|
||||
// 3秒后隐藏弹窗
|
||||
setTimeout(() => {
|
||||
alertBox.style.opacity = '0';
|
||||
// 等到过渡效果结束再隐藏元素
|
||||
setTimeout(() => {
|
||||
alertBox.style.display = 'none';
|
||||
}, 300); // 与过渡时间一致
|
||||
}, 3000);
|
||||
}
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
const apiBaseUrl = 'http://127.0.0.1:5000'
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const options = document.querySelectorAll('.el-radio');
|
||||
options.forEach(option => {
|
||||
|
|
@ -37,37 +39,9 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||
// Close modal when clicking outside the modal content
|
||||
document.getElementById('addressModal').addEventListener('click', closeModalOnClickOutside);
|
||||
document.getElementById('paymentModal').addEventListener('click', closeModalOnClickOutside);
|
||||
document.getElementById('alertModal').addEventListener('click', closeModalOnClickOutside);
|
||||
});
|
||||
|
||||
function finishOrder() {
|
||||
const orderID = localStorage.getItem('currentOrderID'); // 获取订单 ID
|
||||
if (!orderID) {
|
||||
console.error('Order ID is not available.');
|
||||
handleError('Order ID is not available. Please create an order first.');
|
||||
return;
|
||||
}
|
||||
|
||||
const url = `http://127.0.0.1:5000/finishOrder?orderID=${orderID}`;
|
||||
|
||||
return fetch(url, {
|
||||
method: 'GET'
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error(`Network response was not ok: ${response.statusText}`);
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
console.log('Response data:', data);
|
||||
return data;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('There was a problem with the GET request:', error);
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function handleOrderSuccess(orderId, amount, orderCreateTimestamp, orderExpirationTime) {
|
||||
openPaymentModal(orderId, amount, orderCreateTimestamp, orderExpirationTime);
|
||||
|
|
@ -77,7 +51,7 @@ function handleOrderSuccess(orderId, amount, orderCreateTimestamp, orderExpirati
|
|||
function handleMultipleAddresses(walletAddresses) {
|
||||
// Find the modal and the modal body
|
||||
const addressList = document.getElementById('addressList');
|
||||
addressList.innerHTML = ''; // 清空当前内容
|
||||
addressList.innerHTML = '';
|
||||
|
||||
// Create a list of wallet addresses
|
||||
walletAddresses.forEach(address => {
|
||||
|
|
@ -137,6 +111,18 @@ function openAddressModal() {
|
|||
|
||||
function closeAddressModal() {
|
||||
document.getElementById('addressModal').style.display = 'none';
|
||||
const addressList = document.getElementById('addressList');
|
||||
addressList.innerHTML = '';
|
||||
}
|
||||
|
||||
function openAlertModal() {
|
||||
document.getElementById('alertModal').style.display = 'flex';
|
||||
}
|
||||
|
||||
function closeAlertModal() {
|
||||
document.getElementById('alertModal').style.display = 'none';
|
||||
const alertElement = document.getElementById("alertMessage")
|
||||
alertElement.innerText = "";
|
||||
}
|
||||
|
||||
function closeModalOnClickOutside(event) {
|
||||
|
|
@ -168,7 +154,7 @@ function promptUserForAddress() {
|
|||
|
||||
async function createOrder(amount, name, phone, email, wallet_address, paymentMethod) {
|
||||
try {
|
||||
const response = await fetch('http://127.0.0.1:5000/createOrder', {
|
||||
const response = await fetch(`${apiBaseUrl}/createOrder`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
|
|
@ -214,3 +200,60 @@ function handleSubmit() {
|
|||
// 调用createOrder函数
|
||||
createOrder(amount, name, phone, email, payment_address, "USDT");
|
||||
}
|
||||
|
||||
function finishOrder() {
|
||||
const orderID = localStorage.getItem('currentOrderID'); // 获取订单 ID
|
||||
if (!orderID) {
|
||||
console.error('Order ID is not available.');
|
||||
handleError('Order ID is not available. Please create an order first.');
|
||||
return;
|
||||
}
|
||||
|
||||
const url = `${apiBaseUrl}/finishOrder?orderID=${orderID}`;
|
||||
|
||||
return fetch(url, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error(`Network response was not ok: ${response.statusText}`);
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
if (data.status === 0) {
|
||||
// 订单超时, 联系客服
|
||||
const alertElement = document.getElementById("alertMessage")
|
||||
alertElement.innerText = "<h2>The order has timed out. Please contact customer support if you have any questions.</h2>";
|
||||
openAlertModal();
|
||||
} else if (data.status === 1) {
|
||||
const createOrderElement = document.getElementById('createOrder');
|
||||
createOrderElement.textContent = 'Gain More Points!!!';
|
||||
} else if (data.status === 3) {
|
||||
const alertElement = document.getElementById("alertMessage")
|
||||
alertElement.innerText = "<h2>The payment amount is abnormal. Please contact customer support if you have any questions.</h2>";
|
||||
openAlertModal();
|
||||
}
|
||||
return data;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('There was a problem with the GET request:', error);
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
function handleQuery() {
|
||||
const name = document.getElementById('nickname').value.trim();
|
||||
const phone = document.getElementById('phone').value.trim();
|
||||
const email = document.getElementById('email').value.trim();
|
||||
const payment_address = document.getElementById('wallet').value.trim();
|
||||
|
||||
// 清除之前的消息
|
||||
// document.getElementById('message').classList.add('hidden');
|
||||
|
||||
// 调用createOrder函数
|
||||
queryOrder(name, phone, email, payment_address);
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
"name": "payment_headend",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"main": "js/index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in New Issue